使用okhttp时没有返回正常数据

本文通过实例演示了如何使用OkHttp发起GET请求,并解决了在获取响应体时出现的问题。通过将response.body().toString()替换为response.body().string(),成功获取到了预期的HTML内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天踩过的大坑…
这是一段使用okhttp进行get请求的代码

这里拿百度网址做实例

OkHttpClient client = new OkHttpClient();

Request request = new Request
      .Builder().url("https://www.baidu.com/").get().build();

Response response = client.newCall(request).execute();

System.err.println(response.body().toString());
		

运行结果是 okhttp3.internal.http.RealResponseBody@4d50efb8 这段字符串,一脸懵逼, 正常结果应该是 一段html代码.

解决方法:
Replace

response.body().toString()

with

response.body().string()

改了之后运行一下就出来了.

### 如何在Java项目中使用OkHttp进行网络请求 #### 添加Maven依赖 为了能够在Java项目中利用OkHttp执行HTTP请求,需先配置构建工具来引入必要的库文件。对于采用Maven作为构建管理工具的项目而言,在`pom.xml`文件内的dependencies部分加入如下声明即可完成对OkHttp核心库及其日志拦截器的支持[^2]。 ```xml <dependency> <groupId>com.squareup.okhttp3</groupId> <artifactId>okhttp</artifactId> <version>x.x.x</version> </dependency> <!-- 可选的日志拦截器 --> <dependency> <groupId>com.squareup.okhttp3</groupId> <artifactId>logging-interceptor</artifactId> <version>x.x.x</version> </dependency> ``` 请注意替换上述代码片段中的版本号(`x.x.x`)为实际发布的稳定版次。 #### 创建同步GET请求实例 一旦成功集成了所需的依赖包之后,则可通过编写简单的Java程序发起同步方式下的GET类型的HTTP请求: ```java import okhttp3.OkHttpClient; import okhttp3.Request; import okhttp3.Response; public class OkHttpGetExample { public static void main(String[] args) throws Exception { OkHttpClient client = new OkHttpClient(); Request request = new Request.Builder() .url("http://example.com") // 替换成目标URL .build(); try (Response response = client.newCall(request).execute()) { if (!response.isSuccessful()) throw new RuntimeException("Unexpected code " + response); System.out.println(response.body().string()); } } } ``` 此段示例展示了如何创建一个`OkHttpClient`对象用于发送请求;通过调用`Request.Builder()`方法链设置请求参数并最终构建成完整的`Request`实体;最后借助于客户端实例上的`newCall()`函数配合`.execute()`实现阻塞式的响应接收操作,并打印返回的内容到控制台输出流上[^1]。 #### 构建异步POST请求案例 除了支持同步模式外,OkHttp同样允许开发者以非阻塞的方式提交数据给服务器端点。下面给出了一种基于回调机制处理POST请求的方法论: ```java import okhttp3.Call; import okhttp3.Callback; import okhttp3.MediaType; import okhttp3.OkHttpClient; import okhttp3.Request; import okhttp3.RequestBody; import okhttp3.Response; import java.io.IOException; public class OkHttpPostAsyncExample { private final OkHttpClient client = new OkHttpClient(); public void run() throws IOException, InterruptedException { MediaType mediaType = MediaType.parse("application/json"); String jsonBody = "{\"key\":\"value\"}"; // JSON字符串形式的数据体 RequestBody body = RequestBody.create(jsonBody, mediaType); Request request = new Request.Builder() .url("http://example.com/post") .post(body) .addHeader("Content-Type", "application/json") .build(); Call call = client.newCall(request); call.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()){ throw new IOException("Unexpected code "+ response); }else{ System.out.println(response.body().string()); // 成功后获取响应主体内容 } } }); Thread.sleep(5000); // 防止主线程提前结束而影响异步任务执行效果 } } ``` 这段代码说明了怎样构造带有JSON负载的消息体并通过指定媒体类型传递至远程API接口处。同定义了一个匿名内部类继承自`Callback`抽象基类重写其两个主要成员函数——分别用来捕获失败情形以及正常情况下的逻辑分支路径。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值