You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Android开发:如何使用okhttp3发送带Payload参数的PUT请求

别着急,我来帮你搞定用OkHttp3发送带Payload的PUT请求的问题!下面我会一步步给你讲清楚正确的实现方式,你可以对照自己的代码看看哪里出了问题。

第一步:确保引入OkHttp3依赖

如果是用Gradle构建项目,先确认build.gradle里加了对应依赖(版本可以用最新稳定版):

implementation 'com.squareup.okhttp3:okhttp:4.12.0'
第二步:基础的带Payload的PUT请求实现

假设你要发送的是JSON格式的Payload,咱们先写一个最基础的可运行示例:

// 1. 创建OkHttpClient实例(建议全局复用,不要每次请求都新建)
OkHttpClient client = new OkHttpClient.Builder()
        .connectTimeout(10, TimeUnit.SECONDS)
        .readTimeout(10, TimeUnit.SECONDS)
        .build();

// 2. 构造Payload对应的RequestBody
MediaType JSON_TYPE = MediaType.get("application/json; charset=utf-8");
String payloadContent = "{\"username\": \"testUser\", \"status\": \"active\"}"; // 替换成你实际的Payload内容
RequestBody requestBody = RequestBody.create(payloadContent, JSON_TYPE);

// 3. 构造PUT请求
Request request = new Request.Builder()
        .url("https://your-target-api.com/your-endpoint") // 替换成你的目标接口地址
        .put(requestBody) // 指定请求方法为PUT并传入Payload
        // 下面要添加你从Chrome里拿到的关键请求头
        .build();

// 4. 执行请求(同步方式,必须在子线程执行,不能在Android主线程)
try (Response response = client.newCall(request).execute()) {
    if (!response.isSuccessful()) throw new IOException("请求失败,状态码:" + response.code());

    // 打印响应内容方便调试
    System.out.println("响应结果:" + response.body().string());
} catch (IOException e) {
    e.printStackTrace();
}
第三步:添加Chrome中的关键请求头

你提到会提供Chrome的请求头信息,那咱们把这些头一一对应加到请求里。比如Chrome里有AuthorizationUser-Agent这类关键头,就用addHeader()方法添加:

Request request = new Request.Builder()
        .url("https://your-target-api.com/your-endpoint")
        .put(requestBody)
        // 对照Chrome的请求头逐一添加
        .addHeader("Authorization", "Bearer your-token-value")
        .addHeader("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36")
        .addHeader("Content-Type", "application/json; charset=utf-8")
        .addHeader("Referer", "https://your-referer-page.com")
        .build();

注意:Content-Type必须和你的Payload格式匹配,如果是表单类型就用application/x-www-form-urlencoded,别写错!

容易踩的坑点自查:
  • Payload格式错误:检查你的Payload是否和Chrome里的完全一致,比如JSON有没有语法错误(少括号、漏引号),可以用在线工具校验格式
  • 关键请求头遗漏:有些接口会校验RefererOrigin这类头,如果Chrome里有这些字段,一定要全部加上
  • 主线程执行请求:OkHttp的同步请求不能在Android主线程运行,会抛出异常,必须放到子线程或者用异步回调
  • 异步请求的线程处理:如果用异步方式,回调是在子线程的,更新UI要切回主线程:
client.newCall(request).enqueue(new Callback() {
    @Override
    public void onFailure(Call call, IOException e) {
        e.printStackTrace();
    }

    @Override
    public void onResponse(Call call, Response response) throws IOException {
        if (response.isSuccessful()) {
            String responseStr = response.body().string();
            // 这里如果要更新UI,需要用Handler或者runOnUiThread切换线程
        }
    }
});

如果你把Chrome的具体请求头贴出来,我还能帮你更精准地调整代码哦!

内容的提问来源于stack exchange,提问作者齐天大圣

火山引擎 最新活动