如何实现接受 JSON 帖子的 Restlet 函数?以及如何使用 curl 进行测试?
谢谢
使用 Restlet 2,您可以:
测试实体媒体类型的兼容性@Post acceptRepresentation(Representation entity)
:
@Post public Representation acceptRepresentation(Representation entity) throws ResourceException { if (entity.getMediaType().isCompatible(MediaType.APPLICATION_JSON)) { // ... } // ... }
或@Post
与一个或两个参数一起使用:
@Post("json") 表示 acceptAndReturnJson(Representation entity) { // ... }
请参阅以下链接:
(使用 Restlet 1,您需要测试实体的类型。)
在撰写此回复时(在您提出问题 2 年后),Restlet 2.1 需要满足适当的依赖关系才能正确使用 JSON 并做出响应。关键是,除了“ Unsupported media type
”响应之外,对于内部发生的事情没有太多线索。
要激活 JSON 媒体类型,您需要包含对org.restlet.ext.jackson
; 如果您需要同时支持 XML 和 JSON,则需要先包含 Jackson FIRST 然后org.restlet.ext.xstream
,因为 XStream 也能够表示 JSON,但实现相当差(如 restlet 文档中所述,这是 restlet 作者推荐的顺序)。
然后,您实际上不需要在注释中包含媒体类型,您只需要Content-Type
在您的 curl 请求中包含正确的标头,即:
curl -X post -H "Content-Type: application/json" http://localhost:8080/login -d @login.json
login.json
包含实际的 JSON 请求。@Post
注释的方法,都支持 XML 和 JSON 媒体类型LoginRequest
LoginResponse
我希望,这个答案会在某个时候对某人有所帮助。:-)
Daniel Vassallo 链接的示例显示了使用表单发布的数据。这是发送 JSON 的方法:
@Post
public void acceptJsonRepresentation(JsonRepresentation entity) {
JSONObject json = null;
try {
json = entity.getJsonObject();
// business logic and persistence
} catch (JSONException e) {
setStatus(Status.CLIENT_ERROR_BAD_REQUEST);
return;
}
}
使用 curl 进行测试:
curl -X POST <your url> -H "Content-Type: application/json" -d '{"key" : "value"}'
curl 命令中数据周围的单引号 ('') 很重要。
以下是关于这个老问题的一些更新。Restlet 支持包含 bean 的方法签名。在这种情况下,Restlet 将使用已注册的转换器尝试将接收到的有效负载转换/填充到 bean 实例中。在向客户端发送内容时也是如此。
以下是处理请求的方法示例POST
:
public class TestServerResource extends ServerResource {
@Post
public void test(TestBean bean) {
System.out.println(">> bean = " + bean.getMessage());
}
}
bean 可以简单地具有以下结构:
public class TestBean {
private String name;
private String message;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}
要使这种机制起作用,您只需org.restlet.ext.jackson
在类路径中添加扩展名 Jackson ( )。相应的转换器将在后台自动注册。
curl请求很简单,需要指定发送的数据
curl -X POST http://... -H "Content-Type: application/json" -d '{"name" : "myname","description":"my description"}'
希望它可以帮助你,蒂埃里
这是一个通过 POST 接受 JSON 的 Restlet 的完整示例:
以及如何使用 cURL 测试 RESTful Web 服务的基本指南:
curl -u uid:4c521655 -X POST -H "Content-Type: application/json" -d "type=Big&data="{\"name\":\"test\"}"" --dump-header headers 'http://localhost:8190/appli/add'