我正在使用Jersey开发RESTful服务,它可以很好地使用GET方法 . 但是我无法使用POST方法和JSON或文本参数 . 这些是我做的:
@Path("/method/")
@POST
@Consumes({MediaType.APPLICATION_JSON, MediaType.TEXT_PLAIN})
@Produces({MediaType.APPLICATION_JSON})
public ResponseObject method(@Context Request request, @PathParam("ob1") Object obj1, @PathParam("obj2") String obj2) {
...
}
我只获得所有参数的空值 . 我试图只使用一个字符串作为参数,它也不起作用...我试图从IOS访问这些方法,也许这是问题之一 . 但是我一直在嗅探我的局域网,我可以看到数据包正文中的正确参数......这是正确的吗?
我从XCode发送了不同的主体内容:
obj1={"id1": "value1", "id2" : "value2"}&obj2=xxxx
和:
{"id1": "value1", "id2" : "value2"},xxxx
虽然我一直在玩@QueryParam和@PathParam没有结果......总是空...
谢谢你的帮助!
4 回答
路径参数是与特定模式匹配的请求URL的一部分 . 因此,对于可以指定为路径参数的内容存在字符限制 - 特别是任何特殊字符都需要进行URL编码 . 这适用于任何类型的请求(GET,POST,PUT,DELETE) .
作为一般规则,您应该将路径参数限制为简单值(如标识符或资源 endpoints ) - 应通过请求参数或请求正文本身将更复杂的数据传递给REST服务 . 这是一种混合方法,它将实体标识符作为路径参数传递,并将实体数据传递给请求体:
在上面的示例中,获取contactId作为路径参数,并从请求正文自动序列化联系人 .
我上面描述的是 general 规则 . 现在关于你的情况的具体情况,我在你的代码中注意到的一件事是你实际上没有定义任何路径参数 . 请记住,在使用REST方法之前,必须将它们定义为
@Path
注释的一部分:通过上述更改,假设您已在客户端对URL进行了正确编码,则参数不应再显示为null .
*** EDIT ***
根据您的评论,我发现您需要更熟悉JAX-RS规范和各种参数类型 . 我建议阅读RESTEasy JAX-RS Documentation . 它有一些供应商特定的实现细节,但总的来说是JAX-RS的优秀指南 .
@PathParam
Purpose :用于将请求URL的一部分注入变量 . 请注意,URL参数不被视为URL的一部分 .
Example :给定URL http://services.example.com/contacts/20578,我可以定义:
我可以从中注入
@PathParam("id")
.这适用于任何类型的HTTP请求(GET,POST,PUT,DELETE) .
@QueryParam
Purpose :用于将一部分查询字符串或编码数据注入变量 . 查询字符串是
?
之后的URL部分 . 当请求类型为application / x-www-form-urlencoded时,表单编码数据是在HTTP请求正文中传递的URL编码的名称/值对数据 . 通常,查询参数作为GET请求的URL字符串的一部分传递,并在POST请求的请求正文中传递 .示例:给定URL http://services.example.com/contacts?group=Business,我可以注入
@QueryParam("group")
将查询参数与POST请求一起使用是非常典型的,但是如果请求类型是application / x-www-form-urlencoded则可能:
这些只是高级示例,请阅读documentation我链接以获得每个参数类型如何工作的更好示例,以及何时使用哪一个 .
我刚刚开始在java中开发webservice,并且遇到了与POST数据相同的问题 . 我使用@FormParam读取POST数据的解决方案非常简单,实际上我使用@QueryParam来读取POST数据,我认为它仅用于使用GET方法读取QueryString数据
这里给出了非常好的文档 . 读完这篇文章后,我的大部分困惑都被清除了 . http://docs.jboss.org/resteasy/docs/2.0.0.GA/userguide/html_single/index.html
提示:在使用@FormParam时,请确保使用“application / x-www-form-urlencoded”mime类型
我将此作为对已接受答案的评论发布,但我只是羞于能够做到这一点 .
除了上面的优秀建议,我还要补充一点,至少在2.0.x版本中,Jersey不会从查询字符串中拉出
@FormParam
. 相反,它期望它作为名称 - 值对包含在请求主体中 .例如,您将使用正文发送
POST http://localhost/app
而不是POST http://localhost/app?name=Joe
:假设我们有
tenant
具有id
和name
属性的对象和REST资源通过@POST
和@PATH("/xyz/tenants")
公开 .JSON中的正文示例:
XML中的正文示例: