Java 截击失误
com.android.volley.NoConnectionError:java.net.ProtocolException:未知方法“补丁”;必须是[OPTIONS、GET、HEAD、POST、PUT、DELETE、TRACE]之一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>()
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。您的服务器应该允许方法重写来实现这一点