【问题标题】:Jersey Client Posting Form Data泽西岛客户发布表格数据
【发布时间】:2017-08-10 21:47:47
【问题描述】:

我正在学习 JAX-RS 和 Jersey。我正在尝试将数据发布到一个 URL,但是我有一个我不知道要解决的问题:

Form formData = new Form();
formData.param("merchant_id", mPayment.getMerchantId());
formData.param("transaction_id", mPayment.getTransactionId());
formData.param("code", mPayment.getCode());
formData.param("amount", String.valueOf(mPayment.getAmount()));
formData.param("desc", mPayment.getDesc());
formData.param("phone", mPayment.getPhone());

Response response = target.path("process").request()
        .accept(MediaType.APPLICATION_JSON)
        .post(Entity.form(formData));

现在,当它只是一个字符串时一切正常,但是服务器期望字段 amount 的浮点数据类型但是当我尝试在没有String.valueOf() 的情况下使用它时,我得到一个错误。如何添加具有不同数据类型的参数以便我可以发布?

【问题讨论】:

标签: java jax-rs jersey-2.0 jersey-client


【解决方案1】:

您无法在对服务器的调用中维护类型信息。表单数据将作为带有 application/x-www-form-urlencoded 内容类型标题的文本传输,这就是 Form 类接受 String 参数值的原因(类似于您只能在浏览器表单中输入文本值的方式)。

所以你的代码应该足够了。在服务器端,您可以将参数声明为浮点数并使用 javax.ws.rs.FormParam 对其进行注释。如果 Jersey 运行时无法将参数转换为所需的(浮点)类型,它将返回 400 BAD REQUEST。

简而言之:

  • 保持客户端代码不变。
  • 使用类似于以下的服务器代码:

    import javax.ws.rs.FormParam;
    import javax.ws.rs.POST;
    import javax.ws.rs.Path;
    import javax.ws.rs.core.Response;
    
    @Path("/service")
    public class myService {
    
        @POST
        public Response addOrder(
            @FormParam("merchant_id") String merchant_id,
            @FormParam("amount") float amount
            // more parameters 
            ) {
    
            return Response.ok().build();
        }
    }
    

【讨论】:

  • 所以你说这是不可能的,也没有解决办法,对我来说唯一的解决方案是将它转换为服务器上的浮点数?
  • 可以,但不需要自己做演员表,可以将FormParam注解的参数声明为浮点数。请参阅此采用 int 形式参数的代码示例:mkyong.com/webservices/jax-rs/jax-rs-formparam-example
  • 但是值不会来自表单。
  • 使用 javax.ws.rs.core.Form 类是填写浏览器表单的编程等价物,因为它会设置 application/x-www-form-urlencoded 内容类型。对于服务器来说,它只是一个传入的请求,并不关心它是通过浏览器还是自定义客户端来的。
  • 我现在很困惑。那么我在哪里放置注释呢?
猜你喜欢
  • 1970-01-01
  • 2014-11-30
  • 2012-09-19
  • 2013-03-13
  • 1970-01-01
  • 2012-07-03
  • 2014-10-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多