Volley补丁中的错误

时间:2015-02-04 05:33:10

标签: java android android-volley

com.android.volley.NoConnectionError:java.net.ProtocolException:未知方法' PATCH&#39 ;;必须是[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 个答案:

答案 0 :(得分:22)

您确定使用的是Volley Library的正确版本吗?我只是在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正在为我工​​作。

答案 1 :(得分:-1)

发送请求时使用POST。 在标头中只是将http方法覆盖到PATCH。 对我来说,它现在甚至在kitkat版本中都是凌空抽射。

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