【问题标题】:PUT Request form body in RESTLet and HTTPClientRESTLet 和 HTTPClient 中的 PUT 请求表单正文
【发布时间】:2014-02-28 11:14:53
【问题描述】:

我在 Apache HTTPClient 和在 RESTLet 上运行的 JAX-RS 服务之间传输表单主体时遇到了很多困难。

这是我发送 PUT 请求的操作:

HttpPut put = new HttpPut("http://localhost:1337/api/user/default/inventory");
MultipartEntityBuilder builder = MultipartEntityBuilder.create();
builder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);
builder.addTextBody("url", item, ContentType.MULTIPART_FORM_DATA);

put.setEntity(builder.build());

HttpResponse resp = httpClient.execute(put);

我的服务看起来像这样:

@PUT
@Produces("application/json")
@Path("user/{id}/inventory")
Public Response addResourceToProfile(@FormParam("url") String url, @PathParam(value="id") String userId, @Context HttpHeaders headers){
try {           
    UserProfiles.get(userId).addToInventory(url);

    return Response.ok("{result:\"success\"}", MediaType.APPLICATION_JSON_TYPE).build();
            } catch (Exception e) {
                return Response.serverError().build();
            }
        }

url 参数总是以 null...

【问题讨论】:

    标签: java jax-rs httpclient restlet apache-httpclient-4.x


    【解决方案1】:

    为什么要使用多部分编码来传输一个单独的参数?此外,从外观上看,该服务实际上需要“form-urlencoded”内容。以这种方式构造的请求很可能就足够了

    HttpUriRequest put = RequestBuilder.put()
            .setUri("http://localhost:1337/api/user/default/inventory")
            .addParameter("url", item)
            .build();
    

    【讨论】:

    • 因为我稍后会添加更多参数。而且因为我需要以尽可能少的解析开销来模拟基于 JavaScript 的应用程序将发布的任何内容。
    • @Michael:没有什么能阻止您在表单 urlencoded 请求中拥有更多参数。无论如何,最有可能的 from-url 编码是您的 java 脚本使用的编码。如果您绝对确定需要多部分编码,那么您的服务是错误的
    猜你喜欢
    • 2014-06-08
    • 1970-01-01
    • 2021-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-11
    相关资源
    最近更新 更多