安卓开发Android studio学习笔记15:关于如何使用Okhttp框架的网络请求(调用API接口)
创始人
2024-04-03 03:58:32
0

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 params = new ArrayList();                // 添加要传递的参数                                                                 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(){@Overridepublic 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() {//失败的请求@Overridepublic void onFailure(@NonNull Call call, @NonNull IOException e) {}//结束的回调@Overridepublic 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需要有请求体,即formBodypublic void postSync(View view) {new Thread(){@Overridepublic 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() {@Overridepublic void onFailure(@NonNull Call call, @NonNull IOException e) {}@Overridepublic 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> cookies = new HashMap<>();private String token;@SuppressLint("MissingInflatedId")@Overrideprotected 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() {@Overridepublic void run() {showdata.setText(Html.fromHtml(result,Html.FROM_HTML_MODE_COMPACT));Gson gson = new Gson();newRoot response = gson.fromJson(result, new TypeToken() {}.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



4.activity_querydrive.xml



5.AndroidManifest.xml

打开网络权限

 

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




7.运行结果截图

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

相关内容

热门资讯

监控摄像头接入GB28181平... 流程简介将监控摄像头的视频在网站和APP中直播,要解决的几个问题是:1&...
Windows10添加群晖磁盘... 在使用群晖NAS时,我们需要通过本地映射的方式把NAS映射成本地的一块磁盘使用。 通过...
protocol buffer... 目录 目录 什么是protocol buffer 1.protobuf 1.1安装  1.2使用...
在Word、WPS中插入AxM... 引言 我最近需要写一些文章,在排版时发现AxMath插入的公式竟然会导致行间距异常&#...
Fluent中创建监测点 1 概述某些仿真问题,需要创建监测点,用于获取空间定点的数据࿰...
educoder数据结构与算法...                                                   ...
MySQL下载和安装(Wind... 前言:刚换了一台电脑,里面所有东西都需要重新配置,习惯了所...
MFC文件操作  MFC提供了一个文件操作的基类CFile,这个类提供了一个没有缓存的二进制格式的磁盘...
有效的括号 一、题目 给定一个只包括 '(',')','{','}'...
【PdgCntEditor】解... 一、问题背景 大部分的图书对应的PDF,目录中的页码并非PDF中直接索引的页码...