OkHttp3发送http请求在Java中的使用方法

简介: 记录总结一下Http的get请求和post请求的使用方法和问题解决

前言

最近在使用OkHttp3开发的时候,出现了一些问题,记录总结一下Http的get请求和post请求的使用方法和问题解决!

1. Get请求

Request request = new Request.Builder()
    .url(url)
    .addHeader("键", "值")
    .addHeader("键", "值")
    ...
    .get()
    .build();

2. Post请求

RequestBody body = new FormBody.Builder()
    .add("键", "值")
    .add("键", "值")
    ...
    .build();
Request request = new Request.Builder()
    .url(url)
    .addHeader("键", "值")
    .addHeader("键", "值")
    ...
    .post(body)
    .build();

post请求需要提交一个表单,就是RequestBody。

RequestBody的数据格式都要指定Content-Type,常见的有三种:

  • application/x-www-form-urlencoded 数据是个普通表单
  • multipart/form-data 数据里有文件
  • application/json 数据是个json

2.1 普通表单

RequestBody body = new FormBody.Builder()
    .add("键", "值")
    .add("键", "值")
    ...
    .build();

注意:表面上普通表单并没有指定Content-Type,但是FormBody继承了RequestBody,它已经指定了数据类型为application/x-www-form-urlencoded。

2.2 Json表单

JSONObject json = new JSONObject();
json.put("键", "值");
...
RequestBody body = RequestBody.create(MediaType.parse("application/json; charset=utf-8"), json);

2.3 文件表单

RequestBody requestBody = new MultipartBody.Builder()
    .setType(MultipartBody.FORM)
    .addFormDataPart("file", file.getName(), RequestBody.create(MediaType.parse("image/png"), file))
    .build();

MultipartBody也是继承RequestBody,适用于如下五种Content-Type:

public static final MediaType MIXED = MediaType.parse("multipart/mixed");
public static final MediaType ALTERNATIVE = MediaType.parse("multipart/alternative");
public static final MediaType DIGEST = MediaType.parse("multipart/digest");
public static final MediaType PARALLEL = MediaType.parse("multipart/parallel");
public static final MediaType FORM = MediaType.parse("multipart/form-data");

3. 问题解决

问题java.io.EOFException: \n not found: limit=0 content=…

问题原因

  • 服务器在返回数据后就直接关闭 TCP 连接,而客户端(项目应用)却将连接放入连接池重复使用;
  • 当下次请求复用时,连接已经被关闭,就读取不到返回值,报上述异常。
  • 如果等待一段时间,等连接池杀掉闲置连接,那下次请求就会重新建立一个连接,就可以正常拉到视频。

解决方法

  • 设置 retryOnConnectionFailure(true)
  • addHeader(“Connection”,“close”)
  • addHeader(“Accept-Encoding”, “identity”)
相关文章
|
28天前
|
Rust 前端开发 API
Tauri 开发实践 — Tauri HTTP 请求开发
本文介绍了如何在 Tauri 中发起 HTTP 请求。首先通过安装 Tauri 生态中的工具包并配置 `tauri.conf.json` 文件来允许特定域名的 HTTP 通信。接着封装了一个简单的 HTTP 客户端类,并在页面中使用该客户端实现 GET 和 POST 请求。最后提供了完整的源码地址以供参考。此功能使得桌面应用能够与远程服务器进行交互,增强了应用的实用性。
74 1
Tauri 开发实践 — Tauri HTTP 请求开发
|
7天前
|
缓存 前端开发 API
|
12天前
|
数据采集 前端开发 算法
Python Requests 的高级使用技巧:应对复杂 HTTP 请求场景
本文介绍了如何使用 Python 的 `requests` 库应对复杂的 HTTP 请求场景,包括 Spider Trap(蜘蛛陷阱)、SESSION 访问限制和请求频率限制。通过代理、CSS 类链接数控制、多账号切换和限流算法等技术手段,提高爬虫的稳定性和效率,增强在反爬虫环境中的生存能力。文中提供了详细的代码示例,帮助读者掌握这些高级用法。
Python Requests 的高级使用技巧:应对复杂 HTTP 请求场景
|
2天前
|
存储 Java 开发者
Java 中 Set 类型的使用方法
【10月更文挑战第30天】Java中的`Set`类型提供了丰富的操作方法来处理不重复的元素集合,开发者可以根据具体的需求选择合适的`Set`实现类,并灵活运用各种方法来实现对集合的操作和处理。
|
1天前
|
前端开发 JavaScript Java
如何捕获和处理HTTP GET请求的异常
如何捕获和处理HTTP GET请求的异常
|
3天前
|
开发者
HTTP 协议请求方法的发展历程
【10月更文挑战第21天】
|
3天前
|
安全
HTTP 协议的请求方法
【10月更文挑战第21天】
|
3天前
|
缓存 安全 前端开发
HTTP 协议的请求方法在实际应用中有哪些注意事项?
【10月更文挑战第29天】HTTP协议的请求方法在实际应用中需要根据具体的业务场景和需求,合理选择和使用,并注意各种方法的特点和限制,以确保网络通信的安全、高效和数据的一致性。
|
7天前
|
安全 API 数据安全/隐私保护
常见的HTTP请求方法
【10月更文挑战第25天】这些HTTP请求方法共同构成了客户端与服务器之间交互的基础,使得客户端能够根据不同的需求对服务器资源进行各种操作。在实际应用中,开发者需要根据具体的业务场景和资源的性质选择合适的请求方法来实现客户端与服务器之间的有效通信。
|
13天前
|
网络协议
Lua中实现异步HTTP请求的方法
Lua中实现异步HTTP请求的方法