Android Xutils架構使用問題及解決辦法

來源:互聯網
上載者:User

標籤:httputil   android   xutils   

    剛剛寫了篇部落格,提了下在使用XUtils時遇到的一個問題Android Xutils架構HttpUtil Get請求緩衝問題 ,既然已經提起來這個問題,那我想了下,就把之前使用Xutils時遇到的幾個小問題整理一下。


一、 HttpUtil Get請求緩衝問題

      關於Xtuls架構的Http模組的get要求方法,會有緩衝問題——即進行get請求時,在緩衝規定的時間內,如果發送同樣的請求url,則不會再次請伺服器發送請求,而是直接返回上次請求的結果。 之前寫了一篇部落格已經介紹的很詳細了,可查看《Android Xutils架構HttpUtil Get請求緩衝問題》。


二、 如何直接在HTTP請求時發送一個字串

   首先,我想先說下,如何使用Xutils的架構HTTP模組向伺服器發送資料,這裡必須介紹一個API:com.lidroid.xutils.http.RequestParams,我不貼出該類的源碼了,且把方法給大家看下:


    從以上方法可以看出,它提供的幾個方法非常方便,不僅可以直接使用addQueryStringParameter(String name, String value)方法,將參數以key-value的形式放入其中,(一般用於get請求),還有addBodyParameter(String name, String value) ,講參數放在Http的body中;還有addHeader(String name, String value)等方法,允許添加HTTP請求的Header,可謂是方便之極。

    下面有人會問了,如果我不以key-value的形式上傳參數,而是想直接把一串字元(JSON串,一般字元串等)傳到伺服器中,那該怎麼辦呢?

   有辦法!

1. 對於Get請求,如果要直接上傳一串字元,可以直接把它串連在url上。

    比如我要請求的地址是: http://www.imooc.com/api/teacher,需要上傳的參數是“{"id": 1,"learner": 12312}”,那我可以直接把他拼接在url上,變成" http://www.imooc.com/api/teacher?{"id": 1,"learner": 12312}"

   伺服器按照約定,再進行相應的處理就好了。當然對於上述的請求,字串中有特殊字元,我們要求對其進行URL編碼: URLEncoder.encode(),之後才可以上傳。


2. 對於Post請求,使用requestParams.setBodyEntity(HttpEntity bodyEntity)

  如果我們上傳的是字串,使用HttpEntity的子類執行個體StringEntity即可: requestParams.setBodyEntity(new StringEntity(""))。


三、 java.net.URISyntaxException的解決辦法

   前些天做項目,使用Xutils Http get請求時,當我發送的一串字串中含有特殊字元,就會發生這種情況。尋找了一些網上資料,說地址中涉及了特殊字元,如‘|’‘&’等。所以不能直接用String代替URI來訪問。必須採用%0xXX方式來替代特殊字元。但這種辦法不直觀。所以只能先把String轉成URL,再能過URL產生URI的方法來解決問題。代碼如下:

URL url = new URL(strUrl);URI uri = new URI(url.getProtocol(), url.getHost(), url.getPath(), url.getQuery(), null);HttpClient client    = new DefaultHttpClient();HttpGet httpget = new HttpGet(uri);

   看懂了這裡,所以我們看下Xutils源碼的URIBuilder.java源檔案,發現它的構造方法是直接把傳入的url構造成了uri:

    public URIBuilder(final String uri) {        try {            digestURI(new URI(uri));        } catch (URISyntaxException e) {            LogUtils.e(e.getMessage(), e);        }    }
    簡要修改下源碼:

 public URIBuilder(String uri) {        try {            URL e = new URL(uri);            this.digestURI(new URI(e.getProtocol(), e.getHost(), e.getPath(), e.getQuery(), (String)null));        } catch (Exception var3) {            LogUtils.e(var3.getMessage(), var3);        }    }
    這就好了,重新編譯xutil.jar檔案,可以放心使用了。

    

    當然了,之前說了,對於get請求的特殊字元,我們可以採用URLEncoder.encode()進行特殊字元的編碼來解決。 可是,我試了下,用這個方法並沒能解決我的問題,所以我才採取了修改源碼的方法。有興趣的同學可以再次嘗試下。

    

後記:

    推薦幾篇比較好的關於Xutils架構的文章,挺全面的:

1.  http://www.tuicool.com/articles/nMFb2q   Android開源項目xUtils HttpUtils模組分析


2.  https://github.com/wyouflf/xUtils    XUtils github地址


3.  http://blog.csdn.net/zuiwuyuan/article/category/2217073  Xutils架構基本使用介紹

著作權聲明:本文為博主原創文章,未經博主允許不得轉載。

Android Xutils架構使用問題及解決辦法

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.