Restlet没有张贴

时间:2011-10-12 21:21:58

标签: jquery post restlet

我正在尝试在Restlet中做一个简单的帖子。

正在发生的事情是我点击了我的index.html中显示的链接,当我转到我的服务器输出时,它显示我正在点击网址,但它从未进入我的@Post方法。我似乎正在正确地遵循教程,但显然这里有些不妥。

如果我改变了东西而不是发布,我可以在URL中使用它们,它可以正常工作。但我真的很喜欢通过邮寄而不是获取。

如何将Restlet Feed添加到我的后期程序中?

更新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 restlet中,我有一个非常简单的设置

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)   -

冰壶(遵循此处的建议Restlet POST using 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 个答案:

答案 0 :(得分:2)

一些事项:您的Content-type是JSON,但在服务器上,您正尝试创建表单表示。您需要通过使用rep函数的@Post参数进行初始化来使用JSONRepresentation类

为什么你根据Restlet日志获得200响应:可能是因为所有表单值都为空/ null并且可能是你的创建播放器使用空值 - 检查它并且你会看到它可能是这样的。

是的,@Post("json")很好,但如果您没有将传入的表示处理为JSON,则没有用...

什么是未知的:您是否在警报中得到任何回复?返回的价值是多少?未定义??

为了您的利益,尝试使用$.ajax并明确表达,您可能会意识到您可能会步履蹒跚,有时候速记会将某些错误短路......一旦您擅长它,它就会帮助使用短手。我一个人从来没有能够正确地考虑速记,所以我更喜欢统一代码 - 没有$.delete$.put所以我只使用$.ajax(这仅用于信息,与问题无关......)

试试这些,看看它是否有效......

答案 1 :(得分:0)

所以我最终得到了它的工作。我不需要使用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&amp; auth = happy`。所以这显然是我的司机没有正确发布的神器,这对我来说已经足够了。我相信事物的前端方面能够制作格式正确的帖子。如果所有其他方法都失败了,我可以破解它将我需要的任何变量放入一个并将其拆分。不太理想,但现在可以使用。

我感谢所有的帮助,伙计们!