前言
最近在使用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”)