gpt4 book ai didi

java - 使用 volley 进行 PATCH 请求

转载 作者:行者123 更新时间:2023-12-02 04:29:34 26 4
gpt4 key购买 nike

我正在尝试使用 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com