Android --- 网络请求

通常在 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"/>

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.hqwc.cn/news/652432.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Bytebase 2.16.0 - 支持 Oracle 和 SQL Server DML 变更的事前备份

&#x1f680; 新功能 支持 Oracle 和 SQL Server DML 变更的事前备份。 支持在 SQL 编辑器中显示存储过程和函数。 支持兼容 TDSQL 的 MySQL 和 PostgreSQL 版本。 支持把数据库密码存储在 AWS Secrets Manager 和 GCP Secret Manager。 支持通过 IAM 连接到 Google Clou…

Java | Leetcode Java题解之第52题N皇后II

题目&#xff1a; 题解&#xff1a; class Solution {public int totalNQueens(int n) {Set<Integer> columns new HashSet<Integer>();Set<Integer> diagonals1 new HashSet<Integer>();Set<Integer> diagonals2 new HashSet<Integer>…

ArcGIS小技巧—一文带你理清个人地理数据库和文件地理数据库

不知各位GISer在使用Arcgis软件时是否会遇到这样一个问题&#xff0c;在新建一个地理数据库来存放要素数据集时会有文件地理数据库和个人地理数据库两种&#xff0c;那么&#xff0c;这两种地理数据库有何区别呢&#xff1f; 首先&#xff0c;我们先来看看地理数据库的定义&…

Thread方法具体解析

对于run方法 如果该线程是使用单独的 Runnable run 对象构造的&#xff0c;则调用该 Runnable 对象的 run 方法&#xff1b;否则&#xff0c;此方法不执行任何操作并返回。 对于start方法 导致该线程开始执行&#xff1b; Java虚拟机调用该线程的run方法。 这里介绍一个快捷键…

【OceanBase诊断调优 】—— 如何快速定位SQL问题

作者简介&#xff1a; 花名&#xff1a;洪波&#xff0c;OceanBase 数据库解决方案架构师&#xff0c;目前负责 OceanBase 数据库在各大型互联网公司及企事业单位的落地与技术指导&#xff0c;曾就职于互联网大厂和金融科技公司&#xff0c;主导过多项数据库升级、迁移、国产化…

c++map类operator[]详解

定义 让我们来看一下标准库里对该函数的定义. map::operator[] - C Reference (cplusplus.com) 参数是一个key_val类型的值,返回值是对应key 的value值,如果key不存在的话,value会调用其默认构造函数来初始化. 使用 举个例子 int main() {map<string, string> dict{ {…

基于springboot的高校宣讲会管理系统

文章目录 项目介绍主要功能截图&#xff1a;部分代码展示设计总结项目获取方式 &#x1f345; 作者主页&#xff1a;超级无敌暴龙战士塔塔开 &#x1f345; 简介&#xff1a;Java领域优质创作者&#x1f3c6;、 简历模板、学习资料、面试题库【关注我&#xff0c;都给你】 &…

Ubuntu解密:Root账户登录问题一网打尽

欢迎来到我的博客&#xff0c;代码的世界里&#xff0c;每一行都是一个故事 Ubuntu解密&#xff1a;Root账户登录问题一网打尽 前言Root用户简介Root账户无法登录的原因重设Root账户密码解决ssh不能root登录问题安全性考虑 前言 Ubuntu作为广受欢迎的Linux发行版&#xff0c;对…

Vue3+ts(day03:ref和reactive)

学习源码可以看我的个人前端学习笔记 (github.com):qdxzw/frontlearningNotes 觉得有帮助的同学&#xff0c;可以点心心支持一下哈&#xff08;笔记是根据b站上学习的尚硅谷的前端视频【张天禹老师】&#xff0c;记录一下学习笔记&#xff0c;用于自己复盘&#xff0c;有需要学…

Docker 入门篇(二)-- Linux 环境离线安装

引言 docker 系列文章&#xff1a; Docker 入门篇&#xff08;一&#xff09;-- 简介与安装教程&#xff08;Windows和Linux&#xff09; 一、安装环境准备 centos &#xff1a;CentOS Linux release 7.6.1810 (Core)docker 版本&#xff1a;docker-26.1.0.tgz 官网下载地址…

Sy8网络管理命令(ubuntu23.10和centos8)

前言、 本次实验主要是扩展学习&#xff0c;不仅限在课本的内容。毕竟课本的内容太过于陈旧了。需要的童鞋看看。 说明&#xff1a;&#xff08;书本中sy9”第3.实验内容“大家还是要做下。&#xff09; 1、使用ubuntu做实验的童鞋只要看第二、三、四、七章节的部分内容。 2、使…

react-lib 读取本地模板创建PDF

读取本地文件和读取远程的一样&#xff0c;都使用fetch去获取 async function modifyPdf() {let url ./template.pdflet existingPdfBytes await fetch(url).then(res > res.arrayBuffer()) // 这里也有问题要转一下const d new Uint8Array(existingPdfBytes)const pdfDo…