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}}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值