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

 



















