Volley Patch 出错

7

com.android.volley.NoConnectionError: java.net.ProtocolException: 未知方法 'PATCH';必须是以下之一 [OPTIONS,GET,HEAD,POST,PUT,DELETE,TRACE]

StringRequest putRequest = new StringRequest(Request.Method.PATCH, url,
                 new Response.Listener<String>()
                 {
                     @Override
                     public void onResponse(String response) 
                     {

                         Log.d("Response", response);

                     }
                 },
                 new Response.ErrorListener()
                 {
                      @Override
                      public void onErrorResponse(VolleyError error) 
                      {


                          Log.d("Error.Response", error.toString());

                    }
                 }
             ) {

                 @Override
                 protected Map<String, String> getParams()
                 { 
                         Map<String, String>  params = new HashMap<String, String> (); 
                         params.put("name", "My Name"); 
                         params.put("age", "11");

                         return params; 
                 }

             };
2个回答

22

您确定在使用正确版本的Volley库吗? 我刚刚在Lollipop中尝试了您的代码,它可以正常工作。 如果您将Volley库用作外部项目,请检查com.android.volley包中Request类的Method接口。 它应该有一个PATCH变量。

public interface Method {
        int DEPRECATED_GET_OR_POST = -1;
        int GET = 0;
        int POST = 1;
        int PUT = 2;
        int DELETE = 3;
        int HEAD = 4;
        int OPTIONS = 5;
        int TRACE = 6;
        int PATCH = 7;
    }

如果不行,请使用最新版本的Volley库。

更新:

您是正确的,在Kitkat中会显示此错误,但在Lollipop中不会。我想主要问题是Java的HTTPUrlConnection不支持PATCH方法。(我猜它在Lollipop上工作是因为它使用了Java 7和Java 7的HTTPUrlConnection支持PATCH方法?)
无论如何,您可以使用OkHttp库来解决这个问题。 okhttp-urlconnection模块实现了java.net.HttpURLConnection

将以下jar文件添加到libs文件夹中:
okhttp-2.2.0.jar
okhttp-urlconnection-2.2.0.jar
okio-1.2.0.jar

创建一个OkHttpStack类:

package com.example.temp;    

import java.io.IOException;
import java.net.HttpURLConnection;
import java.net.URL;

import com.android.volley.toolbox.HurlStack;
import com.squareup.okhttp.OkHttpClient;
import com.squareup.okhttp.OkUrlFactory;

public class OkHttpStack extends HurlStack {
    private final OkUrlFactory mFactory;

    public OkHttpStack() {
        this(new OkHttpClient());
    }

    public OkHttpStack(OkHttpClient client) {
        if (client == null) {
            throw new NullPointerException("Client must not be null.");
        }
        mFactory = new OkUrlFactory(client);
    }

    @Override protected HttpURLConnection createConnection(URL url) throws IOException {
        return mFactory.open(url);
    }
}

使用以下构造函数创建 Volley RequestQueue:

Volley.newRequestQueue(getApplicationContext(),new OkHttpStack()).add(putRequest);

现在它在Kitkat上对我有效。


使用最新版本,并在请求类中声明PATCH。 - sreejith
如果您认为答案是正确的,那么您应该接受它。 - User31689
@sreejith 这应该被接受为正确答案。 - Sheraz Ahmad Khilji
@GobletSky 你好,OkUrlFactory现在已经被弃用了,你有没有想过如何在不使用它的情况下解决这个问题? - Spierki
我曾经遇到过同样的问题(我试图在KitKat上使用PATCH方法制作Volley JSONObjectRequest)。 我认为这些提示也可能会对其他人有所帮助:1- 如果您遇到OkHTTP问题,请尝试下载okhttp-2.3.0.jar(更新版本对我无效)。 2- 如果您在应用程序中使用唯一的请求队列(例如MyApplication.java),请小心使用此newRequestQueue和OkHttpStack,因为它可能会破坏其他请求类型,如GET。 我最终定义了两个队列:一个仅用于(PATCH&pre-5.0),另一个是我的常规requestQueue,用于任何其他请求。 3- 这也可能适用于JSONArrayRequest。 - DuckN'Bear

-1

在发送请求时,请使用POST方法。 在头部中,只需覆盖HTTP方法为PATCH。 对于我来说,即使在KitKat版本中,它现在在Volley中也可以工作。

header.put("X-HTTP-Method-Override", "PATCH");

你的服务器应该允许方法覆盖以使其工作。 - Haseeb Zulfiqar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接