ldd379077640
聆听-花语
采纳率34.8%
2017-10-12 09:00 阅读 2.4k

HttpURLConnection 重复发送请求参数的问题

50

new Thread() {
@Override
public void run() {
Looper.prepare();
Date date = new Date();
String timeNow = YYMMdd.timestr(date);
String mystr = MD5utils.MD5(timeNow);
String urlPath = "http://" + address + "/service/AfarPosService.svc/Sale/salelist/sa/" + mystr;
URL url;
try {
url = new URL(urlPath);
JSONObject ClientKey = new JSONObject();
JSONArray jsonArray = new JSONArray(liushuis);
ClientKey.put("data", jsonArray);
ClientKey.put("c_cardtype", c_cardtype);
ClientKey.put("message", "");
ClientKey.put("content", "");
contentLiuShui = String.valueOf(ClientKey);
Log.e("发送实时流水contentLiuShui", contentLiuShui + "");
conn = (HttpURLConnection) url.openConnection();
conn.setConnectTimeout(20000);
conn.setReadTimeout(20000);
conn.setChunkedStreamingMode(0);
conn.setDoInput(true);// 设置是否从httpUrlConnection读入,默认情况下是true;
conn.setDoOutput(true);//设置是否向httpUrlConnection输出,post请求,参数要放在http正文内,因此需要设为true, 默认情况下是false;
conn.setUseCaches(false);//设置是否用缓存 Post 请求不能使用缓存 ,设置为false
conn.setRequestMethod("POST");//设定请求的方法为"POST",默认是GET
conn.setRequestProperty("ser-Agent", "Fiddler");
conn.setRequestProperty("Content-Type", "application/json");
OutputStream os = conn.getOutputStream();//此处getOutputStream会隐含的进行comm.connect();
Log.e("os", os + "");
os.write(contentLiuShui.getBytes());
os.close();
int code = conn.getResponseCode();
Log.e("发送实时流水code", code + "");
if (code == 200) {
InputStream is = conn.getInputStream();
String json = NetUtils.readString(is);
Log.e("返回实时流水json", json + "");
com.alibaba.fastjson.JSONObject jsonObject = com.alibaba.fastjson.JSONObject.parseObject(json);
String panduan = (String) jsonObject.get("message");
String yichang = (String) jsonObject.get("content");
if (panduan.equals("0")) {

                    } else if (panduan.equals("4") || panduan.equals("7")) {

                    } else {
                        Toast.makeText(PaymentMoneyActivity1.this, yichang, Toast.LENGTH_LONG).show();
                    }
                } else {
                    Toast.makeText(PaymentMoneyActivity1.this, "与服务器连接失败", Toast.LENGTH_SHORT).show();
                }
            } catch (Exception e) {
                Toast.makeText(PaymentMoneyActivity1.this, "网络连接超时,请检查网络", Toast.LENGTH_SHORT).show();
                e.printStackTrace();
            } finally {
                Toast.makeText(PaymentMoneyActivity1.this, "网络连接超时,zouazheloosg", Toast.LENGTH_SHORT).show();
                if (conn != null) {
                    conn.disconnect();
                    Log.e("断开了", "断开了耶!");
                }
            }
            Looper.loop();
        }
    }.start();

现存问题:
第一次进行网络请求的时候(时间A,数据data1),如果网络不好超时了,再次接着请求该接口(时间B,数据data2),服务器会收到两次请求的数据:时间A的data1和时间B的data2!
注意:如果多次超时请求,最终后台服务器会接收到多次不同的data!

本人技术小白,还请大神能够指点出错误和解决的办法!

求加QQ在线讨论,在线等解救QQ:379077640

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享

5条回答 默认 最新

  • 已采纳
    shuhaiyilian 舒海之恋 2017-10-13 09:30

    原因有可能是丢包了 当网络差的时候 你这边传给服务器 服务器接受到到给你返回值的时候 你这边没有接收到返回信息就会没有相应 当你再次发送的时候 后台就会有两次数据了 解决方式是:与后台约定号如何让后台的数据唯一保存一条数据就可以解决了。

    点赞 1 评论 复制链接分享
  • weixin_38839005 好久不见ddy 2017-10-12 09:29

    这个没问题啊,只要你发送的数据是正确的,得到返回数据后的处理流程是正确的,就不会有问题,
    类似于你请求了两次数据,难道一个接口不能请求两次?或是一个接口连续请求两次就报错?

    点赞 评论 复制链接分享
  • u013668349 林新华 2017-10-12 10:11

    1,接口要等幂操作,就是无论请求多少次,操作结果都相同的。
    2,每次请求要加唯一流水号,这样可以让后端判别是重复请求还是一次新请求。

    点赞 评论 复制链接分享
  • jia_gugang jia_gugang 2017-10-12 13:31

    应该网络超时了,程序没有问题

    点赞 评论 复制链接分享
  • ejiao1233 alunSemiconductor 2017-10-12 15:09

    你是指的同时收到两次的数据吗?如果是,那你得关注一下每次发出去的数据是否是你预期的了

    点赞 评论 复制链接分享

相关推荐