android studio與springboot使用OkHttp連接前后端


一、SpringBoot接口分類

springboot后端接口分為3種,@RequestBody類型,@RequestParam類型以及@RequestParam("file") MultipartFile file類型,下面對這三種類型分別說明。

1.@RequestBody類型

在postman中使用body發送JSON語句

對於該種類型的接口,代碼如下

String json = "{\n" +
                                    //發送的json格式語句直接復制過來
                                    "}";
                            OkHttpClient client = new OkHttpClient();//創建Http客戶端
                            Request request = new Request.Builder()
                                    .url("http://***.***.**.***:xxxx/   /   ")//***.***.**.***為本機IP,xxxx為端口,/  /  為訪問的接口后綴
                                    .post(RequestBody.create(MediaType.parse("application/json"),json))
                                    .build();//創建Http請求
                            Response response = client.newCall(request).execute();//執行發送的指令
                            final String responseData = response.body().string();//獲取返回的結果

若返回的結果為json格式,可用JSONObject或JSONArray進行轉換,以JSONArray為例

JSONArray jsonArray = new JSONArray(responseData);
for(int i = 0; i < jsonArray.length(); i++){//遍歷
    JSONObject jsonObject = jsonArray.getJSONObject(i);
    String result = jsonObject.getString("xxx");//xxx為JSON語句中的key值,get到的為value值
}

2.@RequestParam類型

 在postman中改變value的同時會改變url

 對於該種類型的接口,代碼如下(注解請參考1.類型中注解)

FormBody.Builder params = new FormBody.Builder();
                            params.add("xx",**);
                            params.add("xx",**);//xx為key,**為value
                            OkHttpClient client = new OkHttpClient();
                            Request request = new Request.Builder()
                                    .url("http://***.***.**.**:xxxx/  /  ")
                                    .post(params.build())
                                    .build();
                            Response response = client.newCall(request).execute();
                            final String responseData = response.body().string();

若返回的結果為json格式,同上

3.@RequestParam("file") MultipartFile file

用於上傳文件、圖片等,目前還未用到,會補全。

二、對OkHttp的使用

在以上代碼的運行過程中遇到一些網絡訪問的問題,下面一一講解

首先,使用OkHttp之前需導入包。在Build.gradle(app)中添加

在AndroidManifest.xml中添加網絡訪問權限

 運行發現第一個報錯:CLEARTEXT communication to xxxx not permitted by network security policy

查詢資料發現

在Android P系統的設備上,如果應用使用的是非加密的明文流量的http網絡請求,則會導致該應用無法進行網絡請求,https則不會受影響,同樣地,如果應用嵌套了webview,webview也只能使用https請求。

故有三種方法,我采用的第三種方法

1、APP改用https請求 
2、targetSdkVersion 降到27以下 
3、在 res 下新增一個 xml 目錄,然后創建一個名為:network_security_config.xml 文件(名字自定) ,內容如下,大概意思就是允許開啟http請求

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

然后在APP的AndroidManifest.xml文件下的application標簽增加以下屬性

<application
...
 android:networkSecurityConfig="@xml/network_security_config"
...
    />

運行發現第二個報錯(阿巴阿巴現在調不出來了)

在AndroidManifest.xml中添加

然后卸載app,重新運行

附:如果出現fail to connect to報錯,檢查一下ip地址是否有問題

三、android studio的多任務執行

android studio中發送post請求需放在子線程中,因為請求可能失敗,為了不影響主線程,故建立子線程。

假設我點擊按鈕然后發送post請求,那么代碼如下

public void onClick(View v) {
                 new Thread(new Runnable() {
                     @Override
                     public void run() {
                         //請求代碼
                     }
                 }).start();
             }

如果在線程中需要改變UI,需要在子線程中調用函數,將改變UI的代碼扔回給主線程執行,不然會報錯

假設我需要在子線程中show一個Toast

Toast.makeText(UserLoginActivity.this,"登錄成功",Toast.LENGTH_SHORT).show();

有三種方式可以把請求回調給主線程

1.Activity.runOnUiThread(Runnable)

新增toast就是用這個函數

runOnUiThread(new Runnable() {
                                    @Override
                                    public void run() {
                                        Toast.makeText(UserLoginActivity.this,"登錄成功",Toast.LENGTH_SHORT).show();
                                    }
                                });

2.View.post(Runnable)

改變UI部件則使用這個函數

假設我

TextView username = findViewById(R.id.username);

那么當我需要在線程中改變username的內容時,就把setText放到以下函數中

username.post(new Runnable() {
    public void run() {
        username.setText("用戶名");
    }
});

3.View.postDelayed(Runnable,long)

與2相同,Delay了long的時間延遲響應

四、對post請求的說明

 建立post請求可能存在通信不成功的情況,故在android studio中需把請求放在try函數中,結合上文改變UI的說明,代碼如下

try {
           //post請求  
                        }catch (Exception e){
                            e.printStackTrace();
                            runOnUiThread(new Runnable() {
                                @Override
                                public void run() {
                                    Toast.makeText(UserLoginActivity.this,"網絡錯誤",Toast.LENGTH_SHORT).show();
                                }
                            });
                        }

示例代碼登錄(方法1)

     username = findViewById(R.id.username);
        password = findViewById(R.id.password);
        loginButton = findViewById(R.id.button);
        loginButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                usernameLogin = username.getText().toString();
                passwordLogin = password.getText().toString();
                new Thread(new Runnable() {
                    @Override
                    public void run() {
                        try {
                            String json = "{\n" +
                                    "  \"storePhone\": \"" + usernameLogin + "\",\n" +
                                    "  \"storePwd\": \"" + passwordLogin + "\"\n" +
                                    "}";
                            OkHttpClient client = new OkHttpClient();
                            Request request = new Request.Builder()
                                    .url("http://192.168.43.178:23333/store/login")
                                    .post(RequestBody.create(MediaType.parse("application/json"),json))
                                    .build();
                            Response response = client.newCall(request).execute();
                            final String responseData = response.body().string();
                            if(responseData.equals("true")){
                                runOnUiThread(new Runnable() {
                                    @Override
                                    public void run() {
                                        Toast.makeText(ShopLoginActivity.this,"登錄成功",Toast.LENGTH_SHORT).show();
                                    }
                                });
                            }
                            else if(responseData.equals("false")){
                                runOnUiThread(new Runnable() {
                                    @Override
                                    public void run() {
                                        Toast.makeText(ShopLoginActivity.this,"用戶名或密碼錯誤",Toast.LENGTH_SHORT).show();
                                    }
                                });
                            }
                        }catch (Exception e){
                            e.printStackTrace();
                            runOnUiThread(new Runnable() {
                                @Override
                                public void run() {
                                    Toast.makeText(ShopLoginActivity.this,"網絡錯誤",Toast.LENGTH_SHORT).show();
                                }
                            });
                        }
                    }
                }).start();
            }
        });

運行結果

     

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM