改造与改造HTTP补丁

时间:2014-06-09 11:02:48

标签: android httpurlconnection patch retrofit

所以我想使用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

1 个答案:

答案 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方法的字段。这是非常脆弱的,容易发生破裂,在我看来是最糟糕的选择。