zoukankan      html  css  js  c++  java
  • android 向服务器发送json数据,以及发送头信息的三种方式

    好长一段时间没有去写博客了,最近公司有新的需求,与服务器端交互采用与以往不同的交互方式,

      开发android的童鞋们都知道,一般用post或者get直接带参数到服务器,但是还有两种方式,在某些情况下使用比较频繁,当时就卡住了解决了很长一段时间,网上的教程说的都不太实用,现把自己的实际摸索出来的一套流程分享给大家。

      1.需要在http请求头中带参数传递给服务器

        比如:服务器需要在请求头中加入 Authorization,并且将用户的用户名和密码拼装成字符串传递过去,这样做的好处是比一般get请求更加的安全,

          具体实现为:

            1.1 利用java原生的HttpConnection即可实现,将Authorization和字符串当作配置设置进入即可

              

           netUrl = new URL(path);
                conn = (HttpURLConnection) netUrl.openConnection();
                conn.setRequestProperty("Authorization", str);
                conn.setRequestMethod("GET");// 大写
                LogUtils.i("服务器返回码为==" + conn.getResponseCode());
                is = conn.getInputStream();
                String result = UIUtils.readStream(is);
                LogUtils.i("服务器返回值==" + result);
                Gson gson=new Gson();
                final LoginEntity entity = gson.fromJson(result, LoginEntity.class);
                UIUtils.getHandler().post(new Runnable() {
                    @Override
                    public void run() {
                        if (entity.result){
                            //说明登录成功
                            dismissProgressDialog();
                            start();
                            SharedPreferencesUtils.saveString("loginInfo",str);
                        }else{
                            UIUtils.showToastSafe("登录失败,请检查用户名或密码是否正确");
                            dismissProgressDialog();
                        }
                    }
                });

          主要代码是其中的 conn.setRequestProperty("Authorization", str);其他的代码相信大家都耳熟能详!

      2.需要传递json字符串到服务器:

        最新的需求是,当客户填写一个表单数据时,由于表单数据很多,传统的post带参数并不适合此类场景,而客户端转化为json字符串后,将参数放到json中更为省流量

        实现步骤:

          这里我们用三种方式,传统的httpConnection Android的httpclient和开源框架xutils来实现

          原理最核心的是,一定要把传输类型设置为  application/json

          1.httpConnetion实现

            

         URL url = null;
            try {
                JSONObject jsonObject = getJsonObject();
           .........//将需要的参数封装进jsonobject中
    
                url = new URL(path);
                HttpURLConnection conn = (HttpURLConnection) url.openConnection();
                //设置超时时间。
                conn.setConnectTimeout(30000);
                //区别2 : 请求方式 post
                conn.setRequestMethod("POST");// 大写
                conn.setRequestProperty("User-Agent", "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)");
                //区别3: 必须指定两个请求的参数。
                conn.setRequestProperty("Content-Type", "application/json");//请求的类型 表单数据//区别4: 记得设置把数据写给服务器。
                conn.setDoOutput(true);//设置向服务器写数据。
                conn.setDoInput(true);
                conn.setUseCaches(false);
                conn.getOutputStream().write(String.valueOf(jsonObject).getBytes());//把数据以流的方式写给服务器。
                int code = conn.getResponseCode();
                LogUtils.i("code==" + code);
                InputStream is = conn.getInputStream();
                String s = UIUtils.readStream(is);
    
    
                LogUtils.i("result==" + s);
            } catch (Exception e) {
                e.printStackTrace();
                LogUtils.i("请求失败");
            }

          注意一定要设置请求类型 conn.setRequestProperty("Content-Type", "application/json"); 另外conn.setDoOutput(true)设置向服务器写数据也很重要。

       2.httpClient实现

          

    //创建浏览器
                HttpClient client = new DefaultHttpClient();
                //输入地址
                HttpPost post = new HttpPost(path);
           ..........//将需要的参数封装进jsonObject中 StringEntity se
    = new StringEntity(String.valueOf(getJsonObject())); se.setContentType("application/json");//表格采用的编码是utf-8 post.setEntity(se); //敲回车 LogUtils.i("正在请求=="); HttpResponse response = client.execute(post); LogUtils.i("请求"); int code = response.getStatusLine().getStatusCode(); LogUtils.i("请求码=="+code); if (code == 201) { LogUtils.i("请求成功=="+code); } else { //请求失败 LogUtils.i("请求失败=="+code); } } catch (Exception e) { e.printStackTrace(); LogUtils.i("请求失败==" + e.getMessage()); }

        由于对httpClient不是很熟,折腾了很久,主要是设置请求方式与一般不同,主要是这两句起作用

    StringEntity se = new StringEntity(String.valueOf(getJsonObject()));
    se.setContentType("application/json");

        3.最后来一个xutils框架实现的

             

         HttpUtils http = new HttpUtils();
            RequestParams params = new RequestParams();
            params.setContentType("application/json");
        //把需要的参数封装进jsonObject中
    params.setBodyEntity(new StringEntity(String.valueOf(jsonObject))); http.send(HttpRequest.HttpMethod.POST, url, params, new RequestCallBack<String>() { @Override public void onSuccess(ResponseInfo<String> responseInfo) { LogUtils.i("请求成功"); LogUtils.i(responseInfo.result); } @Override public void onFailure(HttpException error, String msg) { LogUtils.i("请求失败"); LogUtils.i(msg); LogUtils.i("code==" + error.getExceptionCode() + ""); } });

        

    
    

        

    静以修身 俭以养德
  • 相关阅读:
    JS保留两位小数
    xml,json,html格式化工具
    SQL查询递归
    javascript验证价格输入
    类库说明文档生成器
    转换数据库时间字段格式函数
    mysql python 汉字乱码的解决方案
    Python list 按元素属性排序, key 的用法
    原以为会不同的
    libsvm 文本分类(分两类)(实验结果)直接调用Libsvm工具
  • 原文地址:https://www.cnblogs.com/Android-MR-wang/p/4526324.html
Copyright © 2011-2022 走看看