我正在尝试在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)
方法,当我尝试卷曲时,它正在响应获取和发布。在任何一种情况下,它都无法提取任何与之相关的数据。
答案 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`。所以这显然是我的司机没有正确发布的神器,这对我来说已经足够了。我相信事物的前端方面能够制作格式正确的帖子。如果所有其他方法都失败了,我可以破解它将我需要的任何变量放入一个并将其拆分。不太理想,但现在可以使用。
我感谢所有的帮助,伙计们!