Android --- 网络请求

news/2024/5/17 18:22:22

通常在 Android 中进行网络连接一般使用 Scoket 和HTTP,HTTP 请求方式比 Scoket 多。HTTP 请求一般采用原生的 HttpClient 和 HttpUrlConnection 的两种网络访问方式(系统自带的)。但是在 Android 5.0 的时候 Google 就不推荐使用 HttpClient 了,到了 Android 6.0 (api 23) SDK,不再提供 org.apache.http.* (只保留几个类), 因此,设置 android SDK 的编译版本为23时,且使用了 httpClient 相关类的库项目:如 android-async-http 等等,会出现有一些类找不到的错误。

添加权限

开始网络请求之前应该在清单文件中添加网络权限

<uses-permission android:name="android.permission.INTERNET"/>

Volley

GitHub - google/volley

volley适用于数据量不大、通信频繁的场景,如:带图片的列表

添加依赖:

dependencies {implementation ("com.android.volley:volley:1.2.1")
}

常用api:

RequestQueue:请求队列,会自动执行队列中的请求

  • Volley.newRequestQueue(context) 创建一个请求队列
 public static RequestQueue newRequestQueue(Context context)
  • RequestQueue.add(Request<T> request) 添加一个请求到请求队列
public <T> Request<T> add(Request<T> request)

 Request<T> :代表请求的接口

  • StringRequest:获取字符串结果的请求

 public StringRequest(int method,String url,Listener<String> listener, @Nullable ErrorListener errorListener) 
  • JsonRequest:获取json数据结果的请求,不过由于JsonRequest是一个抽象类,因此我们无法直接创建它的实例,那么只能从它的子类入手了。JsonRequest有两个直接的子类,JsonObjectRequest和JsonArrayRequest,它返回的对象是JSONObject。

public JsonObjectRequest(String url, Listener<JSONObject> listener, @Nullable ErrorListener errorListener)
 public JsonArrayRequest(String url, Listener<JSONArray> listener, @Nullable ErrorListener errorListener)
  • ImageRequest:获取图片结果的请求

public ImageRequest(String url,Response.Listener<Bitmap> listener,int maxWidth,int maxHeight,ScaleType scaleType,Config decodeConfig,@Nullable Response.ErrorListener errorListener);

步骤:

创建请求队列

创建请求对象

添加请求 

Get请求

    public String url = "https://reqres.in/api/users";public void toLearnVolley(View view){// 1.创建请求队列RequestQueue requestQueue = Volley.newRequestQueue(this);// 2.创建请求StringRequest stringRequest = new StringRequest(com.android.volley.Request.Method.GET, url, new com.android.volley.Response.Listener<String>() {@Overridepublic void onResponse(String response) {Log.e("volley---成功",response);}}, new com.android.volley.Response.ErrorListener() {@Overridepublic void onErrorResponse(VolleyError error) {Log.e("volley---失败",error.toString());}});// 3.将请求加入请求队列requestQueue.add(stringRequest);}

Post请求

volley中并没有提供设置POST参数的方法,但是当发出POST请求的时候,Volley会尝试调用StringRequest的父类——Request中的getParams()方法来获取POST参数,所以需要在Request的匿名类中重写getParams()方法

 public String postUrl = "https://www.wanandroid.com/user/login";public void toLearnVolleyPost(View view){// 如何放入请求体?StringRequest stringPostRequest = new StringRequest(com.android.volley.Request.Method.POST, postUrl, new com.android.volley.Response.Listener<String>() {@Overridepublic void onResponse(String response) {Log.e("volley---Post成功",response);}}, new com.android.volley.Response.ErrorListener() {@Overridepublic void onErrorResponse(VolleyError error) {Log.e("volley---Post失败",error.toString());}}){@Nullable@Override// 重写此方法返回参数的map作为请求体protected Map<String, String> getParams() throws AuthFailureError {Map<String,String> map = new HashMap<String,String>();map.put("username","akshfalwhfaina");map.put("password","123456");return map;}};requestQueue.add(stringPostRequest);}

OkHttp

添加依赖

在build.gradle.kts中添加依赖

dependencies {// 添加okhttp的依赖implementation("com.squareup.okhttp3:okhttp:4.11.0")
}

 get请求

    public void toLearnOKhttp(View view) {// 创建一个 OKhttp 客户端OkHttpClient okHttpClient = new OkHttpClient();// 创建一个 http 请求Request request = new Request.Builder().url("https://reqres.in/api/users").get().build();// Call 是一个即将准备好被执行的请求Call call = okHttpClient.newCall(request);// 执行请求,并定义回调函数// 请求成功后数据封装在response的body里面call.enqueue(new Callback() {@Overridepublic void onFailure(@NonNull Call call, @NonNull IOException e) {Log.e("okhttp-----失败","okhttp失败");}@Overridepublic void onResponse(@NonNull Call call, @NonNull Response response) throws IOException {if(response.isSuccessful()){String data = response.body().string();Log.i("okhttp-----成功",data);}}});}

post请求

POST请求将参数放在请求的主体中,不会直接显示在URL中。

public void toLearnOKhttpPost(View view){// 创建一个 OKhttp 客户端OkHttpClient okHttpClient = new OkHttpClient();// 创建一个 http 请求RequestBody body = new FormBody.Builder().add("username","akshfalwhfaina").add("password","123456").build();Request request = new Request.Builder().url("https://www.wanandroid.com/user/login").post(body).build();Call call = okHttpClient.newCall(request);call.enqueue(new Callback() {@Overridepublic void onFailure(@NonNull Call call, @NonNull IOException e) {Log.e("okhttp-----post失败",e.toString());}@Overridepublic void onResponse(@NonNull Call call, @NonNull Response response) throws IOException {Log.e("okhttp-----post成功",response.toString());}});}

Json数据解析

json对象:花括号开头和结尾,中间是键值对形式————”属性”:属性值””

json数组:中括号里放置 json 数组,里面是多个json对象或者数字等

JSONObject

利用 JSONObject 解析
1.创建 JSONObject 对象,传入满足 json 格式的字符串
2.根据 json数据的key键值 获取其中的数据,是什么类型的数据就写getxx()
3.getJSONObject("xxx") 获取JSONObject对象
4.getJSONArray("xxx") 获取json数组
5.jsonArray.getJSONObject(i) 获取数组中的第 i 个json对象

请求返回的数据如下:

JSONObject jsonObject = new JSONObject(data);
Log.i("okhttp-----成功","总共数量"+jsonObject.getString("total"));
// data 里面是 json 数组,数组里面放的是多个 json 对象
JSONArray jsonArray = jsonObject.getJSONArray("data");
for (int i = 0; i < jsonArray.length(); i++) {JSONObject jo = jsonArray.getJSONObject(i); // 获取数组中的第 i 个对象String text1 = jo.getString("email");Log.i("okhttp-----成功--邮箱","邮箱"+text1);}
} catch (JSONException e) {throw new RuntimeException(e);
}

Gson解析

用第三方工具来解析json数据

添加依赖

// 1.添加 gson 依赖
implementation("com.google.code.gson:gson:2.8.9")
  • 创建 Bean 对象(数据对象),注意,元素和返回的数据的元素要一一对应。
  • toJson:将 bean 对象转换成 json 字符串
  • fromJson:将 json 字符串转换成 bean 对象
package com.example.androidstudiostudy.data;import java.util.List;// 一个json 的数据对象(来自于GET返回的 json 字符串)
public class OneJsonBean {private int page;private int per_page;private int total;private int total_pages;private List<DataBean> data;@Overridepublic String toString() {return "OneJsonBean对象{" +"page=" + page +", per_page=" + per_page +", total=" + total +", total_pages=" + total_pages +", data=" + data +'}';}
}
package com.example.androidstudiostudy.data;// 此时的 DataBean 是 GET 返回的json字符串中 data的json对象
public class DataBean {private int id;private String email;private String first_name;private String last_name;private String avatar;public DataBean(int id, String email, String first_name, String last_name, String avatar) {this.id = id;this.email = email;this.first_name = first_name;this.last_name = last_name;this.avatar = avatar;}public int getId() {return id;}public String getEmail() {return email;}public String getFirst_name() {return first_name;}public String getLast_name() {return last_name;}public String getAvatar() {return avatar;}@Overridepublic String toString() {return "DataBean{" +"id=" + id +", email='" + email + '\'' +", first_name='" + first_name + '\'' +", last_name='" + last_name + '\'' +", avatar='" + avatar + '\'' +'}';}
}
// Gson解析json数据
Gson gson = new Gson();
OneJsonBean  oneJsonBean = gson.fromJson(data, OneJsonBean.class);
Log.e("okhttp-----成功--数据转换成对象",oneJsonBean.toString());


http://www.mrgr.cn/p/36233345

相关文章

docker各目录含义

目录含义builder构建docker镜像的工具或过程buildkit用于构建和打包容器镜像&#xff0c;官方构建引擎&#xff0c;支持多阶段构建、缓存管理、并行化构建和多平台构建等功能containerd负责容器生命周期管理&#xff0c;能起、停、重启&#xff0c;确保容器运行。负责镜管理&am…

使用 BurpSuite 基于 Token 机制实施暴力破解

前言 Token是一种用于身份验证和授权的令牌&#xff0c;通常由服务器生成并发送给客户端&#xff0c;客户端在后续的请求中携带该令牌来进行身份验证和授权操作。Token的使用可以增强应用程序的安全性&#xff0c;避免了直接传递敏感凭证&#xff08;如用户名和密码&#xff0…

PHP算命源码_最新测算塔罗源码_可以运营

众筹商城源码 众筹商品平台 商城加共识元富之路 网上商城众筹 前端是编译后的&#xff0c;后端PHP&#xff0c;带商城 运行截图 源码贡献 https://githubs.xyz/boot?app39 部分数据库表 CREATE TABLE ti_shopro_store (id int(11) NOT NULL AUTO_INCREMENT COMMENT ID,nam…

02 spring-boot+mybatis+elementui 的登录,文件上传,增删改查的入门级项目

前言 主要是来自于 朋友的需求 项目概况 就是一个 学生信息的增删改查 然后 具体到业务这边 使用 mybatis xml 来配置的增删改查 后端这边 springboot mybatis mysql fastjson hutool 的一个基础的增删改查的学习项目, 简单容易上手 前端这边 node14 vue element…

字典及GitHub字典爬取工具

红队API接口Fuzz字典可以用于WEB安全&#xff0c;渗透测试&#xff0c;SRC等场景 完整文件已上传知识星球&#xff0c;需要的朋友可加入查看。

闲话 ASP.NET Core 数据校验(二):FluentValidation 基本用法

前言 除了使用 ASP.NET Core 内置框架来校验数据&#xff0c;事实上&#xff0c;通过很多第三方框架校验数据&#xff0c;更具优势。 比如 FluentValidation&#xff0c;FluentValidation 是第三方的数据校验框架&#xff0c;具有许多优势&#xff0c;是开发人员首选的数据校验…

打印机-STM32版本 硬件部分

最终PCB EDA工程: 一、确定芯片型号 根据项目需求&#xff0c;梳理需要用到的功能&#xff0c; 电量检测&#xff1a;ADC 按键&#xff1a;IO input外部中断 LED&#xff1a;IO output 温度检测&#xff1a;ADC 电机控制&#xff1a;IO output 打印通讯&#xff1a;SPI …

分布式与一致性协议之Paxos算法(三)

Paxos算法 兰伯特关于Multi-Paxos的思考 领导者 我们可以通过引入领导者(Leader)节点来解决第一个问题。也就是说将领导者节点作为唯一提议者&#xff0c;如图所示。这样就不存在多个提议者同时提交提案的情况&#xff0c;也就不存在提案冲突的情况了。这里补充一点:在论文中…

springboot整合knfi4j

1.pom文件添加依赖 <dependency><groupId>com.github.xiaoymin</groupId><artifactId>knife4j-spring-boot-starter</artifactId><version>3.0.3</version></dependency>2.配置knfi4j @Configuration @EnableSwagger2 @Enable…

mac M2 配置item2 rzsz

背景 apple m 系列处理器安装的 homebrew 跟 intel 处理器略有不同&#xff0c;其中安装目录的区别&#xff1a; m 系列处理器安装目录为 /usr/local/bin/homebrew intel 处理器安装目录为 /opt/homebrew 问题1: 卡住 产生原因&#xff1a; m 系列使用 brew install lrzs…

Delta模拟器:iOS上的复古游戏天堂

Delta模拟器&#xff1a;iOS上的复古游戏天堂 在数字时代&#xff0c;我们有时会怀念起那些早期的电子游戏&#xff0c;它们简单、纯粹&#xff0c;带给我们无尽的乐趣。虽然现在的游戏在画质和玩法上都有了巨大的提升&#xff0c;但那种复古的感觉却始终无法替代。幸运的是&a…

06_电子设计教程基础篇(学习视频推荐)

文章目录 前言一、基础视频1、电路原理3、模电4、高频电子线路5、电力电子技术6、数学物理方法7、电磁场与电磁波8、信号系统9、自动控制原理10、通信原理11、单片机原理 二、科普视频1、工科男孙老师2、达尔闻3、爱上半导体4、华秋商城5、JT硬件乐趣6、洋桃电子 三、教学视频1…

github在开启双因素认证后无法push

github在开启了双因素认证后,无法push代码 解决办法 1.打开github,点击右上角头像,点击setting2.选择左边菜单最右下角的Developer Settings3.点击 Person access tokens,选择第二个,Tokens(classic)4.创建一个token,可以选择过期时间和权限,如果是个人使用,直接选择不过期,勾上…

向量的旋转矩阵

我们都知道&#xff0c;矩阵的乘法可以表示旋转。那么&#xff0c;这一理论的数学机理是什么呢&#xff1f;以及&#xff0c;这个旋转角度该怎么用矩阵表示呢&#xff1f; 本文用二维向量旋转来推导旋转矩阵的公式。假设&#xff0c;我们有一个向量P(x, y)&#xff0c;准备通过…

C语言-调试技巧

目录 一、调试介绍1.1 Debug和Release的介绍1.2 Windows环境调试介绍1.2.1 学会快捷键1.2.2 查看临时变量的值1.2.3 查看内存信息1.2.4 查看调用堆栈1.2.4 查看汇编信息1.2.5 查看寄存器信息 二、编程常见的错误2.1 编译型错误2.2 链接型错误2.3 运行时错误 三、易于调试的代码…

PEI是聚醚酰亚胺(Polyetherimide)主要作用是什么?

PEI是聚醚酰亚胺&#xff08;Polyetherimide&#xff09;主要作用是什么&#xff1f; 聚醚酰亚胺&#xff08;Polyetherimide&#xff0c;PEI&#xff09;作为一种高性能的工程塑料&#xff0c;具有多种优异的性能&#xff0c;因此在不同领域中有广泛的应用。其主要作用包括&…

Visual Studio安装MFC开发组件

MFC由于比较古老了&#xff0c;Visual Studio默认没有这个开发组件。最近由于一些原因&#xff0c;需要使用这个库&#xff0c;这就需要另外安装。 参考了网上的一些资料&#xff0c;根据实际使用&#xff0c;其实很多步骤不是必须的。 https://zhuanlan.zhihu.com/p/68117276…

【Scala---01】Scala『 Scala简介 | 函数式编程简介 | Scala VS Java | 安装与部署』

文章目录 1. Scala简介2. 函数式编程简介3. Scala VS Java4. 安装与部署 1. Scala简介 Scala是由于Spark的流行而兴起的。Scala是高级语言&#xff0c;Scala底层使用的是Java&#xff0c;可以看做是对Java的进一步封装&#xff0c;更加简洁&#xff0c;代码量是Java的一半。 因…

mysql刷题题后感

刷题的时候会将一些题目收藏,也会收藏错题,做完了整合一下,会有一些补充知识点。函数篇(和长篇大论的查询有交集) Q1: 查询语句select stuff(lo ina,3, 1, ve ch)结果为?love love china china love china答:stuff,删除并加入字符,STUFF(原字符, 开始位置, 删除长度,…

软件设计师:UML

UML基本概念UML(Unified Modeling Language,统一建模语言) UML词汇表包含3种构造块:事物、关系、图 事物结构事物:静态部分,如类、接口、用例等 行为事物:动态部分,如交互、状态机、活动 分组事物:包Package 注释事物:注释关系 UML中有4种关系:依赖、关联、泛化、实现…