java - 使用 volley 进行 PATCH 请求

标签 java android android-volley

我正在尝试使用 volley 来执行补丁请求。但它抛出异常:

com.android.volley.VolleyError: java.lang.IllegalArgumentException: method PATCH must have a request body.

感谢任何帮助!

CustomJsonObjectRequest.java

import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.util.HashMap;
import java.util.Map;    

import org.json.JSONException;
import org.json.JSONObject;    

import android.util.Log;

import com.android.volley.AuthFailureError;
import com.android.volley.NetworkResponse;
import com.android.volley.ParseError;
import com.android.volley.Request;
import com.android.volley.Response;
import com.android.volley.Response.ErrorListener;
import com.android.volley.Response.Listener;
import com.android.volley.toolbox.HttpHeaderParser;

public class CustomJsonObjectRequest extends Request<JSONObject> {
private Listener<JSONObject> listener;
private Map<String, String> params;

public CustomJsonObjectRequest(int method, String url, Map<String,    String> params,
        Listener<JSONObject> reponseListener, ErrorListener errorListener) {
    super(Method.PATCH, url, errorListener);
    this.listener = reponseListener;
    this.params = params;
}

@Override
protected Map<String, String> getParams()
        throws com.android.volley.AuthFailureError {

    return params;
};

@Override
protected Response<JSONObject> parseNetworkResponse(NetworkResponse response) {
    try {

        String jsonString = new String(response.data,
                HttpHeaderParser.parseCharset(response.headers));

        return Response.success(new JSONObject(jsonString),
                HttpHeaderParser.parseCacheHeaders(response));
    } catch (UnsupportedEncodingException e) {
        e.printStackTrace();
        return Response.error(new ParseError(e));

    } catch (JSONException je) {
        je.printStackTrace();
        return Response.error(new ParseError(je));
    }
}

@Override
public byte[] getBody() throws AuthFailureError {

     Map<String, String> params = getParams();
        if (params != null && params.size() > 0) {
            return encodeParameters(params, getParamsEncoding());
        }

        return null;
}


 private byte[] encodeParameters(Map<String, String> params, String paramsEncoding) {
        StringBuilder encodedParams = new StringBuilder();
        try {
            for (Map.Entry<String, String> entry : params.entrySet()) {
                encodedParams.append(URLEncoder.encode(entry.getKey(), paramsEncoding));
                encodedParams.append('=');
                encodedParams.append(URLEncoder.encode(entry.getValue(), paramsEncoding));
                encodedParams.append('&');
            }

            return encodedParams.toString().getBytes(paramsEncoding);
        } catch (UnsupportedEncodingException uee) {
            throw new RuntimeException("Encoding not supported: " + paramsEncoding, uee);
        }
    }

@Override
public Map<String, String> getHeaders() throws AuthFailureError {
    // TODO Auto-generated method stub
    Map<String, String> headers = new HashMap<String, String>();
                headers.put("API_TOKEN", MainActivity.getAPIToken());
                headers.put("Content-Type", "application/json");
    return headers;
}

@Override
protected void deliverResponse(JSONObject response) {
    // TODO Auto-generated method stub
    Log.d("check deliverResponse:", ""+response);
    }
}

OkHttpStack.java

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);
    }
}

补丁请求

Map<String, String> params = new HashMap<String, String>();
            params.put("new_id","7986");
String id = "7984";
CustomJsonObjectRequest customReq = new CustomJsonObjectRequest(
                        Request.Method.PATCH, MainURL.APIURL + id,params,
                        new Response.Listener<JSONObject>() {

                            @Override
                            public void onResponse(JSONObject jObjGags)   {

                                Log.d("check json:", "" + jObjGags);

                            }
                        }, new Response.ErrorListener() {

                            @Override
                            public void onErrorResponse(VolleyError  error) {
                                Log.d("check error:", "" + error);
                            }
                        });

Volley.newRequestQueue(getActivity(),new OkHttpStack()).add(customReq);

我将请求正文作为 map 参数发送。它抛出一个异常,指出 PATCH 请求必须有一个请求主体。

最佳答案

终于找到了解决我问题的方法!!

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.impl.client.DefaultHttpClient;
import org.json.JSONException;
import org.json.JSONObject;

import android.app.Activity;
import android.content.Intent;
import android.os.AsyncTask;
import android.util.Log;

import com.android.volley.toolbox.HttpClientStack;

public class PatchTask extends AsyncTask<String, Void, JSONObject>{
    JSONObject jobj;
    Activity activity;
    public PatchTask(Activity activity) {
        this.activity = activity;
    }

@Override
protected JSONObject doInBackground(String... params) {
    // TODO Auto-generated method stub

    HttpClient httpclient = new DefaultHttpClient();
    HttpClientStack clientStack = new HttpClientStack(httpclient);
    BufferedReader reader;
    String line=null;
    try {
        HttpResponse response =clientStack.performRequest(customReq, headers);
        Log.d("patch response>>", ""+response.toString());
        HttpEntity entity = response.getEntity();
        Log.d("patch entity", ""+entity.toString());
        if (entity != null) {


            InputStream instream = entity.getContent();
            Log.d("patch instream>>", ""+instream.toString());
            reader = new BufferedReader(new InputStreamReader(
                    instream, "UTF-8"), 8192);
            line = reader.readLine().toString();
            instream.close();
        }

    } catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    try {

        if (line != null) {
            jobj = new JSONObject(line);
        }

    } catch (JSONException e1) {
        e1.printStackTrace();
    }

    return jobj;
}

@Override
protected void onPostExecute(JSONObject result) {
    Log.d("patch post result:", ""+result);

    }


}

关于java - 使用 volley 进行 PATCH 请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31647809/

相关文章:

java - Glassfish 中的 JNDI 查找失败

java - 相交形成闭合形状的多条绘图线的填充颜色

android - "This application is available to over 0 devices."

php - 使用 PHP 将 JSON 数组发送到 Android Volley

java - Volley 库 (PriorityBlockingQueue.java) 中的等待请求功能问题

java - 从HDFS读取zip文件并使用Spark Java提取

java - 如何从命令行执行maven插件?

java - 将 session 记录转换为人类可读的格式

android - 迭代执行任务

java - 如何从服务器检索值并将其保存在 sqlite 中并立即显示?