我有一个方法在POST
请求中接受JSON。从POST
请求获取参数的唯一方法是使用@FormParam
。
但是我使用Android来使用web服务,那里没有HTML表单。
@Path("/app")
public class WebApi {
@POST
@Path("/prog")
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public Res method(@FormParam("name") Res name){
try{
System.out.println("Id:" +name.getId());
System.out.println("Name: "+name.getName());
return name;
}catch(Exception e){
System.out.println(e.getMessage());
return null;
}
}
}
Res
是一个实体类:
@XmlRootElement
public class Res {
@XmlElement int id;
@XmlElement String name;
// Default constructor, getters and setters ommited
}
请告诉我从POST
请求接收参数的方法。
答案 0 :(得分:1)
如果参数作为json包含在请求实体主体中,则不需要应用@FormParam注释,通常jax-rs实现必须支持将实体主体映射到方法参数的实体提供程序。如果它不符合您的需求,您可以设置自定义提供程序。
答案 1 :(得分:1)
当然,表单参数不是POST
个请求中发送数据的唯一方法。
@FormParam
使用表单参数时,需要使用application/x-www-form-urlencoded
来使用它们。你是否在Android中使用HTML表单并不重要。您的请求的Content-Type
标题应设置为application/x-www-form-urlencoded
。
对于这种情况,您的JAX-RS资源中会有以下内容:
@Path("/prog")
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_FORM_URLENCODED)
public Res method(@FormParam("id") Integer id, @FormParam("name") String name) {
...
}
要使用上面定义的端点,您的请求应该是:
POST /app/prog HTTP/1.1
Content-Type: application/x-www-form-urlencoded
id=1&name=Example
请注意,在这种情况下接收参数时,不需要包装参数的Java类。
@BeanParam
如果您更喜欢使用Java类来包装参数,则可以使用以下命令:
public class Res {
@FormParam("id")
private Integer id;
@FormParam("name")
private String name;
// Default constructor, getters and setters ommited
}
您的资源方法将如下:
@Path("/prog")
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_FORM_URLENCODED)
public Res method(@BeanParam Res res) {
...
}
要使用上面定义的端点,您的请求应该是:
POST /app/prog HTTP/1.1
Content-Type: application/x-www-form-urlencoded
id=1&name=Example
您的终端可以使用application/x-www-form-urlencoded
而不是application/json
。
为此,您的端点方法如下:
@Path("/prog")
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
public Res method(Res res) {
...
}
根据您的JSON提供程序,您的模型类可以是:
public class Res {
private Integer id;
private String name;
// Default constructor, getters and setters ommited
}
JSON将在请求有效负载中以application/json
Content-Type
发送:
POST /app/prog HTTP/1.1
Content-Type: application/json
{
"id": 1,
"name": "Example"
}