隐藏

安卓开发Android studio关于如何使用Okhttp框架的网络请求调用API接口

发布:2023/2/23 10:43:29作者:管理员 来源:本站 浏览次数:404

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.运行结果截图