Android中如何将指定Curl PATCH请求转为Volley请求?
没问题,我帮你把这个Curl请求转换成Volley的实现,重点给你讲清楚请求体的位置和各个参数的对应关系:
用Volley实现指定的PATCH请求
1. 自定义JsonPatchRequest类
Volley默认没有封装JSON格式的PATCH请求,所以我们需要自己写一个自定义Request类,你疑惑的请求体就放在这个类的getBody()方法里,把JSON字符串转成字节数组返回即可:
import com.android.volley.Request; import com.android.volley.Response; import org.json.JSONObject; import java.io.UnsupportedEncodingException; public class JsonPatchRequest extends Request<JSONObject> { private final Response.Listener<JSONObject> mListener; private JSONObject mRequestBody; // 构造方法:传入请求URL、请求体、成功回调、失败回调 public JsonPatchRequest(String url, JSONObject requestBody, Response.Listener<JSONObject> listener, Response.ErrorListener errorListener) { super(Method.PATCH, url, errorListener); this.mListener = listener; this.mRequestBody = requestBody; } // 这里就是请求体的位置:把JSON对象转成字节数组返回 @Override public byte[] getBody() { try { return mRequestBody == null ? null : mRequestBody.toString().getBytes("utf-8"); } catch (UnsupportedEncodingException e) { e.printStackTrace(); return null; } } // 设置Content-Type头,和原Curl里的参数一致 @Override public String getBodyContentType() { return "application/json; charset=utf-8"; } // 解析服务器返回的JSON响应 @Override protected Response<JSONObject> parseNetworkResponse(com.android.volley.NetworkResponse response) { try { String jsonString = new String(response.data, org.apache.http.protocol.HTTP.UTF_8); return Response.success(new JSONObject(jsonString), com.android.volley.toolbox.HttpHeaderParser.parseCacheHeaders(response)); } catch (Exception e) { return Response.error(new com.android.volley.ParseError(e)); } } @Override protected void deliverResponse(JSONObject response) { mListener.onResponse(response); } }
2. 发送请求的代码实现
在你的Activity/ViewModel中,使用这个自定义类发送请求,同时设置好所有需要的请求头:
import com.android.volley.RequestQueue; import com.android.volley.Response; import com.android.volley.VolleyError; import com.android.volley.toolbox.Volley; import org.json.JSONException; import org.json.JSONObject; import android.util.Log; // 初始化Volley请求队列 RequestQueue queue = Volley.newRequestQueue(getApplicationContext()); String targetUrl = "http://myapp-back.herokuapp.com/fcms/1"; // 构建请求体JSON,对应原Curl里的-d参数内容 JSONObject requestBody = new JSONObject(); try { JSONObject fcmData = new JSONObject(); fcmData.put("token", "sd7sdf6sdffd5"); requestBody.put("fcm", fcmData); } catch (JSONException e) { e.printStackTrace(); } // 创建自定义PATCH请求 JsonPatchRequest patchRequest = new JsonPatchRequest( targetUrl, requestBody, new Response.Listener<JSONObject>() { @Override public void onResponse(JSONObject response) { // 请求成功的处理逻辑 Log.d("VolleySuccess", "服务器响应: " + response.toString()); } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { // 请求失败的处理逻辑 Log.e("VolleyError", "请求出错: " + (error.getMessage() != null ? error.getMessage() : "未知错误")); } } ); // 设置请求头,完全对应原Curl的-H参数 patchRequest.addHeader("Accept", "application/json"); patchRequest.addHeader("Authorization", "Token token=SNKh9UP4RX2Ltyxo9JnG , username=local1admin"); // 将请求加入队列执行 queue.add(patchRequest);
关键对应关系说明
- 请求体位置:自定义类的
getBody()方法就是承载请求体的地方,我们把构建好的JSONObject转成字节数组返回,完全对应Curl里的-d参数内容。 - 请求方法:通过
super(Method.PATCH, url, errorListener)指定为PATCH请求,对应Curl里的-X PATCH。 - 请求头:通过
patchRequest.addHeader()逐一添加,Authorization的格式要和原Curl完全一致,不能修改。
内容的提问来源于stack exchange,提问作者najaf k.a
相关产品推荐
相关产品推荐

