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() + ""); } });

    

 

 
        

    


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM