Android HttpURLConnection服务器POST上传数据

本文中使用HttpURLConnection与服务器通讯,json数据的转换使用阿里的fastjson,快速简单,不废话,代码说话。
public void HttpURLsend(int signalNum) {
    URL url = null;
    String user_id = "e82423d4ecbe4d36bed032c134d7073a";   //用户ID
    String target = "http://***.**.*.***:8080/homehealth/app/user/" + user_id + "/ecgsegment";//*号为服务器ID地址
    short raw_short; //定义心电数据存放数组
    StringBuilder temp = new StringBuilder();  //存放要上传的json数据
     int statusCode = -1;  //上传失败成功标记
    InputStream in = null; //数据输出流
    BufferedReader rd = null;
    HttpURLConnection urlConn = null;

    byte[] raw = new byte[10 * 250 * 3]; //模拟正弦波数据
    for (int i = 0; i < raw.length / 2; i++) {
        raw_short = (short) ((Math.sin(i * Math.PI / 90) + 1) * 50);
        raw[2 * i] = (byte) (raw_short & 0xff);
        raw[2 * i + 1] = (byte) (raw_short >> 8);
    }

    params = new HashMap<>();  //以键值对的方式存储数据
    Date startTime = null;  //获取时间,并转格式
    try {
        startTime = DateUtils.parseDate("2017-02-08 14:00:39 001", DateUtils.SDF_yyyy_MM_dd_HH_mm_ss_SSS);
    } catch (ParseException e) {
        e.printStackTrace();
    }
    params.put("userId", user_id);  //将要上传的数据和信息加入Map中
    params.put("channel", signalNum);
    params.put("measureStartTime", startTime.getTime());
    params.put("segmentTime", new Date());
    params.put("deviceMac", "00:11:22:AA:BB:CC");
    params.put("rawData", raw);
    params.put("type", 0);
    params.put("exceptionType", 32);
    params.put("curHeartrate", 60);

    try {
        StringBuffer paramStringBuffer = new StringBuffer();
        if (params != null && params.size() > 0) {
            JSONObject obj = new JSONObject(params);
            paramStringBuffer.append(obj.toJSONString());
        }

        url = new URL(target);
        urlConn = (HttpURLConnection) url.openConnection(); //创建一个http连接
        urlConn.setRequestMethod("POST"); //指定post请求方式
        urlConn.setDoInput(true); //向连接中写入数据
        urlConn.setUseCaches(false); //禁止缓存
        urlConn.setConnectTimeout(2 * 1000);
        urlConn.setReadTimeout(5 * 1000);
      //  addSessionID(urlConn);

        if (paramStringBuffer.length() > 0){
            byte[] data = paramStringBuffer.toString().getBytes();
            urlConn.setRequestProperty("Content-Type", "application/json"); //设置内容类型
            urlConn.setRequestProperty("Content-Length", data.length + "");// 注意是字节长度, 不是字符长度
            urlConn.setDoOutput(true); //从连接中读取数据
            DataOutputStream out = new DataOutputStream(urlConn.getOutputStream()); //获取输出流

            out.write(data);
            out.flush(); //输出缓存
            out.close();
        }

        urlConn.getOutputStream().flush();
        urlConn.getOutputStream().close();

    //    doCookie(httpURLConnection
);
        statusCode = urlConn.getResponseCode();  //获取上传服务器反馈
        if(statusCode == 200){
            in = urlConn.getInputStream();  //获取上传成功反馈
        } else {
            in = urlConn.getErrorStream();  //获取上传失败反馈

        }

        rd = new BufferedReader(new InputStreamReader(in));

        String line = null;
        while ((line = rd.readLine()) != null) {
//            temp.append(line); //读取反馈信息,并log出信息
            Log.w(TAG,"response_data" + " = " + line);
        }

    } catch (IOException e) {
        e.printStackTrace();
        statusCode = -1;
        //若一次上传失败,可再次呼叫操作
    } finally {
        if (rd != null){
            try {
                rd.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        if (in != null){
            try {
                in.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        if (urlConn != null){
            urlConn.disconnect();
        }

    }
}

其中我把通信代码写成了函数,由于之前是给心电数据上传写的例程 signalNum 为心电的导联数,去掉不影响通信。例程中模拟了正弦波数据上传,要想用在自己代码中,还需要归整为一个类。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值