Рестлет не публикуется
Я пытаюсь сделать простой пост в Restlet.
Происходит то, что я нажимаю на ссылку, которая отображается в моем index.html, и когда я перехожу к выводу моего сервера, он показывает, что я нажимаю на URL-адреса, но он никогда не входит в мой метод @Post. Кажется, я правильно следую инструкциям, но здесь явно что-то не так.
Если я изменю вещи, чтобы получить вместо почты, я могу использовать их в URL, и это работает просто отлично. Но я бы очень хотел посылать вещи по почте, а не получать.
Как сделать так, чтобы Restlet подавался в мою почтовую процедуру?
Обновление 1:
Поскольку данные, которые я передаю для параметров, являются объектом json, я попытался изменить @Post
в @Post("json")
но это ничего не изменило...
Ниже дамп кода соответствующих частей, так как я уверен, что хотя бы один из них будет интересен. Я буду отслеживать это для последующих вопросов. Спасибо!
Начать дамп кода:
Вот мой "index.html", бесстыдно адаптированный из руководства по jquery (чтобы дать представление о моем опыте работы с JavaScript).
<html>
<head>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript">
function doit() {
$(document).ready(function() {
$.post(
"http://localhost:15627/system/create",
{ key: "something here", auth: "happy", name: "The name" },
function(data) {
alert("Response: " + data);
}
);
});
}
</script>
</head>
<body>
<a href="javascript:doit()">Link</a>
</body>
</html>
Теперь в моем Java-рестлете у меня очень простая настройка
public static void main(String[] args) throws Exception {
Component component = new Component();
component.getServers().add(Protocol.HTTP, 15627);
startDatabase();
Application main = new Main();
component.getDefaultHost().attachDefault(main);
component.start();
}
private Engine engine;
public Main() {
this.engine = new Engine();
}
И мой входящий корень
public Restlet createInboundRoot() {
// Create a root router
Router router = new Router(getContext());
router.attach("/system/knock", new Knock(engine));
router.attach("/system/create", new CreatePlayer(engine));
return router;
}
И моя рутина создания игрока
@Post
public Representation create(Representation rep) {
Representation response = null;
Form form = new Form(rep);
String key = form.getFirstValue("key");
String auth = form.getFirstValue("auth");
String name = form.getFirstValue("name");
System.out.println("Creating " + key + " " + auth + " " + name);
String result = engine.create(key,auth,name);
response = new StringRepresentation(result,MediaType.TEXT_PLAIN);
return response;
}
Результат звонка
Oct 12, 2011 3:32:23 PM org.restlet.engine.log.LogFilter afterHandle
INFO: 2011-10-12 15:32:23 127.0.0.1 - - 15627 OPTIONS /system/create - 200 0 0 0 http://localhost:15627 Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.2) Gecko/20100115 Firefox/3.6 (.NET CLR 3.5.30729) -
Керлинг ( следуйте советам, найденным здесь. Рестлет POST с использованием JSON
C:\programs\curl>curl -X POST localhost:15627/system/create -H "Content-Type: ap
plication/json" -d '{"key" : "something", "auth" : "happy", "name" : "The name"}
'
curl: (7) couldn't connect to host
curl: (6) Could not resolve host: something,; Host not found
curl: (6) Could not resolve host: auth; Host not found
curl: (7) couldn't connect to host
curl: (6) Could not resolve host: happy,; Host not found
curl: (6) Could not resolve host: name; Host not found
curl: (7) couldn't connect to host
curl: (3) [globbing] unmatched close brace/bracket at pos 9
C:\programs\curl>
И вывод рестлета из локона
Oct 12, 2011 3:43:47 PM org.restlet.engine.log.LogFilter afterHandle
INFO: 2011-10-12 15:43:47 127.0.0.1 - - 15627 POST /system/create - 200 0 5 0 http://localhost:15627 curl/7.22.0 (i386-pc-win32) libcurl/7.22.0 OpenSSL/0.9.8r zlib/1.2.5 -
Обновление 2:
Я добавил handle(Request req, Response res)
метод и который в настоящее время отвечает как получает и сообщения, когда я пытаюсь свернуться. В любом случае он не может извлечь какие-либо данные, связанные с ним.
2 ответа
Так что я получил его на работу. Вместо использования Restlet мне нужно было использовать ServerResource. Вот мое решение
public class CreatePlayer extends ServerResource {
private Engine engine;
public CreatePlayer() {
this(Main.getEngine());
}
public CreatePlayer(Engine engine) {
this.engine = engine;
}
@Post
public Representation create(Representation rep) {
System.err.println("Inside create");
Form form = new Form(rep);
String key = form.getFirstValue("key");
String auth = form.getFirstValue("auth");
String name = form.getFirstValue("name");
System.err.println("Creating " + key + " " + auth + " " + name);
String result = engine.create(key,auth,name);
return new StringRepresentation(result,MediaType.TEXT_PLAIN);
}
}
И мой новый входящий корень:
public Restlet createInboundRoot() {
// Create a root router
Router router = new Router(getContext());
router.attach("/homage/knock", Knock.class);
router.attach("/homage/create", CreatePlayer.class);
return router;
}
обновление 3:
Чтобы проверить это, я переключился с jquery и curl и пошел с тестовым драйвером java. Когда я это делаю, я могу получить все, кроме того, что мой драйвер по какой-либо причине не может принимать несколько значений. Так что если я сделаю name=foo&auth=happy" it gives me a variable
названиеand a value of
Foo& AUTH =happy`. Так что это, очевидно, артефакт моего водителя, который не публикует должным образом, что достаточно для меня. Я уверен, что передняя сторона вещей сможет сделать правильно отформатированный пост. Если все остальное терпит неудачу, я могу взломать это, чтобы поместить любые переменные, которые мне нужны, в одну и разделить ее Менее желательно, но это будет работать на данный момент.
Я ценю всю помощь, ребята!
Несколько вещей: Ваш тип контента - JSON, но на сервере вы пытаетесь создать представление формы. Для этого вам нужно использовать класс JSONRepresentation, инициализируя rep
аргумент @Post
функция
Почему вы получаете ответ 200 согласно журналу Restlet: Возможно, потому что все значения формы пустые / нулевые, и может случиться так, что ваш Create Player работает с нулевыми значениями - проверьте это, и вы увидите, что это может быть так,
Да, @Post("json")
это хорошо, но бесполезно, если вы не обрабатываете входящее представление как JSON...
Что неизвестно: вы даже получаете какой-либо ответ в своем оповещении? Какое значение возвращается? не определено??
Просто для вашей пользы попробуйте использовать $.ajax
и сделайте вещи явными, и вы, вероятно, поймете, где вы можете колебаться, иногда короткое замыкание замыкает некоторые ошибки... как только вы освоите это, это поможет использовать короткие руки. Я, например, никогда не был в состоянии правильно обозначить стенографию и больше, поэтому я предпочитаю единообразие в коде - нет $.delete
или же $.put
так что я просто использую $.ajax
(Это только для информации, ничего общего с проблемой...)
Попробуйте это и посмотрите, работает ли это...