post - Restlet未发布

  显示原文与译文双语对照的内容
0 0

我试图在Restlet中做一个简单的文章。

我在点击 index.html 中显示的链接,当我转到服务器输出时,它显示我在输入 @Post 方法。 我似乎正确地遵循了教程,但显然这里有些错误。

如果我把事情改变为,而不是 post,我可以在URL中使用它,而且它只是。 但我真的想通过邮寄而不是 get 。

我如何在post过程中创建Restlet提要?

更新 1:

因为我传入参数的数据是一个json对象,所以我尝试将 @Post 改为 @Post("json"),但它没有发生任何改变。

以下是相关部分的代码转储,因为我肯定至少有一个会感兴趣。 我将追踪跟踪问题。 谢谢!

开始代码转储:

下面是我的"index.html",来自jquery教程( 为我的javascript体验提供一个指示器)的shameless adapated 。


<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();
}

我的入站 root


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;
}

我的create


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

curl ( 以下建议发现 Restlet POST使用 JSON


C:programscurl>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:programscurl>

来自curl的restlet输出


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) 方法,当我尝试curl时,它将同时响应获取和发布。 无论哪种情况,它都无法提取与之关联的任何数据。

时间: 原作者:

0 0

一些事情:Content-Type 是 JSON,但是在你试图创建表单表达的服务器上。 你需要使用JSONRepresentation类,方法是使用 @Post 函数的rep 参数初始化

为什么要根据Restlet日志获得 200响应: 可以能是因为所有表单值都是空/null,并且你的创建播放器使用空值。

如果你不将传入表示作为json处理,则 @Post("json") 是好的,但没有使用。

不知道:你在通知中是否收到任何回应? 返回的值是什么? 没有定义?

只是为了利用 $.ajax,并且使事情明确,并且可以能会发现在某些情况下,shorthand 短路有些错误。 因为我们在使用 shorthand的时候从来都不能够正确地考虑代码,所以我更喜欢代码的一致性( 这只是为了信息,所以我只使用了 $.ajax ) - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

试试这些,看看是否能正常工作。

原作者:
0 0

所以我把它work了。 我需要使用 ServerResource,而不是使用 Restlet 。 这是我的解决方案


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

}

和我的新入站 root:


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 这显然是我的驱动没有正确发布的原因,这对我来说很好。 我相信,事物的前端是能够做出正确格式化的邮件。 如果其他的都失败了,我可以把我需要的变量放到一个变量中,然后把它分解。 不太理想,但现在可以。

我非常感谢你的帮助 !

原作者:
...