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

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

1 голос
/ 13 октября 2011

Я пытаюсь сделать простой пост в 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 ]

2 голосов
/ 13 октября 2011

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

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

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

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

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

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

0 голосов
/ 13 октября 2011

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

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

...