安卓开发Android studio学习笔记15:关于如何使用Okhttp框架的网络请求(调用API接口)

news2025/4/17 5:38:21

Android studio

  • 一、安卓基于HTTP网络编程
    • (一)、两种请求方式
    • (二)、安卓基于HTTP网络编程的两种方式
      • 1、使用HttpURLConnection访问网络资源**
      • 2、利用HttpClient访问网络资源**
        • (1)HttpGet
        • (2)HttpPost
  • 二、基础Okhttp的网络编程
      • 1、okhttp的环境配置
      • 2、OkHttp介绍
        • 2.1 okhttp get的同步请求
        • 2.2 okhttp get的异步请求
        • 2.3 okhttp post的同步请求
        • 2.4okhttp post的异步请求
      • 3.获取案例演示
        • 1.postschooldata.java
        • 2.myapplication.java
        • 3.activity_postdata.xml
        • 4.activity_querydrive.xml
        • 5.AndroidManifest.xml
        • 6.xml文件夹下的:network_https_config.xml
        • 7.运行结果截图

一、安卓基于HTTP网络编程

(一)、两种请求方式

HTTP协议中有两种不同的请求方式——GET方式和POST方式。

  • GET方式在进行数据请求时,会把数据附加到URL后面传递给服务器,比如常见的:http://XXX.XXX.XXX/XX.jsp?id=1
  • POST方式则是将请求的数据放到HTTP请求头中,作为请求头的一部分传入服务器。

所以,在进行HTTP编程前,首先要明确究竟使用的哪种方式进行数据请求的。

(二)、安卓基于HTTP网络编程的两种方式

1、使用HttpURLConnection访问网络资源**

HttpURLConnection conn = null;                         
String strUrl = "http://www.baidu.com";                
URL url = new URL(strUrl);                             
conn = (HttpURLConnection) url.openConnection();       
  • HttpURLConnection对网络资源的请求在默认情况下是使用GET方式的,所以当使用GET方式时,不需要我们做太多的工作;当我们需要使用POST方式时,就需要使用setRequestMethod(“POST”)来设置POST请求方式了。

2、利用HttpClient访问网络资源**

  • HttpClient类不是来自安卓,而是来自org.apache.http。和HttpURLConnection相同,HttpClient也存在GET和POST两种请求方式。

(1)HttpGet

在HttpClient中,我们可以非常轻松使用HttpGet对象来通过GET方式进行数据请求操作,当获得HttpGet对象后我们可以使用HttpClient的execute方法来向我们的服务器发送请求。在发送的GET请求被服务器相应后,会返回一个HttpResponse响应对象,利用这个响应的对象我们能够获得响应回来的状态码,如:200、400、401等等。

public String HttpGetMethod() {                                                   
    String result = "";                                                           
    try {                                                                         
        HttpGet httpRequest = new HttpGet(strUrl);                                
        HttpClient httpClient = new DefaultHttpClient();                          
        HttpResponse httpResponse = httpClient.execute(httpRequest);              
        if (httpResponse.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {   
            result = EntityUtils.toString(httpResponse.getEntity());              
        } else {                                                                  
            result = "null";                                                      
        }                                                                         
        return result;                                                            
    } catch (Exception e) {                                                       
        return null;                                                              
    }                                                                             
}             

(2)HttpPost

当我们使用POST方式时,我们可以使用HttpPost类来进行操作。当获取了HttpPost对象后,我们就需要向这个请求体传入键值对,这个键值对我们可以使用NameValuePair对象来进行构造,然后再使用HttpRequest对象最终构造我们的请求体,最后使用HttpClient的execute方法来发送我们的请求,并在得到响应后返回一个HttpResponse对象。其他操作和我们在HttpGet对象中的操作一样。

public String HttpPostMethod(String key, String value) {                            
    String result = "";                                                             
    try {                                                                           
        // HttpPost连接对象                                                             
        HttpPost httpRequest = new HttpPost(strUrl);                                
        // 使用NameValuePair来保存要传递的Post参数                                             
        List<NameValuePair> params = new ArrayList<NameValuePair>();                
        // 添加要传递的参数                                                                 
        params.add(new BasicNameValuePair(key, value));                             
        // 设置字符集                                                                    
        HttpEntity httpentity = new UrlEncodedFormEntity(params, "Utf-8");          
        // 请求httpRequest                                                            
        httpRequest.setEntity(httpentity);                                          
        // 取得默认的HttpClient                                                          
        HttpClient httpclient = new DefaultHttpClient();                            
        // 取得HttpResponse                                                           
        HttpResponse httpResponse = httpclient.execute(httpRequest);                
        // HttpStatus.SC_OK表示连接成功                                                   
        if (httpResponse.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {     
            // 取得返回的字符串                                                             
            result = EntityUtils.toString(httpResponse.getEntity());                
            return result;                                                          
        } else {                                                                    
            return "null";                                                          
        }                                                                           
    } catch (Exception e) {                                                         
        return null;                                                                
    }                                                                               
}                                    

二、基础Okhttp的网络编程

android网络框架之OKhttp,一个处理网络请求的开源项目,是安卓端最火热的轻量级框架。android在开发的时候很少直接与数据库打交道,所以就有了通过接口的方式使android与数据库间接通信,通信方式就是使用okhttp插件。

1、okhttp的环境配置

implementation 'com.squareup.okhttp3:okhttp:4.9.0'
  • 并且在清单文件中打开网络权限

2、OkHttp介绍

OkHttp分为get和post请求,在这两种请求中又分为同步和异步的请求。同步的意思就是得等到服务器有相应才会继续往下走,所以同步的方式都需要开启一个线程。

2.1 okhttp get的同步请求

    //注意网络同步请求必须要有一个子线程
    //get同步请求
    public void getSync(View view) {
      new Thread(){
          @Override
          public void run() {
              //get请求参数可以直接写在url后面
              //https://www.httpbin.org/get为开源测试网址
              Request request = new Request.Builder().url("https://www.httpbin.org/get?a=1&b=2").build();
              //请求的call对象
              Call call=okHttpClient.newCall(request);
              try{
                  Response response =call.execute();
                  Log.e("get同步请求:", "getSync:"+response.body().string() );
              }catch (IOException e){
                  e.printStackTrace();
              }
          }
      }.start();
   }

2.2 okhttp get的异步请求

//异步不需要创建线程
    public void getAsync(View view) {
        Request request = new Request.Builder().url("https://www.httpbin.org/get?a=1&b=2").build();
        //请求的call对象
        Call call=okHttpClient.newCall(request);
        //异步请求
        call.enqueue(new Callback() {
            //失败的请求
            @Override
            public void onFailure(@NonNull Call call, @NonNull IOException e) {
 
            }
            //结束的回调
            @Override
            public void onResponse(@NonNull Call call, @NonNull Response response) throws IOException {
                //响应码可能是404也可能是200都会走这个方法
                if(response.isSuccessful()){
                    Log.e("get异步请求:", "getASync:"+response.body().string() );
                }
            }
        });
    }

2.3 okhttp post的同步请求

 //okp默认是get请求,post需要有请求体,即formBody
    public void postSync(View view) {
        new Thread(){
            @Override
            public void run() {
                FormBody formBody = new FormBody.Builder().add("a", "1").add("b", "2").build();
                Request request = new Request.Builder().url("https://www.httpbin.org/post")
                        .post(formBody)
                        .build();
                //请求的call对象
                Call call=okHttpClient.newCall(request);
                try{
                    Response response =call.execute();
                    Log.e("pot同步请求", "postSync:"+response.body().string() );
                }catch (IOException e){
                    e.printStackTrace();
                }
            }
        }.start();
    }

2.4okhttp post的异步请求

public void postAsync(View view) {
        FormBody formBody = new FormBody.Builder().add("a", "1").add("b", "2").build();
        Request request = new Request.Builder().url("https://www.httpbin.org/post")
                .post(formBody)
                .build();
        Call call=okHttpClient.newCall(request);
        call.enqueue(new Callback() {
            @Override
            public void onFailure(@NonNull Call call, @NonNull IOException e) {
 
            }
            @Override
            public void onResponse(@NonNull Call call, @NonNull Response response) throws IOException {
                if(response.isSuccessful()){
                    Log.e("pot异步请求", "postASync:"+response.body().string() );
                }
            }
        });
    }

3.获取案例演示

1.postschooldata.java

package com.example.newnewnet.school;

import android.annotation.SuppressLint;
import android.content.Intent;
import android.os.Bundle;
import android.text.Html;
import android.util.Log;
import android.view.View;
import android.widget.TextView;

import androidx.appcompat.app.AppCompatActivity;

import com.example.newnewnet.R;
import com.example.newnewnet.myapplication;
import com.example.newnewnet.entities.newRoot;
import com.google.gson.Gson;
import com.google.gson.JsonObject;
import com.google.gson.reflect.TypeToken;

import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import okhttp3.Cookie;
import okhttp3.FormBody;
import okhttp3.MediaType;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;

public class postschooldata extends AppCompatActivity {

    private TextView showdata;
    private OkHttpClient okHttpClient;
    private Map<String,List<Cookie>> cookies = new HashMap<>();
    private String token;

    @SuppressLint("MissingInflatedId")
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_postdata);
        showdata = findViewById(R.id.showdata);

        okHttpClient = new OkHttpClient.Builder().build();

        token = myapplication.token;
    }

    public void postData(View view){

        JsonObject jsonObject = new JsonObject();
        jsonObject.addProperty("username","user10");
        jsonObject.addProperty("password","lisnso");

        MediaType mediaType = MediaType.Companion.parse("application/json;charset=utf-8");
        RequestBody body = RequestBody.Companion.create(String.valueOf(jsonObject),mediaType);
        new Thread(() -> {
            Request request = new Request.Builder()
                    .url("http://192.168.176.22:80/rest/account/login")
                    .post(body).build();

            try {
                Response execute = okHttpClient.newCall(request).execute();
                String result = execute.body().string();
                System.out.println(result);
                runOnUiThread(new Runnable() {

                    @Override
                    public void run() {
                        showdata.setText(Html.fromHtml(result,Html.FROM_HTML_MODE_COMPACT));
                        Gson gson = new Gson();
                        newRoot response = gson.fromJson(result, new TypeToken<newRoot>() {
                        }.getType());
                        token = response.getData().getToken();

                        myapplication.token = token;
                        System.out.println(token);

//
                        Intent intent = new Intent(postschooldata.this, querydriveActivity.class);
                        startActivity(intent);
                    }
                });
                Log.d("这个是token", String.valueOf(token));
            } catch (IOException e) {
                e.printStackTrace();
            }

        }).start();
    }

    public void userdata(View view){
        new Thread(() -> {
            FormBody add = new FormBody.Builder().add("aa", "bb").build();
            Request request = new Request.Builder()
                    .url("http://192.168.176.20/rest/sysmodel/listDeviceControlTypes")
                    .addHeader("Content-Type","application/json")
                    .addHeader("authorization",token)
                    .post(add).build();

            try {
                Response execute = okHttpClient.newCall(request).execute();
                System.out.println(execute.body().string());
            } catch (IOException e) {
                e.printStackTrace();
            }

        }).start();
    }
}

2.myapplication.java

package com.example.newnewnet;

import android.app.Application;

public class myapplication extends Application{

    private static myapplication mApp;
    public static String token;
    public static myapplication getInstance(){
        return mApp;
    }
}

3.activity_postdata.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="post数据"
        android:onClick="postData"/>

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="post数据"
        android:onClick="userdata"/>

    <TextView
        android:id="@+id/showdata"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>

</LinearLayout>

4.activity_querydrive.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="post所有设备信息"
        android:onClick="postqurayDrive"/>

    <TextView
        android:id="@+id/showdata"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>

</LinearLayout>

5.AndroidManifest.xml

打开网络权限

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

6.xml文件夹下的:network_https_config.xml

<?xml version ="1.0" encoding ="utf-8"?>
<network-security-config>
    <base-config cleartextTrafficPermitted="true" />
</network-security-config>

7.运行结果截图

在这里插入图片描述
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

修改 echarts 默认样式记录

1、修改折线图上的数据标记点 showSymbol:false , 表示不展示数据点&#xff0c;只有鼠标 hover 时&#xff0c; tooltip 展示。 series: [{name: 进场, // 名称&#xff0c;图例和 tooltip 中展示showSymbol: false, // 不展示数据标记点type: line, // 类型color: #0091FF…

大学解惑10 - CSS中的content怎么换行,以及使用before伪类的优点

大学解惑09 - 单独用HTML javascript CSS 实现三版99乘法表&#xff0c;你就是班里最靓的仔https://blog.csdn.net/xingyu_qie/article/details/127631612 ☆ 上一篇文章用前端HTML CSS JS基础写了3版99乘法表&#xff0c;有同学说终于把99乘法表写透了&#xff0c;但是紧接着就…

Linux关于JDK、Tomcat以及MySQL安装

目录 一、JDK安装 1、 上传jdk、tomcat安装包 2、解压两个工具包 3、配置环境 4、在配置文件中加入java环境变量&#xff1a; 5、保存&#xff0c;让新设置的环境变量生效 二、Tomcat安装 1、将tomcat解压到/opt下 2、配置环境变量 3、启动tomcat 4、创建启动脚本 三…

入门学习XSS漏洞,这一篇就够了

入门学习XSS漏洞&#xff0c;这一篇就够了1.XSS简介2.XSS的类型反射型XSS存储型XSSDOM型XSS1.XSS简介 XSS攻击&#xff0c;通常指黑客通过“HTML注入”篡改了网页&#xff0c;插入了恶意的脚本&#xff0c;从而在用户浏览网页时&#xff0c;控制用户浏览器的一种攻击。在一开始…

【沐风老师】怎么在3DMAX中使用MAXScript脚本动画编程?

大家可能对3dmax都抱有很浓厚的兴趣,但如果你接触到max脚本(MAXScript),你会觉得它比max本身更让人着迷,因为它更能拓展我们的想象力,或者帮助我们更好的提高工作效率。不过,MAXScript是解释语言,不适合编写过于复杂的功能,因为这将大大影响执行的速度。 言归正传,就…

jmeter模拟多IP访问

1. 前言&#xff1a; 今天一同事在压测时提到怎么用jmeter里虚拟多个ip来发送请求&#xff0c;我想了一下以前用LR时用过虚拟ip地址&#xff0c;jmeter还没有使用过。想着原理应该是相通的&#xff0c;既然LR都能支持的话&#xff0c;那Jmeter应该也是支持&#xff0c;于是就有…

ARM pwn 入门 (1)

最近笔者刚刚加入了一个项目组&#xff0c;需要用到ARM架构的东西&#xff0c;和ARM pwn也有一定关系&#xff0c;因此一不做二不休&#xff0c;决定开始学习ARM pwn&#xff0c;顺便熟悉项目前置知识&#xff0c;一举两得。 ARM与x86分属不同架构&#xff0c;指令集不同&…

用frp搞个内网穿透

使用场景&#xff1a; 在公司用电脑敲代码&#xff0c;环境都是localhost&#xff0c;有时候你要接第三方接口比如支付、或者企业微信的事件回调等&#xff0c;都需要一个公网地址&#xff0c;因为这时候是开发阶段&#xff0c;你即想要公司电脑上运行的环境又想要回调能找到你…

2022年首家民营征信机构浙江同信获企业征信备案公示

2022年首家民营征信机构浙江同信获企业征信备案公示 2022年11月1日&#xff0c;中国人民银行杭州中心支行公示了浙江同信企业征信服务有限公司企业征信机构备案&#xff0c;该机构为浙江省进行备案公示的第九家机构。其他八家分别为芝麻信用管理有限公司、浙江有数数智科技有限…

Transform介绍(1)

文章目录1. transform 方法2. transform 增量模式3. 注册 Transform使用Transform的常见场景有埋点统计、耗时监控、方法替换 通过上图以我们了解下transform的作用&#xff0c;transform在 class 到 dex 之间工作&#xff0c;处理包括 javac 编译后的字节码文件&#xff0c;每…

【Linux内核系列】进程调度

目录 一、为什么要调度 二、调度均衡 三、进程调度框架 3.1 调度队列 3.2 进程唤醒 3.3 调度时机 主动调度&#xff1a; 被动调度&#xff1a; 四、调度算法 4.1 先来先服务调度算法 4.2 最短作业优先调度算法 4.3 高响应比优先调度算法 4.4 时间片轮转调度算法 …

洛谷千题详解 | P1007 独木桥【C++、Pascal语言】

博主主页&#xff1a;Yu仙笙 专栏地址&#xff1a;洛谷千题详解 目录 题目背景 题目描述 输入格式 输出格式 输入输出样例 解析&#xff1a; C源码&#xff1a; Pascal源码&#xff1a; ------------------------------------------------------------------------------------…

NFT 推荐|辛迪加黑市系列第一弹

由 Planet Rift 呈现&#xff01; 塞巴星球的辛迪加已经洗劫了政府&#xff0c;现在是时候揭开补给品的神秘面纱了&#xff01; 辛迪加黑市系列的第一弹包括 30 个由 Planet Rift 宇宙设计的资产。其中首次发售的包含 4 套未来风格的盔甲、3 台彩色自动售货机和其他装备。 别忘…

项目管理之项目干系人

目录 前言 一、项目干系人的重要性 二、项目干系人管理过程 三、识别干系人 1.识别干系人的概念定义 2.识别干系人的输入 3.干系人分类模型 4.识别干系人的工具与技术 5.识别干系人的输出 四、规划干系人管理 1.规划干系人的输入 2.规划干系人的工具与技术 3.规划…

电脑蓝屏是哪里出了问题?不一定要非要重装系统

电脑蓝屏是非常常见的电脑故障现象&#xff0c;导致电脑蓝屏的原因很多&#xff0c;很多人第一时间反应可能是给电脑重装系统&#xff0c;但是有时并不能解决问题。那么电脑蓝屏是哪里出了问题呢&#xff1f;其实导致蓝屏不一定是系统故障&#xff0c;还有很多情况也会出现蓝屏…

Python3,爬虫有多简单,一个库,一行代码,就OK, 你确定不来试试?

爬虫进阶库&#xff1a;Scrapeasy1、 引言2、Scrapeasy2.1 简介2.1.1 Scrap2.1.2 Scrapeasy2.2 安装2.3 代码示例3、总结1、 引言 小屌丝&#xff1a;鱼哥&#xff0c; 我最近在练习写爬虫&#xff0c; 你有没有什么便捷的方式… 小鱼&#xff1a;比如呢&#xff1f; 小屌丝&a…

公众号网课查题接口

公众号网课查题接口 本平台优点&#xff1a; 多题库查题、独立后台、响应速度快、全网平台可查、功能最全&#xff01; 1.想要给自己的公众号获得查题接口&#xff0c;只需要两步&#xff01; 2.题库&#xff1a; 查题校园题库&#xff1a;查题校园题库后台&#xff08;点击…

【C】自定义类型(二)位段,枚举,联合

&#x1f648;个人主页&#xff1a; 对de起日子 &#x1f449;系列专栏&#xff1a;【C语言–大佬之路】 &#x1f388;今日心语&#xff1a;谨慎的选择自己的生活&#xff0c;不要轻易让自己迷失在各种诱惑里。 前一章我们介绍了结构体&#xff0c;这一章我们来介绍一下内容&a…

大猩猩优化算法(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️❤️&#x1f4a5;&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑…

springboot:整合其它项目

目录 一、集成Druid application.yml 二、集成redis之非注解式开发 pom.xml application.yml RedisConfig ClazzBizImpl.java 三、集成redis之注解缓存开发 RedisConfig RedisConfig 一、集成Druid 在昨天的基础上 参考网址 https://github.com/alibaba/druid/tre…