改造和 HTTP 补丁

Kei*_*son 2 android patch httpurlconnection retrofit

所以我想使用 Retrofit 发出 PATCH 请求,但目前我无法将 okhttp 添加到我的类路径中。当我尝试发出 PATCH 请求时,我得到下面的堆栈跟踪。有没有其他方法可以在不使用 okhttp 的情况下使用 Patch?

\n\n
    java.net.ProtocolException\n        at java.net.HttpURLConnection.setRequestMethod(HttpURLConnection.java:644)\n        at retrofit.client.UrlConnectionClient.prepareRequest(UrlConnectionClient.java:50)\n        at retrofit.client.UrlConnectionClient.execute(UrlConnectionClient.java:37)\n        at retrofit.RestAdapter$RestHandler.invokeRequest(RestAdapter.java:358)\n        at retrofit.RestAdapter$RestHandler.access$100(RestAdapter.java:264)\n        at retrofit.RestAdapter$RestHandler$2.obtainResponse(RestAdapter.java:315)\n        at retrofit.CallbackRunnable.run(CallbackRunnable.java:42)\n        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1088)\n        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:581)\n        at retrofit.Platform$Android$2$1.run(Platform.java:142)\n        at java.lang.Thread.run(Thread.java:1019)\n06-09 10:53:09.349    1809-1897/**.****.****** D/Retrofit\xef\xb9\x95 ---- END ERROR\n
Run Code Online (Sandbox Code Playgroud)\n

Jak*_*ton 5

这是 的限制HttpUrlConnection。您可以使用 Apache 或 OkHttp,它们都支持PATCH作为替代客户端。这可以在构建器中明确完成:

RestAdapter restAdapter = new RestAdapter.Builder()
    .setEndpoint(..)
    .setClient(new OkClient())
    .build()
Run Code Online (Sandbox Code Playgroud)

此外,某些服务器允许指定X-HTTP-Method-Override用于更改方法的标头。这样您就可以发送一个POST但包含PATCH在内的标头值。同样,这需要服务器支持。

最后,另一种选择是子类化 RetrofitUrlConnectionClient并使用反射来更改保存 HTTP 方法的字段。这是非常脆弱的,将来很容易破损,在我看来是最糟糕的选择。