如何在没有multipart body的情况下使用okhttp3发出put请求

时间:2016-08-25 07:20:47

标签: java servlets okhttp3

我的Web服务是一个java servlet,它接受带有url params的put请求来执行特定操作。下面的代码得到了我想要做的,但我想知道是否有更好的方法来制作一个put请求而不添加多部分体。

Java Servlets中的所有put请求是否都需要多部分体?

使用okhttp3进行的所有请求是否需要多部分主体?

我是否误解别的东西?

    body = new MultipartBody.Builder()
                .setType(MultipartBody.FORM)
                .addFormDataPart("", "") // I would love to eliminate this.
                .build();

    request = new Request.Builder()
                .url(url + "?my_param=" + URLEncoder.encode(myParam, "utf-8"))
                .put(body)
                .build();

    response = client.newCall(request).execute();

1 个答案:

答案 0 :(得分:1)

从实用的角度来看,我说你正在考虑Servlets和/或OkHttp的实现限制,并且它可能可以使用不同的库来工作。

然而,

从标准视图来看,我认为你的方法不正确,你应该使用POST而不是PUT。这需要在POST请求中同时阅读RFC-2616 (HTTP/1.1)第9.6节,在查询字符串上阅读RFC-1630 (URL's in WWW)部分。

从HTTP规范,第9.6节:

  

POST和PUT请求之间的根本区别体现在Request-URI的不同含义上。 POST请求中的URI标识将处理所包含实体的资源。该资源可能是数据接受过程,某些其他协议的网关或接受注释的单独实体。相反,PUT请求中的URI标识请求附带的实体 - 用户代理知道URI的用途,并且服务器不得尝试将请求应用于其他资源。

根据网址规范,第6页:

  

QUERY STRINGS

     

问号("?",ASCII 3F十六进制)用于界定可查询对象的URI与用于表示该对象上的查询的一组单词之间的边界。使用此表单时,组合URI表示由应用于原始对象的查询产生的对象。

这两者结合起来意味着你不能以你想要的方式使用PUT请求。