【问题标题】:Why @FormParam does not support content=type=application/json?为什么@FormParam 不支持 content=type=application/json?
【发布时间】:2018-02-28 20:01:51
【问题描述】:

我已经使用邮递员测试了一个 Rest API,在测试选择原始选项时,它显示了应用程序/json 标头内容类型不受支持的媒体,但仅适用于 url 编码的形式。请指定如何将@FormParam 用于application/json 内容类型。提前致谢。

【问题讨论】:

    标签: java rest postman


    【解决方案1】:

    @FormParam 注解仅用于访问以通常使用x-www-form-urlencoded 的普通形式传递的参数。如果您将数据作为请求正文中的 JSON 发送,您只需创建一个与您的请求正文相对应的 POJO 类,其中包含您的 JSON 请求的所有属性,并将其用作 REST 方法的参数。 JAX-RS 容器会自动将请求的 JSON 主体反序列化为给定的对象。

    例如,如果您的请求正文是这样的:

    {
        "firstName" : "Foo",
        "lastName"  : "bar"
    }
    

    然后你可以定义一个 POJO 来代表你的请求数据,如下所示:

    public class PersonRequest {
        private String firstName;
        private String lastName;
    
        public String getFirstName() {
            return firstName;
        }
    
        public void setFirstName(String firstName) {
            this.firstName = firstName;
        }
    
        public String getLastName() {
            return lastName;
        }
    
        public void setLastName(String lastName) {
            this.lastName = lastName;
        }
    }
    

    并将您的 REST 端点定义为访问此数据:

    @POST
    @Path("/persons")
    @Consumes("application/json")
    public String savePerson(PersonRequest personRequestData) {
        // request data are deserialized into the personRequestDataas properties 
        System.out.println(personRequestData.getFirstName());
    
    }
    

    您不需要在 POJO 类上指定任何类型的注释。

    【讨论】:

    • 谢谢,所以使用这种方法我可以使用申请/json 媒体类型而不是 application/x-www-form-urlencoded 来测试我的 API 对吗?因为我想使用原始选项在 Json 类型请求正文中使用申请/json 对其进行测试。
    • 是的,完全正确。 :)
    • @zaerymoghaddam 如果我想同时支持 json 和 urlencoded 怎么办?我该怎么做?
    • @Kousha 这并不容易。您可以在同一方法之上放置一个额外的 @Consumes(MediaType.APPLICATION_FORM_URLENCODED),但注入的参数将是 null 或出现异常。如果它变为 null,那么在方法内部,您可以从请求对象或 personRequestData 对象(基于 mime 类型)读取参数。另一种选择可能是从您的方法中删除所有参数,并尝试根据请求 mime 类型直接访问请求参数/正文。也许最好有两个单独的方法,让 JAX-RS 为您处理所有解组过程。
    猜你喜欢
    • 1970-01-01
    • 2020-10-11
    • 2020-04-23
    • 1970-01-01
    • 2012-09-11
    • 2019-05-24
    • 2018-12-27
    • 2018-05-12
    • 2019-06-28
    相关资源
    最近更新 更多