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

OkHttp网络请求框架

添加依赖

build.gradle 文件中添加 OkHttp 依赖:

dependencies {implementation("com.squareup.okhttp3:okhttp:4.10.0") 
}

使用OkHttp发起GET请求

同步请求

public class MainActivity extends AppCompatActivity {// Used to load the 'okhttptest' library on application startup.static {System.loadLibrary("okhttptest");}private ActivityMainBinding binding;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);binding = ActivityMainBinding.inflate(getLayoutInflater());setContentView(binding.getRoot());// Example of a call to a native methodTextView tv = binding.sampleText;tv.setText(stringFromJNI());new Thread(new Runnable() {@Overridepublic void run() {// 创建 OkHttpClientOkHttpClient client = new OkHttpClient();// 创建 Request 对象Request request = new Request.Builder().url("https://www.httpbin.org/get")  // URL.build();// 同步请求try (Response response = client.newCall(request).execute()){if(response.isSuccessful()){String responseBody = response.body().string();  // 读取响应体Log.d("Response:",responseBody);// 在主线程中显示 ToastrunOnUiThread(new Runnable() {@Overridepublic void run() {// 显示 ToastToast.makeText(MainActivity.this, responseBody, Toast.LENGTH_SHORT).show();}});}else {Log.e("Request failed", String.valueOf(response.code()));}} catch (IOException e) {throw new RuntimeException(e);}}}).start();}public native String stringFromJNI();
}

在这里插入图片描述

异步请求

public class MainActivity extends AppCompatActivity {// Used to load the 'okhttptest' library on application startup.static {System.loadLibrary("okhttptest");}private ActivityMainBinding binding;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);binding = ActivityMainBinding.inflate(getLayoutInflater());setContentView(binding.getRoot());// Example of a call to a native methodTextView tv = binding.sampleText;tv.setText(stringFromJNI());new Thread(new Runnable() {@Overridepublic void run() {// 创建 OkHttpClientOkHttpClient client = new OkHttpClient();// 创建 Request 对象Request request = new Request.Builder().url("https://www.httpbin.org/get")  // URL.build();// 同步请求client.newCall(request).enqueue(new Callback() {@Overridepublic void onFailure(@NonNull Call call, @NonNull IOException e) {Log.e("Request failed: ",e.getMessage());}@Overridepublic void onResponse(@NonNull Call call, @NonNull Response response) throws IOException {String ResponseBody = response.body().string();if (response.isSuccessful()){Log.e("Response: " ,ResponseBody);runOnUiThread(new Runnable() {@Overridepublic void run() {Toast.makeText(MainActivity.this,ResponseBody,Toast.LENGTH_SHORT).show();}});}else {Log.e("Request failed:",String.valueOf(response.code()));}}});}}).start();}public native String stringFromJNI();
}

在这里插入图片描述

POST请求

  允许通过HTTP访问网络资源,Android 默认禁止应用使用非加密(HTTP)通信,以保护用户数据的安全。默认情况下,Android 9(API 级别 28)及更高版本需要通过 HTTPS 进行网络通信。
  通过修改AndroidManifest.xml文件来临时允许明文HTTP流量。

    <applicationandroid:usesCleartextTraffic="true"...</application>

发送请求

public class MainActivity extends AppCompatActivity {// Used to load the 'okhttptest' library on application startup.static {System.loadLibrary("okhttptest");}private ActivityMainBinding binding;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);binding = ActivityMainBinding.inflate(getLayoutInflater());setContentView(binding.getRoot());// Example of a call to a native methodTextView tv = binding.sampleText;tv.setText(stringFromJNI());new Thread(new Runnable() {@Overridepublic void run() {// 创建 OkHttpClientOkHttpClient client = new OkHttpClient();RequestBody formBody = new FormBody.Builder().add("name","Bileton").add("age","21").build();// 创建 Request 对象Request request = new Request.Builder().url("http://www.httpbin.org/post")  // URL.post(formBody).build();// 同步请求client.newCall(request).enqueue(new Callback() {@Overridepublic void onFailure(@NonNull Call call, @NonNull IOException e) {Log.e("Request failed: ",e.getMessage());}@Overridepublic void onResponse(@NonNull Call call, @NonNull Response response) throws IOException {String ResponseBody = response.body().string();if (response.isSuccessful()){Log.e("Response: " ,ResponseBody);runOnUiThread(new Runnable() {@Overridepublic void run() {Toast.makeText(MainActivity.this,ResponseBody,Toast.LENGTH_SHORT).show();}});}else {Log.e("Request failed:",String.valueOf(response.code()));}}});}}).start();}public native String stringFromJNI();
}

在这里插入图片描述

拦截器

  OkHttp 的拦截器是一个非常强大的工具,可以在请求和响应过程中拦截和修改 HTTP 请求和响应。拦截器可以用于日志记录、修改请求/响应、添加通用头部信息、缓存等功能。

OkHttp提供了两种类型的拦截器:

  • 应用拦截器(Application Interceptor)
    应用拦截器可以在请求被发送之前或响应到达客户端之后进行拦截。应用拦截器不会直接影响网络层操作。

    OkHttpClient client = new OkHttpClient.Builder().addInterceptor(new Interceptor() {@Overridepublic Response intercept(Chain chain) throws IOException {Request originalRequest = chain.request();// 添加头部信息Request modifiedRequest = originalRequest.newBuilder().header("Authorization", "Bearer your_token").build();// 继续链条中的下一个拦截器return chain.proceed(modifiedRequest);}}).build();
    
  • 网络拦截器(Network Interceptor)
    网络拦截器更接近网络层,能访问和修改在网络上传输的数据。它们可以用来实现诸如缓存和压缩的功能。

    OkHttpClient client = new OkHttpClient.Builder().addNetworkInterceptor(new Interceptor() {@Overridepublic Response intercept(Chain chain) throws IOException {Request request = chain.request();// 打印请求信息long startTime = System.nanoTime();System.out.println(String.format("Sending request %s on %s%n%s",request.url(), chain.connection(), request.headers()));Response response = chain.proceed(request);// 打印响应信息long endTime = System.nanoTime();System.out.println(String.format("Received response for %s in %.1fms%n%s",response.request().url(), (endTime - startTime) / 1e6d, response.headers()));return response;}}).build();
    

在请求中使用拦截器

OkHttpClient client = new OkHttpClient.Builder().addInterceptor(new CustomInterceptor()) // 添加应用拦截器.addNetworkInterceptor(new CustomNetworkInterceptor()) // 添加网络拦截器.build();Request request = new Request.Builder().url("https://www.example.com").build();client.newCall(request).enqueue(new Callback() {@Overridepublic void onFailure(Call call, IOException e) {e.printStackTrace();}@Overridepublic void onResponse(Call call, Response response) throws IOException {if (response.isSuccessful()) {System.out.println(response.body().string());}}
});

http://www.mrgr.cn/news/67890.html

相关文章:

  • C语言 | Leetcode C语言题解之第538题把二叉搜索树转换为累加树
  • 青少年编程能力等级测评CPA试卷(2)Python编程(一级)
  • 如何在 Ubuntu 上安装和配置 GitLab
  • Mybatis延迟加载、鉴别器、继承
  • 《安富莱嵌入式周报》第345期:开源蓝牙游戏手柄,USB3.0 HUB带电压电流测量,LCR电桥前端模拟,开源微型赛车,RF信号扫描仪,开源无线电收发器
  • 【AIGC】腾讯云语音识别(ASR)服务在Spring Boot项目中的集成与实践
  • Linux 文件与目录管理
  • 实验(未完成)
  • 群晖NAS本地部署Cloud Sync结合内网穿透远程上传文件并云同步至网盘
  • 大模型应用编排工具Dify二开之工具和模型页面改造
  • 数据分析:宏基因组DESeq2差异分析筛选差异物种
  • Echarts实现柱状图和折线图等多种图形联动
  • [C语言]strstr函数的使用和模拟实现
  • Spark的yarn集群环境搭建
  • 用户信息管理系统烟草种植用户基于SpringBootSSM框架
  • 【ShuQiHere】️ ️ LC-3 指令集架构 (ISA) 全面解析
  • Mysql、Dm8达梦数据库通过脚本导出指定库所有表的结构详情信息到
  • 提交linux kernel patch流程
  • 第08章 排序ORDER BY
  • 大模型微调技术 --> LoRA 系列之 AdaLoRA
  • ABAP开发-内存管理
  • Flutter环境配置
  • 论文阅读《Structure-from-Motion Revisited》
  • Unet++改进3:添加NAMAttention注意力机制
  • 故障排查 之 单点登录跳转失败(Ingress 相关)
  • Linux系列-进程的状态