从JAX-RS中的POST请求接收参数

时间:2016-04-07 08:57:56

标签: json web-services jax-rs

我有一个方法在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请求接收参数的方法。

2 个答案:

答案 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

使用JSON

您的终端可以使用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"
}