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"/>

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>() {
            @Override
            public void onResponse(String response) {
                Log.e("volley---成功",response);
            }
        }, new com.android.volley.Response.ErrorListener() {
            @Override
            public 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>() {
            @Override
            public void onResponse(String response) {
                Log.e("volley---Post成功",response);
            }
        }, new com.android.volley.Response.ErrorListener() {
            @Override
            public 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() {
            @Override
            public void onFailure(@NonNull Call call, @NonNull IOException e) {
                Log.e("okhttp-----失败","okhttp失败");
            }

            @Override
            public 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() {
            @Override
            public void onFailure(@NonNull Call call, @NonNull IOException e) {
                Log.e("okhttp-----post失败",e.toString());

            }

            @Override
            public 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;

    @Override
    public 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;
    }

    @Override
    public 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());

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/588573.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【限免】雷达目标生成与探测研究项目【附MATLAB代码】

文章来源&#xff1a;微信公众号&#xff1a;EW Frontier 课题背景 该项目的目标是模拟FMCW雷达检测运动目标&#xff0c;然后执行信号处理功能&#xff0c;以估计模拟目标的距离和多普勒速度。 图1&#xff1a;雷达模拟和检测的项目工作流程 FMCW波形设计 根据系统要求设计…

JAVA Coding 规范

Coding 规范 文章目录 Coding 规范一.文件规范1.1 声明1.2 缩进1.3 空行1.4 空格1.5 对齐1.6 小括号1.7 花括号1.8 代码长度 二.命名规范2.1 命名总则2.2 命名空间2.3 类与接口2.4 方法命名2.5 属性命名2.6 常量命名2.7 变量命名 三.语句规范3.1 语句总则3.2 循环语句3.3 Switc…

windows rabbitMq安装

一、Erlang 环境准备 下载安装包 跟我们跑java项目&#xff0c;要装jdk类似。rabbitMQ是基于Erlang开发的&#xff0c;因此安装rabbitMQ服务器之前&#xff0c;需要先安装Erlang环境。 官网直接下载windows直装版本&#xff1a;https://www.erlang.org/downloads 无脑安装&a…

【CGALDotNet】CGAL的C#封装(C#调用编译好的CGAL的dll)

介绍 开源项目出处&#xff08;两个模块&#xff09;&#xff1a; 链接1&#xff1a;https://github.com/Scrawk/CGALDotNet/tree/master?tabreadme-ov-file 链接2&#xff1a;https://github.com/Scrawk/CGALDotNetGeometry 该项目提供了编译的、封装相关接口后的CGAL库&am…

C语言 | Leetcode C语言题解之第62题不同路径

题目&#xff1a; 题解&#xff1a; int uniquePaths(int m, int n) {long long ans 1;for (int x n, y 1; y < m; x, y) {ans ans * x / y;}return ans; }

“Unite“ > MacOS下很不错的网站转应用App的工具

前言 前不久在浏览mac论坛&#xff0c;无意了解到一款非常好的工具&#xff0c;可以将网站转换为app&#xff0c;考虑到我们现在的主要应用都从本地客户端转成web形式使用&#xff0c;但基于本能的使用习惯&#xff0c;还是希望有个快捷的访问信息&#xff0c;这个应用非常适合…

万兆以太网MAC设计(11)完整UDP协议栈仿真

文章目录 前言一、模块接口二、IP模块与ARP模块之间的联系三、整体协议栈仿真总结&#xff1a; 前言 目前除了巨帧处理逻辑之外&#xff0c;所有的准备工作都已经结束了&#xff0c;先进行整体的功能验证。 一、模块接口 所有模块接口皆采用AXIS数据流的形式&#xff0c;其中…

IDEA基于Maven构建项目

IDEA基于Maven构建项目 一、Maven简介 Apache Maven 是一个软件项目管理和理解工具。基于项目对象模型的概念&#xff08;POM&#xff09;&#xff0c;Maven 可以从中心信息中管理项目的构建、报告和文档。 Apache Maven 可以用于构建和管理任何基于 Java 的项目。 下载地址…

【Web】D^3CTF之浅聊d3pythonhttp——TE-CL请求走私

目录 step0 题目信息 step1 jwt空密钥伪造 step1.5 有关TE&CL的lab step2 TE-CL请求走私 payload1 payload2 step0 题目信息 注意到题目源码前端是flask写的&#xff0c;后端是web.py写的 frontend from flask import Flask, request, redirect, render_templat…

C#核心之面向对象-封装

面向对象-封装 文章目录 1、类和对象1、什么是类2、类的声明3、类声明语法4、类声明实例5、对象(类)6、实例化对象语法7、实例化对象 2、成员变量和访问修饰符1、成员变量2、访问修饰符3、成员变量的使用和初始值 3、成员方法1、成员方法声明2、成员方法的使用 4、构造函数和…

【工具类安装教程】IDEA Ui设计器JFormDesigner

1、下载插件 File->Settings->Plugins->JFormDesigner 2、注册教程 2.1注册机下载 链接&#xff1a;https://pan.baidu.com/s/1Rb1EMva5HIYbyBcYgCxIsw 提取码&#xff1a;6666 2.2找到目录 1、找到idea目录 2.3进入plugins目录 找到在JFormDesigner文件夹下lib文…

使用Gitbook生成电子书

背景 《Google工程实践文档》相对原文Google’s Engineering Practices documentation &#xff0c;部分内容过时了。需要更新中文版&#xff0c;并使用Gitbook把Markdown文件转换成对应的PDF电子书。   上一次生成PDF电子书是5年前&#xff0c;当时生成电子书的环境早已不在…

jenkins汉化不完全问题解决

jenkins安装完Localization:Chinese(Simplified)中文语言包后&#xff0c;发现是出现汉化不完全或者部分汉化的情况&#xff0c;如下图&#xff1a; 解决方法&#xff1a; 启动命令中指定语言 -Duser.languageen_US.UTF-8 或者 -Duser.languageC.UTF-8原因分析&#xff1a;安…

用户中心(下)

文章目录 计划登录逻辑接口简单说明cookie和session写代码流程后端逻辑层控制层测试用户管理接口 前端简化代码对接后端代理 计划 开发完成后端登录功能 &#xff08;单机登录 > 后续改造为分布式 / 第三方登录&#xff09;✔开发后端用户的管理接口 &#xff08;用户的查询…

南方Southmap4.0 一体成图软件

SouthMap 4.0 新增行业应用模块&#xff0c;实用工具箱扩展7大工具&#xff0c;集结8大模块&#xff0c;共45种实用功能&#xff0c;为水利、电力、道路施工等多应用场景提供数据生产的一站式解决方案。 SouthMap 4.0 新增行业应用模块&#xff0c;实用工具箱扩展7大工具&#…

前端素材库

大家好我是苏麟 , 今天推荐一个前端素材库 . 官网 : iconfont-阿里巴巴矢量图标库 这期就到这里 , 下期见!

【docker】docker compose 搭建私服

安装 Docker Registry 创建目录 mkdir -pv /usr/local/docker/registrymkdir -pv /usr/local/docker/data 创建 docker-compose.yml文件 进入目录创建docker-compose.yml cd /usr/local/docker/registrytouch docker-compose.yml 编辑docker-compose.yml vim docker-compo…

探索洗牌算法的魅力与杨辉三角的奥秘:顺序表的实际运用

目录 目录 前言~&#x1f973;&#x1f389;&#x1f389;&#x1f389; 洗牌算法 准备工作 买一副牌 洗牌 发牌 测试整体 &#x1f3af;&#x1f3af;很重要的一点 杨辉三角 总结 前言~&#x1f973;&#x1f389;&#x1f389;&#x1f389; Hello, Hello~ …

YOLOv9/YOLOv8算法改进【NO.128】 使用ICCV2023超轻量级且高效的动态上采样器( DySample)改进yolov8中的上采样

前 言 YOLO算法改进系列出到这&#xff0c;很多朋友问改进如何选择是最佳的&#xff0c;下面我就根据个人多年的写作发文章以及指导发文章的经验来看&#xff0c;按照优先顺序进行排序讲解YOLO算法改进方法的顺序选择。具体有需求的同学可以私信我沟通&#xff1a; 首推…

PaLmTac嵌入软体手手掌的视触觉传感器

触觉是感知和操作之间的桥梁。触觉信息对于手部行为反馈和规划具有重要意义。软体手的柔性特性在人机交互、生物医学设备和假肢等方面具有潜在应用的优势。本文提出了一种名为 PaLmTac的嵌入软体手手掌的视触觉传感器&#xff08;vision-based tactile sensor, VBTS&#xff09…