Java 截击失误

Java 截击失误,java,android,android-volley,Java,Android,Android Volley,com.android.volley.NoConnectionError:java.net.ProtocolException:未知方法“补丁”;必须是[OPTIONS、GET、HEAD、POST、PUT、DELETE、TRACE]之一 StringRequest putRequest = new StringRequest(Request.Method.PATCH, url, new Response.Listener<String>()

com.android.volley.NoConnectionError:java.net.ProtocolException:未知方法“补丁”;必须是[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; 
                 }

             };
StringRequest putRequest=新的StringRequest(Request.Method.PATCH,url,
新的Response.Listener()
{
@凌驾
公共void onResponse(字符串响应)
{
Log.d(“响应”,响应);
}
},
新的Response.ErrorListener()
{
@凌驾
公共无效onErrorResponse(截击错误)
{
Log.d(“Error.Response”,Error.toString());
}
}
) {
@凌驾
受保护的映射getParams()
{ 
Map params=newhashmap();
参数put(“姓名”、“我的姓名”);
参数put(“年龄”、“11”);
返回参数;
}
};

您确定使用的是正确版本的Volley库吗?我刚刚在棒棒糖中尝试了你的代码,它工作正常。 如果您使用Volley库作为外部项目,请检查com.android.Volley包中请求类的方法接口。它应该有一个补丁变量

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中显示了这个错误,但在棒棒糖中没有。我想主要的问题是Java的HTTPUrlConnection不支持补丁。 (我猜它可以在棒棒糖中使用,因为它使用的是Java 7,Java 7的HTTPUrlConnection支持补丁方法?) 无论如何,您可以使用OkHttp库来纠正这个问题。okhttp urlconnection模块实现java.net.HttpURLConnection

将以下jar添加到您的libs文件夹:



创建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.newRequestQueue(getApplicationContext(),new OkHttpStack()).add(putRequest);

它现在在Kitkat上为我工作。

在发送请求时使用POST。 在报头中,只需覆盖http方法以进行修补。 对我来说,现在它的工作在截击,甚至在kitkat版本

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

使用了请求类中声明的最新版本和补丁。如果您认为答案正确,则应接受该答案。@sreejith这应被视为正确答案Answer@GobletSky您好,OkUrlFactory现在已被弃用,您有没有想法不用它来解决问题?我也有同样的问题(我试图在KitKat上用补丁方法发出一个截击JSONObjectRequest)。我认为这些技巧也可能对某人有所帮助:1-如果你对OkHTTP有问题,请尝试下载OkHTTP-2.3.0.jar(更新版本对我不起作用)。2-如果你在应用程序中使用唯一的请求队列(可能是MyApplication.java),请小心因为这个带有OkHttpStack的newRequestQueue可能会破坏其他请求类型,比如GET。我最终定义了两个队列:这个队列只用于(补丁和5.0之前的版本),我通常的requestQueue用于任何其他类型。3-这可能也适用于JSONArrayRequest。您的服务器应该允许方法重写来实现这一点