Рестлет не публикуется

Я пытаюсь сделать простой пост в 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 ofFoo& AUTH =happy`. Так что это, очевидно, артефакт моего водителя, который не публикует должным образом, что достаточно для меня. Я уверен, что передняя сторона вещей сможет сделать правильно отформатированный пост. Если все остальное терпит неудачу, я могу взломать это, чтобы поместить любые переменные, которые мне нужны, в одну и разделить ее Менее желательно, но это будет работать на данный момент.

Я ценю всю помощь, ребята!

Несколько вещей: Ваш тип контента - JSON, но на сервере вы пытаетесь создать представление формы. Для этого вам нужно использовать класс JSONRepresentation, инициализируя rep аргумент @Post функция

Почему вы получаете ответ 200 согласно журналу Restlet: Возможно, потому что все значения формы пустые / нулевые, и может случиться так, что ваш Create Player работает с нулевыми значениями - проверьте это, и вы увидите, что это может быть так,

Да, @Post("json") это хорошо, но бесполезно, если вы не обрабатываете входящее представление как JSON...

Что неизвестно: вы даже получаете какой-либо ответ в своем оповещении? Какое значение возвращается? не определено??

Просто для вашей пользы попробуйте использовать $.ajax и сделайте вещи явными, и вы, вероятно, поймете, где вы можете колебаться, иногда короткое замыкание замыкает некоторые ошибки... как только вы освоите это, это поможет использовать короткие руки. Я, например, никогда не был в состоянии правильно обозначить стенографию и больше, поэтому я предпочитаю единообразие в коде - нет $.delete или же $.put так что я просто использую $.ajax (Это только для информации, ничего общего с проблемой...)

Попробуйте это и посмотрите, работает ли это...

Другие вопросы по тегам