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里有Authorization、User-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有没有语法错误(少括号、漏引号),可以用在线工具校验格式
- 关键请求头遗漏:有些接口会校验
Referer、Origin这类头,如果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,提问作者齐天大圣




