天天看點

Android用戶端與伺服器的通訊

幾個坑先擺上:

  1. url(“http://192.168.5.107:8080/users/test?test=ad”)//請求接口,如果需要傳參就拼接到後面,這裡ip位址需要填真實ip不可用localhost
  2. android3.0版本開始就強制程式不能在主線程中通路網絡,要把通路網絡放在獨立的線程中。否則報NetworkOnMainThreadException
  3. Android預設使用https協定,要使用http協定屬于明文傳輸,需要在AndroidManifest.xml的application中添加屬性: android:usesCleartextTraffic=“true”
  4. 網絡權限:<uses-permission android:name=“android.permission.INTERNET” />

    <uses-permission android:name=“android.permission.ACCESS_WIFI_STATE”/>

    <uses-permission android:name=“android.permission.ACCESS_NETWORK_STATE”/>

Android之NetworkOnMainThreadException異常

控制器層

添加一個測試位址,一個參數test,是以要通路的位址就是 http://192.168.5.107:8080/users/test?test=ad (ip寫真實IP位址)

package com.sdxzt.xueliang.controller;

import com.sdxzt.xueliang.entity.User;
import com.sdxzt.xueliang.service.IUserService;
import com.sdxzt.xueliang.util.JsonResult;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * 控制層
 * @Author: Jacob
 * @Date: 2019/9/3 11:18
 */
@RequestMapping("users")
@RestController
public class UserController {
    @Autowired
    IUserService userService;
//注冊
    @RequestMapping("reg")
    public JsonResult<Void> reg(User user){
        System.out.println("UserController.reg():"+user.toString());
        JsonResult<Void> jsonResult = new JsonResult<>();
        userService.reg(user);
        jsonResult.setState(2000);
        return jsonResult;
    }
//測試
    @RequestMapping("test")
    public JsonResult<User> test(String test){
        System.out.println("UserController.test():"+test);
        User user = new User();
        user.setRealName("tom");
        return new JsonResult<User>(2000,"abvc",user);
    }
}

           

Android端

兩種請求方式,一種是使用OkHttp,另一種是原生的

得到的響應是json格式,要解析還需要gson

register.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Log.d("setOnClickListener", "點選注冊");
                getEditText();
                new Thread(new Runnable() {
                    @Override
                    public void run() {
                        Log.d("setOnClickListener", "啟動線程");
                        //使用OkHttp
                        try {
                            final OkHttpClient client = new OkHttpClient();//建立
                            final Request request = new Request.Builder()
                                    .url("http://192.168.5.107:8080/users/test?test=ad")//請求接口,如果需要傳參就拼接到後面,這裡ip位址需要填真實ip不可用localhost
                                    .build();
                            //android3.0版本開始就強制程式不能在主線程中通路網絡,要把通路網絡放在獨立的線程中。否則報錯NetworkOnMainThreadException
                            Response response = client.newCall(request).execute();
                            if (response.isSuccessful()) {//狀态碼是2開頭的表示響應成功,如200;
                                Log.d("response.isSuccessful", "response.code()==" + response.code());//response.code()==200
                                Log.d("response.isSuccessful", "response.message()==" + response.message());
                                Log.d("response.isSuccessful", "res==" + response.body().string());//res=={"state":2000,"message":null,"data":null}
                                //此時的代碼執行在子線程,修改UI的操作請使用handler跳轉到UI線程。
                            }
                            //Log.d("!response.isSuccessful", "res==" + response.body().string());
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                        // 下面是另一種寫法
//                        HttpURLConnection connection = null;
//                        BufferedReader reader = null;
//                        try {
//                            URL url = new URL("http://192.168.5.107:8080/users/test?test=ad");
//                            connection = (HttpURLConnection) url.openConnection();
//                            connection.setRequestMethod("GET");
//                            connection.setConnectTimeout(8000);
//                            connection.setReadTimeout(8000);
//                            InputStream in = connection.getInputStream();
//                            //對擷取到的輸入流進行讀取
//                            reader = new BufferedReader(new InputStreamReader(in));
//                            StringBuilder response = new StringBuilder();
//                            String line;
//                            while ((line = reader.readLine()) != null){
//                                response.append(line);
//                            }
//                            System.out.println(response.toString());
//                        } catch (Exception e) {
//                            e.printStackTrace();
//                        }finally {
//                            if (reader != null){
//                                try {
//                                    reader.close();
//                                } catch (IOException e) {
//                                    e.printStackTrace();
//                                }
//                            }
//                            if (connection != null){
//                                connection.disconnect();
//                            }
//                        }
					}
                }).start();
            }
        });
           

結果:

2019-09-04 14:57:52.938 6502-12404/com.sdxzt.xueliangapp_v2 D/response.isSuccessful: response.code()==200

2019-09-04 14:57:52.938 6502-12404/com.sdxzt.xueliangapp_v2 D/response.isSuccessful: response.message()==

2019-09-04 14:57:52.939 6502-12404/com.sdxzt.xueliangapp_v2 D/response.isSuccessful: res=={“state”:2000,“message”:“abvc”,“data”:{“createdUser”:null,“createdTime”:null,“modifiedUser”:null,“modifiedTime”:null,“uid”:null,“realName”:“tom”,“password”:null,“salt”:null,“gender”:null,“phone”:null,“emergencyPhone”:null,“dept”:null,“profession”:null,“card”:null,“address”:null}}