You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:44:43