当前位置: 首页 > news >正文

Android OkHttp

目录

1.build.gradle

2.基本使用

3.POST请求

4.Builder构建者

1.build.gradle
implementation("com.squareup.okhttp3:okhttp:4.12.0")
2.基本使用

GET同步请求

public void getSync(View view) {new Thread(){@Overridepublic void run() {Request request = new Request.Builder().url("https://httpbin.org/get?a=1&b=2").build();//准备好请求的call对象Call call = okHttpClient.newCall(request);try {Response response = call.execute();Log.i("TAG", "getSync: "+response.body().string());} catch (IOException e) {e.printStackTrace();}}}.start();}

GET异步请求

public void getAsync(View view) {Request request = new Request.Builder().url("https://httpbin.org/get?a=1&b=2").build();//准备好请求的call对象Call call = okHttpClient.newCall(request);//异步请求call.enqueue(new Callback() {@Overridepublic void onFailure(@NonNull Call call, @NonNull IOException e) {Log.i("TAG", "getAsync onFailure",e);}@Overridepublic void onResponse(@NonNull Call call, @NonNull Response response) throws IOException {if (response.isSuccessful()){Log.i("TAG", "getAsync onResponse: "+response.body().string());}}});}

POST同步请求

public void postSync(View view) {new Thread(){@Overridepublic void run() {FormBody formBody = new FormBody.Builder().add("a","404").build();Request request = new Request.Builder().url("https://httpbin.org/post").post(formBody).build();   //Request.Builder对象默认get请求//准备好请求的call对象Call call = okHttpClient.newCall(request);try {Response response = call.execute();Log.i("TAG", "postSync: "+response.body().string());} catch (IOException e) {e.printStackTrace();}}}.start();}

POST异步请求

public void postAsync(View view) {FormBody formBody = new FormBody.Builder().add("a","404").build();Request request = new Request.Builder().url("https://httpbin.org/post").post(formBody).build();//准备好请求的call对象Call call = okHttpClient.newCall(request);call.enqueue(new Callback() {@Overridepublic void onFailure(@NonNull Call call, @NonNull IOException e) {Log.i("TAG", "postAsync onFailure",e);}@Overridepublic void onResponse(@NonNull Call call, @NonNull Response response) throws IOException {Log.i("TAG", "postAsync: "+response.body().string());}});
}
3.POST请求
协议规定 POST 提交的数据必须放在请求体中,但协议并没有规定数据必须使用什么编码方式 。常用的数据编码方式有: https://www.runoob.com/http/http-content-type.html
Content-Type:application/x-www-form-urlencoded
数据被编码为名称/值对,默认类型;
Content-Type:multipart/form-data
数据被编码为一条消息,一般用于文件上传;
Content-Type:application/octet-stream
提交二进制数据,如果用于文件上传,只能上传一个文件;
Content-Type:application/json
提交json数据
提交多个文件
@Test
public void uploadFileTest() throws IOException {OkHttpClient okHttpClient = new OkHttpClient();File file1 = new File("H:\\Users\\ASUS\\Desktop\\f1.txt");File file2 = new File("H:\\Users\\ASUS\\Desktop\\f2.txt");MultipartBody multipartBody = new MultipartBody.Builder().addFormDataPart("f1", file1.getName(), RequestBody.create(file1, MediaType.parse("text/plain"))).addFormDataPart("f2", file2.getName(), RequestBody.create(file2, MediaType.parse("text/plain"))).build();Request request = new Request.Builder().url("https://httpbin.org/post").post(multipartBody).build();Call call = okHttpClient.newCall(request);Response response = call.execute();System.out.println(response.body().string());}

提交json数据

@Test
public void jsonTest() throws IOException {OkHttpClient okHttpClient = new OkHttpClient();RequestBody requestBody = RequestBody.create(MediaType.parse("application/json"), "{\"a\":1,\"b\":2}");Request request = new Request.Builder().url("https://httpbin.org/post").post(requestBody).build();Call call = okHttpClient.newCall(request);Response response = call.execute();System.out.println(response.body().string());}
4.Builder构建者
OkHttpClient okHttpClient = new OkHttpClient.Builder().build();
拦截器
OkHttpClient okHttpClient = new OkHttpClient.Builder().addInterceptor( new XXX ).build();
OkHttpClient okHttpClient = new OkHttpClient.Builder().addNetworkInterceptor( new XXX ).build();
@Testpublic void interceptorTest() {OkHttpClient okHttpClient = new OkHttpClient.Builder().addInterceptor(new Interceptor() {@NonNull@Overridepublic Response intercept(@NonNull Chain chain) throws IOException {//请求前置处理Request request = chain.request().newBuilder().addHeader("os", "android").addHeader("version", "1.0").build();Response response = chain.proceed(request);//请求后置处理return response;}}).addNetworkInterceptor(new Interceptor() {    //一定先执行addInterceptor后执行addNetworkInterceptor  添加顺序不影响执行@NonNull@Overridepublic Response intercept(@NonNull Chain chain) throws IOException {System.out.println("version" + chain.request().header("version"));return chain.proceed(chain.request());}}).build();Request request = new Request.Builder().url("https://httpbin.org/get?a=1&b=2").build();//准备好请求的call对象Call call = okHttpClient.newCall(request);try {Response response = call.execute();System.out.println(response.body().string());} catch (IOException e) {e.printStackTrace();}}
缓存与 Cookie
OkHttp按照Http协议规则实现了缓存的处理,缓存是比如:当我们发起第一次请求之后,如果后续还需要进行同样的请求,此时如果符合缓存规则,则可以减少与服务器的网络通信,直接从本地文件缓存中读取响应返回给请求者。但是默认情况下,OkHttp的缓存是关闭状态,需要我们开启。
OkHttpClient okHttpClient = new OkHttpClient.Builder().cache(new Cache(new File("/path/cache"),100))
Cookie是某些网站为了辨别用户身份,进行会话跟踪(比如确定登陆状态)而储存在用户本地终端上的数据(通常经过加密),由用户客户端计算机暂时或永久保存的信息
Map<String, List<Cookie>> cookie = new HashMap<>();@Testpublic void cookieTest() {OkHttpClient okHttpClient = new OkHttpClient.Builder().cookieJar(new CookieJar() {@Overridepublic void saveFromResponse(@NonNull HttpUrl httpUrl, @NonNull List<Cookie> list) {cookie.put(httpUrl.host(), list);            //保存cookie}@NonNull@Overridepublic List<Cookie> loadForRequest(@NonNull HttpUrl httpUrl) {List<Cookie> cookies = cookie.get(httpUrl.host());  return cookies == null ? new ArrayList<>() : cookies;    //加载并返回cookie}}).build();FormBody formBody = new FormBody.Builder().add("username", "xx").add("password", "xxxxxx").build();Request request = new Request.Builder().url("https://www.xxx.com/user/login").post(formBody).build();Call call = okHttpClient.newCall(request);try {Response response = call.execute();System.out.println(response.body().string());} catch (IOException e) {e.printStackTrace();}}

http://www.lryc.cn/news/333927.html

相关文章:

  • Java常用API_正则表达式_字符串的替换和截取方法——小练习
  • 从头开发一个RISC-V的操作系统(四)嵌入式开发介绍
  • Web漏洞-文件上传常见验证
  • 如何在 Node.js 中使用 bcrypt 对密码进行哈希处理
  • 嵌入式学习49-单片机2
  • 汽车EDI:如何与奔驰建立EDI连接?
  • 性能分析--内存知识
  • 目标检测标签分配策略,难样本挖掘策略
  • Java | Leetcode Java题解之第16题最接近的三数之和
  • FIN和RST的区别,几种TCP连接出现RST的情况
  • 2024/4/1—力扣—删除字符使频率相同
  • Spring源码解析-容器基本实现
  • Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单视频处理实战案例 之四 简单视频倒放效果
  • 蓝牙学习十(扫描)
  • (26)4.7 字符函数和字符串函数
  • 交换机与队列的简介
  • 1.docker
  • ThinkPHP审计(2) Thinkphp反序列化链5.1.X原理分析从0编写POC
  • KingbsaeES数据库分区表的详细用法
  • MySQL 索引底层探索:为什么是B+树?
  • XML HTTP传输 小结
  • 相机标定——四个坐标系介绍
  • C++:MySQL数据库的增删改(三)
  • golang - 简单实现linux上的which命令
  • 推荐一个好用的数据库映射架构
  • (013)window的Idea运行程序 Amazon java.nio.file.AccessDeniedException
  • LeetCode 1684. 统计一致字符串的数目
  • uniapp-设置UrlSchemes从外部浏览器H5打开app
  • 校园圈子小程序,大学校园圈子,三段交付,源码交付,支持二开
  • 基于kmeans的聚类微博舆情分析系统