所以我想使用Retrofit发出一个PATCH请求但是目前我无法将okhttp添加到我的类路径中。当我尝试发出PATCH请求时,我得到下面的堆栈跟踪。有没有其他方法我可以使用Patch而不使用okhttp?
java.net.ProtocolException
at java.net.HttpURLConnection.setRequestMethod(HttpURLConnection.java:644)
at retrofit.client.UrlConnectionClient.prepareRequest(UrlConnectionClient.java:50)
at retrofit.client.UrlConnectionClient.execute(UrlConnectionClient.java:37)
at retrofit.RestAdapter$RestHandler.invokeRequest(RestAdapter.java:358)
at retrofit.RestAdapter$RestHandler.access$100(RestAdapter.java:264)
at retrofit.RestAdapter$RestHandler$2.obtainResponse(RestAdapter.java:315)
at retrofit.CallbackRunnable.run(CallbackRunnable.java:42)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1088)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:581)
at retrofit.Platform$Android$2$1.run(Platform.java:142)
at java.lang.Thread.run(Thread.java:1019)
06-09 10:53:09.349 1809-1897/**.****.****** D/Retrofit﹕ ---- END ERROR
答案 0 :(得分:4)
这是HttpUrlConnection
的限制。您可以使用Apache或OkHttp,它们都支持PATCH
作为替代客户端。这可以在构建器中明确完成:
RestAdapter restAdapter = new RestAdapter.Builder()
.setEndpoint(..)
.setClient(new OkClient())
.build()
此外,某些服务器允许指定X-HTTP-Method-Override
标头以更改方法。有了这个,您将发送POST
,但包含PATCH
作为此标头值。同样,这需要服务器支持。
最后,另一个选项是子类化Retrofit的UrlConnectionClient
并使用反射来更改保存HTTP方法的字段。这是非常脆弱的,容易发生破裂,在我看来是最糟糕的选择。