笔记:安卓和服务器通过http的交互

趁着疫情横行,这几天就乖乖呆在家里做毕设,做的是一个昏天黑地;

讲真的,做一次毕业设计才知道自己学的有多烂。

毕设真的是对自己所学知识的一次梳理,消化,巩固的过程。同时也获得了课堂书本里学不到的经验,是一次深层次的积累。

言归正传;

先新建我的MyPostUtils工具类;
前人栽树,后人乘凉,此方法也是模仿别人学以致用
贴代码:

public class MyPostUtils {
    public static String sendPost(String url,String param){
        OutputStreamWriter out =null;
        BufferedReader reader = null;
        /*存储要返回的值*/
        String response = "";
        //创建连接
        try {
            URL httpUrl = null; //HTTP URL类 用这个类来创建连接
            //创建URL
            httpUrl = new URL(url);
            //建立连接
            HttpURLConnection conn = (HttpURLConnection) httpUrl.openConnection();
            conn.setRequestMethod("POST");
            conn.setRequestProperty("Content-Type", "application/json");
            //conn.setRequestProperty("connection", "keep-alive");
            conn.setUseCaches(false);//设置不要缓存
            conn.setInstanceFollowRedirects(true);
            conn.setDoOutput(true);
            conn.setDoInput(true);
            conn.connect();
            //POST请求写给服务器数据
            out = new OutputStreamWriter(conn.getOutputStream());
            out.write(param);
            out.flush();
            //读取响应收到服务器传回的数据
            reader = new BufferedReader(new InputStreamReader(
                    conn.getInputStream()));
            String lines;
            while ((lines = reader.readLine()) != null) {
                lines = new String(lines.getBytes(), "utf-8");
                response+=lines;
            }
            reader.close();
            // 断开连接
            conn.disconnect();

        } catch (Exception e) {
            System.out.println("发送 POST 请求出现异常!"+e);
            e.printStackTrace();
        }
        //使用finally块来关闭输出流、输入流
        finally{
            try{
                if(out!=null){
                    out.close();
                }
                if(reader!=null){
                    reader.close();
                }
            }
            catch(IOException ex){
                ex.printStackTrace();
            }
        }
        return response;
    }
}

怎么说呢:
post请求;有参有返:给一个url,给一个参数传给服务器,返回值是接收服务器的数据

  • 只请求,不传不接收数据,调用只需要给个url;
  • 请求且传送数据,不接收,调用给个url和参数;
  • 请求发送且接收;给个url和参数后,还需要给个string=sendPost(),来接收数据;

1.无数据传输的请求

在安卓activity的onCreate()里面新建线程,调用post工具类;进行http请求;

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_begin);

        new Thread(new Runnable() {
            @Override
            public void run() {
                /*与服务器建立第一次连接初始化容器*/
                MyPostUtils.sendPost("http://192.168.43.53:8080/lz/map/begin", "");
            }
        }).start();

仔细看的话你会发现我的工具类中sendPost方法是两个参数的,为什么我的请求只有一个url呢?

因为我只进行请求,并不给服务器传递任何参数;

我的服务器部分代码是这样的;

	@ResponseBody
    @RequestMapping("/begin")
    public void beginMap1(HttpServletRequest request) {
        System.out.println("手机端初始化地图了");

别的不管,只要请求成功,控制台就会输出手机端初始化地图成功了这句话。

2.传输数据

此处随便新建一个main函数里面测试

/*要发送的json格式经纬度信息转成string*/
        JSONObject jsonObject = new JSONObject();
        jsonObject.put("latitude", "110.685");
        jsonObject.put("longitude", "34.697");
        jsonObject.put("speed", "12.0");
        /*json转为string格式*/
        String json = String.valueOf(jsonObject);
        System.out.println(json);
        /*发送地址*/
        String url = "http://localhost:8080/lz/map/begin1";
        String url2 = "http://localhost:8080/lz/map/change1";

        sendPost(url2, json);

因为我服务器没有返回数据,所以客户端reader是不用的;
只需要调用就行了,不需要接收数据;
服务器端解析数据;

		String map = "";
        try {
            InputStreamReader reader = new InputStreamReader(request.getInputStream(),"UTF-8");
            char[] ch = new char[1024];
            int len = 0;
            while ((len = reader.read(ch)) != -1) {
                /*char数组转换成string格式*/
                map = String.valueOf(ch);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        /*处理数据转为json*/
        JSONObject json = JSONObject.parseObject(map);
        System.out.println("json:" + json);
        /*json封装成位置信息*/
        Location location = new Location();
        location.setLatitude(json.getString("latitude"));
        location.setLongitude(json.getString("longitude"));
        location.setSpeed(Double.valueOf(json.getString("speed")));
        System.out.println("location:" + location);

最后控制台就打印出客户端传来的数据;

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值