鴻蒙 網絡請求的各種實現方式(原生+okhttp+okhttputils+zzrhttp)

前言:

各位同學大家好,有段時間沒有給大家更新文章。具體多久呢我也不記得,剛剛過完2020年,我在新的2021年里我還在繼續學習鴻蒙的的開發。最近看了一下鴻蒙的網絡請求部分的內容(這部分主要還是按照鴻蒙開發文檔里面提到 java ui,js ui的網絡請求請大家查看官方的文檔即可)那么廢話不多說我們正式開始。

準備工作:

1 安裝鴻蒙開發環境 大家可以看我之前的文章
華為鴻蒙系統開發初體驗 :http://www.lxweimin.com/p/f94c847c7fdc

image.png

具體實現

鴻蒙系統網絡訪問基礎配置

  • 1添加網絡訪問權限

跟Android類似,要訪問網絡,我們首先要配置網絡訪問權限,在config.json的"module"節點最后,添加上網絡權限代碼

"reqPermissions": [
      {
        "reason": "",
        "name": "ohos.permission.INTERNET"
      }
    ]
image.png
  • 2 設置訪問模式

鴻蒙的默認是https訪問模式,如果您的請求網址是http開頭的,請在config.json文件中的deviceConfig下,添加如下設置

deviceConfig": { 
     "default": { 
         "network": { 
             "cleartextTraffic": true 
         } 
     } 
 }, 
image.png

具體代碼實現:

  • 1JAVA原生請求

由于鴻蒙系統支持Java開發,所以我們可以直接使用Java原生的Api來進行網絡訪問
該方式使用了java的url.openConnection() Api來獲取網絡數據

請求工具類

我們這邊寫了一個基于HttpURLConnection 封裝的工具類來處理我們的原生網絡請求

package com.example.hms_network.net;
import javax.net.ssl.*;
import java.io.*;
import java.net.*;
import java.security.SecureRandom;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
import java.util.Map;
/**
 * 創建人:xuqing
 * 創建時間:2021年1月16日16:11:10
 * 類說明:網絡請求工具類
 *
 */
public  class HttpUtils{
    private final static String PARAMETER_SEPARATOR = "&";
    private final static String NAME_VALUE_SEPARATOR = "=";
    /**
     *訪問url,獲取內容
     * @param urlStr
     * @return
     */
    public static String httpGet(String urlStr){
        StringBuilder sb = new StringBuilder();
        try{
            //添加https信任
            SSLContext sslcontext = SSLContext.getInstance("SSL");//第一個參數為協議,第二個參數為提供者(可以缺省)
            TrustManager[] tm = {new HttpX509TrustManager()};
            sslcontext.init(null, tm, new SecureRandom());
            HostnameVerifier ignoreHostnameVerifier = new HostnameVerifier() {
                public boolean verify(String s, SSLSession sslsession) {
                    System.out.println("WARNING: Hostname is not matched for cert.");
                    return true;
                }
            };
            HttpsURLConnection.setDefaultHostnameVerifier(ignoreHostnameVerifier);
            HttpsURLConnection.setDefaultSSLSocketFactory(sslcontext.getSocketFactory());
            URL url = new URL(urlStr);
            HttpURLConnection connection = (HttpURLConnection) url.openConnection();
            connection.setRequestMethod("GET");
            connection.setReadTimeout(10000);
            connection.setConnectTimeout(10000);
            connection.connect();
            int code = connection.getResponseCode();
            if (code == HttpURLConnection.HTTP_OK) {
                BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
                String temp;
                while ((temp = reader.readLine()) != null) {
                    sb.append(temp);
                }
                reader.close();
            }
            connection.disconnect();
        } catch (Exception e) {
            e.printStackTrace();
            return e.getMessage();
        }
        return sb.toString();
    }



    public static String httpGet(String urlStr ,Map<String, String> params){
        StringBuilder sb = new StringBuilder();
        try{
            //添加https信任
            SSLContext sslcontext = SSLContext.getInstance("SSL");//第一個參數為協議,第二個參數為提供者(可以缺省)
            TrustManager[] tm = {new HttpX509TrustManager()};
            sslcontext.init(null, tm, new SecureRandom());
            HostnameVerifier ignoreHostnameVerifier = new HostnameVerifier() {
                public boolean verify(String s, SSLSession sslsession) {
                    System.out.println("WARNING: Hostname is not matched for cert.");
                    return true;
                }
            };
            HttpsURLConnection.setDefaultHostnameVerifier(ignoreHostnameVerifier);
            HttpsURLConnection.setDefaultSSLSocketFactory(sslcontext.getSocketFactory());
            URL url = new URL(getUrl(urlStr,params));
            HttpURLConnection connection = (HttpURLConnection) url.openConnection();
            connection.setRequestMethod("GET");
            connection.setReadTimeout(10000);
            connection.setConnectTimeout(10000);
            connection.connect();
            int code = connection.getResponseCode();
            if (code == HttpURLConnection.HTTP_OK) {
                BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
                String temp;
                while ((temp = reader.readLine()) != null) {
                    sb.append(temp);
                }
                reader.close();
            }
            connection.disconnect();
        } catch (Exception e) {
            e.printStackTrace();
            return e.getMessage();
        }
        return sb.toString();
    }


    /**
     * get請求,將鍵值對憑接到url上
     */
    private static  String getUrl(String path, Map<String, String> paramsMap) {
        if(paramsMap != null){
            path = path+"?";
            for (String key: paramsMap.keySet()){
                path = path + key+"="+paramsMap.get(key)+"&";
            }
            path = path.substring(0,path.length()-1);
        }
        return path;
    }



    /**
     * HttpPost 網絡請求工具類
     *
     * @param urlStr
     * @return
     */
    public static String httpPost(String urlStr) {

        String result = null;
        URL url = null;
        HttpURLConnection connection = null;
        InputStreamReader in = null;
        try {
            String paramsEncoded = "";
        /*    if (params != null) {
                paramsEncoded = urlParamsFormat(params, "UTF-8");
            }*/
            url = new URL(urlStr);
            if (url.getProtocol().toUpperCase().equals("HTTPS")) {
                trustAllHost();
                HttpsURLConnection https = (HttpsURLConnection) url.openConnection();
                connection = https;
            } else {
                connection = (HttpURLConnection) url.openConnection();
            }
            connection.setDoInput(true);
            connection.setDoOutput(true);
            connection.setConnectTimeout(5000);
            connection.setReadTimeout(20000);
            connection.setRequestMethod("POST");
            connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
            connection.setRequestProperty("Charset", "utf-8");
            DataOutputStream dop = new DataOutputStream(
                    connection.getOutputStream());
         //   dop.writeBytes(paramsEncoded);
            dop.flush();
            dop.close();
            if (connection.getResponseCode() == connection.HTTP_OK) {
                in = new InputStreamReader(connection.getInputStream());
                BufferedReader bufferedReader = new BufferedReader(in);
                StringBuffer strBuffer = new StringBuffer();
                String line = null;
                while ((line = bufferedReader.readLine()) != null) {
                    strBuffer.append(line);
                }
                result = strBuffer.toString();
            } else {
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (connection != null) {
                connection.disconnect();
            }
            if (in != null) {
                try {
                    in.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        return result;
    }

    /**
     * HttpPost 網絡請求工具類
     *
     * @param urlStr
     * @param params
     * @return
     */
    public static String httpPost(String urlStr, Map<String, String> params) {

        String result = null;
        URL url = null;
        HttpURLConnection connection = null;
        InputStreamReader in = null;
        try {
            String paramsEncoded = "";
            if (params != null) {
                paramsEncoded = urlParamsFormat(params, "UTF-8");
            }
            url = new URL(urlStr);
            if (url.getProtocol().toUpperCase().equals("HTTPS")) {
                trustAllHost();
                HttpsURLConnection https = (HttpsURLConnection) url.openConnection();
                connection = https;
            } else {
                connection = (HttpURLConnection) url.openConnection();
            }
            connection.setDoInput(true);
            connection.setDoOutput(true);
            connection.setConnectTimeout(5000);
            connection.setReadTimeout(20000);
            connection.setRequestMethod("POST");
            connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
            connection.setRequestProperty("Charset", "utf-8");
            DataOutputStream dop = new DataOutputStream(
                    connection.getOutputStream());
            dop.writeBytes(paramsEncoded);
            dop.flush();
            dop.close();
            if (connection.getResponseCode() == connection.HTTP_OK) {
                in = new InputStreamReader(connection.getInputStream());
                BufferedReader bufferedReader = new BufferedReader(in);
                StringBuffer strBuffer = new StringBuffer();
                String line = null;
                while ((line = bufferedReader.readLine()) != null) {
                    strBuffer.append(line);
                }
                result = strBuffer.toString();
            } else {
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (connection != null) {
                connection.disconnect();
            }
            if (in != null) {
                try {
                    in.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        return result;
    }

    /**
     * Returns a String that is suitable for use as an application/x-www-form-urlencoded
     * list of parameters in an HTTP PUT or HTTP POST.
     *
     * @param params
     * @param charset
     * @return
     * @throws UnsupportedEncodingException
     */
    public static String urlParamsFormat(Map<String, String> params, String charset) throws UnsupportedEncodingException {
        final StringBuilder sb = new StringBuilder();
        for (String key : params.keySet()) {
            final String val = params.get(key);
            if (!TextUtils.isEmpty(key) && !TextUtils.isEmpty(val)) {
                final String encodedName = URLEncoder.encode(key, charset);
                final String encodedValue = URLEncoder.encode(val, charset);
                if (sb.length() > 0) {
                    sb.append(PARAMETER_SEPARATOR);
                }
                sb.append(encodedName).append(NAME_VALUE_SEPARATOR)
                        .append(encodedValue);
            }
        }

        return sb.toString();
    }

    /**
     * trust all host
     */
    private static void trustAllHost() {
        // Create a trust manager that does not validate certificate chains
        // Android use X509 cert
        TrustManager[] trustAllCerts = new TrustManager[]{new X509TrustManager() {
            public X509Certificate[] getAcceptedIssuers() {
                return new X509Certificate[]{};
            }
            public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {
            }
            public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {
            }
        }};
        // Install the all-trusting trust manager
        try {
            SSLContext sc = SSLContext.getInstance("TLS");
            sc.init(null, trustAllCerts, new SecureRandom());
            HttpsURLConnection
                    .setDefaultSSLSocketFactory(sc.getSocketFactory());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

處理兼容https 的代碼HttpX509TrustManager.java

package com.example.hms_network.net;
import javax.net.ssl.X509TrustManager;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;

public class HttpX509TrustManager implements X509TrustManager {
    @Override
    public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {
    }

    @Override
    public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {
    }

    @Override
    public X509Certificate[] getAcceptedIssuers() {
        return null;
    }
}

原生網絡請求具體調用測試

    public  void   nativeNet(){
        new Thread(new Runnable() {
            @Override
            public void run() {
                String  getjson= HttpUtils.httpGet(url);
                System.out.println("nativeNet   getjson  --- >  "+getjson);
            }
        }).start();
    }
image.png

我們在控制臺看到日志輸出了請求返回的數據

  • okhttp 請求

首先要添加依賴 我這邊是用jar包本地依賴 當然你再build.gradle里面去添加gradle命令 然后從倉庫去拉取依賴也是可以的


image.png

具體代碼

    public  void  okhttpNet() {
        OkHttpClient client = new OkHttpClient();
        final Request request = new Request.Builder()
                .get()
                .url(url)
                .build();
        Call call = client.newCall(request);
        call.enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
            }
            @Override
            public void onResponse(Call call, Response response) throws IOException {
                String responseStr = response.body().string();
                System.out.println("responseStr  --- > "+responseStr);
            }
        });
    }

  • okhttputils請求

    (這個是張鴻樣大神對okttp的二次封裝的一個框架 也比較好用 現在已經不維護了)依賴也是用jar包在本地依賴 也可以在build.gradle里面去添加gradle命令也行
   public   void   okhttpUtilsNet(){
        OkHttpUtils.get().
                url(url)
                .build()
                .execute(new StringCallback() {
                    @Override
                    public void onError(Call call, Exception e, int i) {
                        System.out.println("Exception  --- > "+e);
                    }

                    @Override
                    public void onResponse(String s, int i) {
                        System.out.println("okhttpUtilsNet  s  --- > "+s);
                    }
        });
    }
  • zzrHttp

這個是一個ZZR老師 老師的一個開源庫 我這里就不多講 簡單說一下 詳細的可以去看他的教程哈
教程地址 :https://edu.51cto.com/course/25200.html
zzrhttp使用需要在build.gradle里面去添加依賴

image.png

然后sing now 點擊拉取依賴
具體代碼演示:

  public  void  zzrHttp(){
        ZZRHttp.get(url, new ZZRCallBack.CallBackString() {
            @Override
            public void onFailure(int code, String errorMessage) {
                //http訪問出錯,此部分在主線程中工作,可以更新UI等操做。
            }
            @Override
            public void onResponse(String response) {
                System.out.println("zzrHttp  -- >  response  " +response);
                //http訪問成功,此部分在主線程中工作,可以更新UI等操作。
            }
        });
    }

以上呢就是我給大家提供的幾種鴻蒙開發中網絡請求的方式 當然也還有其他的基于純java語言封裝的網絡請求的庫 理論上在鴻蒙上面都是可以使用的 有興趣同學可以私下多了解 我這邊由于篇幅原因 就不展開細講了。

最后總結:

由于鴻蒙開發里面java ui部分使用的是java做基礎語言 所以使得 我們java里面提供的網絡請求的api到可以很好直接在鴻蒙上面使用 以及包括出名的okhttp okhttputils 知名框架再鴻蒙上也可以完美的使用 ,所以整個網絡部分請求的部分還算簡單 當然啦這些都還是基礎 更加友好的網絡請求的使用方式各位同學可以根據實際情況去適當封裝處理 來更好實現的我們的需求。 最后希望我的文章能幫助到各位解決問題 ,以后我還會貢獻更多有用的代碼分享給大家。各位同學如果覺得文章還不錯 ,麻煩給關注和star,小弟在這里謝過啦

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容