国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

OkHttp的基本使用(二)Post請求

2019-11-06 09:45:03
字體:
來源:轉載
供稿:網友
上篇【OkHttp的基本使用一】介紹了OkHttp的Get請求方式,也是OkHttp基本使用的開端,如果是第一次使用OkHttp的同學可以先從OkHttp的基本使用一開始閱讀,此篇主要介紹OkHttp的Post請求方式。在介紹OkHttp的Post請求的基本使用之前,我們需要了解什么是Post,以及什么是Get?對于android程序員來說,對這2個概念不像web工程師那樣熟悉,在這里我們先簡要說明Post和Get請求的區別:Post或者Get只是Http協議中向后臺服務器發送數據的一種機制,是Http協議的一個組成部分。Post請求是將要提交到后臺服務器的數據放在Http包的包體中。Get請求是將數據放在URL之后,比如http://androidxx.cn/forum.php?mo ... d=11&extra=page%3D1,可以看到此URL由2部分組成,分別是http://androidxx.cn/forum.php和?后面的參數。這就是典型的Get請求方式。因為Get請求時直接將參數放在URL后面,而URL的長度是有一定的限制,所以當傳遞的數據特別大的時候,Get請求就不能完成。相比較,Post請求的參數是放在Http包的內部,不能輕易被看到;Get請求的參數直接是跟在URL之后,可以很容易被用戶獲取。所以,相對而言,Post的請求方式更安全。在實際項目開發過程中,什么時候使用Get、什么時候使用Post呢?Post(當涉及到參數的安全問題或者參數比較大的時候,應該使用Post請求方式),比如:登陸注冊上傳支付下單...Get(Get就是獲取的意思,項目開發中,如果是相對簡單的查詢類接口可以使用Get請求方式),比如:獲取圖片獲取文章詳情...以上就是Get和Post的一個簡單的介紹,對剛入門的android程序員應該會有點幫助。然后,接下來我們開始OkHttp的Post請求方式的學習。Post的同步請求方式(在android的主線程中,需要將下面的代碼放在new Thread的run方法中執行,否則報錯(錯誤詳見))OkHttpClient okHttpClient = new OkHttpClient();        //Form表單格式的參數傳遞        FormBody formBody = new FormBody                .Builder()                .add("goodsId","2799")//設置參數名稱和參數值                .build();        Request request = new Request                .Builder()<font color="royalblue">                .post(formBody)//Post請求的參數傳遞,此處是和Get請求相比,多出的一句代碼</font>.url(Config.POST_URL)                .build();        try {            Response response = okHttpClient.newCall(request).execute();            String result = response.body().string();            Log.d("androixx.cn",result);            response.body().close();        } catch (IOException e) {            e.PRintStackTrace();        }復制代碼以上是一個Post同步請求方式代碼。Post請求的重點在參數的傳遞方式,也就是代碼的第9行.post()方法。post()方法中的參數是要傳遞到后臺服務器的參數,是一個RequestBody類型的參數。其他的代碼同Get請求的基本一致。在實際項目開發中,只要是使用Post請求方式的,都涉及參數傳遞。文章開頭也說了,Post和Get請求的最大的不同點就在參數傳遞,所以接下來我們介紹一下Post的各種格式的參數傳遞。(注意:對于初學者,將視線重點放在Post和Get的參數傳遞方式上來學習OkHttp請求可能要更直觀一些,也可能更容易理解)。Form表單數據的傳遞(上面的代碼中的FormBody就是表單參數的設置方式,表單數據的傳遞就不重復帖代碼,代碼同上)Json格式數據的傳遞//設置媒體類型。application/json表示傳遞的是一個json格式的對象        MediaType mediaType = MediaType.parse("application/json");        //使用JSONObject封裝參數        JSONObject jsonObject = new JSONObject();        try {            jsonObject.put("參數名","參數值");        } catch (JSONException e) {            e.printStackTrace();        }        //創建RequestBody對象,將參數按照指定的MediaType封裝        RequestBody requestBody = RequestBody.create(mediaType,jsonObject.toString());        Request request = new Request                .Builder()                .post(requestBody)//Post請求的參數傳遞                .url(Config.POST_URL)                .build();        try {            Response response = okHttpClient.newCall(request).execute();            String result = response.body().string();            Log.d("androixx.cn",result);            response.body().close();        } catch (IOException e) {            e.printStackTrace();        }復制代碼以上代碼就是Json格式的數據傳遞。代碼中的MediaType指定傳遞的數據類型,是一種MIME類型,比如application/json、application/octet-stream、application/xml等詳細參考這里。對比Form表單數據傳遞和Json格式數據傳遞,對于純粹的android程序員來說,可能覺得一個使用的是FormBody、一個使用的是RequestBody+Json,好像沒有什么不同,都是key:value格式。但是對于Web后臺接收的方式會有所不同,所以將原本應該是Form表單參數改成Json參數傳遞,后臺將接受不到前端傳遞的參數,因為其媒體類型(MediaType)不一樣。String字符串傳遞如果傳遞的就是一個純粹的String字符串,可以將MediaType類型換成“text/plain".說明:對于android程序員怎么知道該使用Form表單格式的數據傳遞方式,還是Json格式的數據傳遞方式?這個問題取決于后臺的數據接收邏輯;所以,在實際開發中如果沒有特殊說明的情況下,默認采用表單格式的數據傳遞;如果有特殊說明,那根據說明內容進行傳遞。不過,目前大多數公司要么采用form表單,要么采用Json(說白了,Json其實就是一個特殊格式的String對象)。Post異步請求Post異步請求只需要將同步請求中的execute方法換成enqueue方法。OkHttpClient okHttpClient = new OkHttpClient();        //Form表單格式的參數傳遞        FormBody formBody = new FormBody                .Builder()                .add("username","androidxx.cn")//設置參數名稱和參數值                .build();        Request request = new Request                .Builder()                .post(formBody)//Post請求的參數傳遞                .url(Config.LOCALHOST_POST_URL)                .build();        okHttpClient.newCall(request).enqueue(new Callback() {            @Override            public void onFailure(Call call, IOException e) {}            @Override            public void onResponse(Call call, Response response) throws IOException {                //此方法運行在子線程中,不能在此方法中進行UI操作。                String result = response.body().string();                Log.d("androixx.cn", result);                response.body().close();            }        });復制代碼總結OkHttp是一個類似HttpUrlConnection的一個框架。OkHttp是一個可以在java項目和Android項目中使用的框架。所以其內部并沒有Handler類來完成線程間的通信。所以,對于android而言,其返回的結果都是在子線程中。需要程序人自己寫Handler完成數據傳遞。OkHttp的Post和Get請求都有2中方式:同步和異步。其中同步請求不能直接在UI線程中進行。Get和Post只是Http協議中的一塊,2者的主要區別在數據的傳遞。學些的時候,可以從數據的傳遞入手去理解它們。OkHttp使用建議在一個項目中只有一個OkHttp對象。使用前可以對OkHttp進行封裝。簡易封裝代碼如下:/*** Created by yangjw on 2016/4/24.* url:androidxx.cn* desc:TODO*/public class OkHttpUtil {    //保證OkHttpClient是唯一的    private static OkHttpClient okHttpClient;    static Handler mHandler = new Handler();    static {        if (okHttpClient == null) {            okHttpClient = new OkHttpClient();        }    }    /**     * Get請求     * @param url     * @param callback 回調函數     */    public static void httpGet(String url, final IOkCallBack callback) {        if (callback == null) throw new NullPointerException("callback is null");        Request request = new Request.Builder().url(url).build();        okHttpClient.newCall(request).enqueue(new Callback() {            @Override            public void onFailure(Call call, final IOException e) {                mHandler.post(new Runnable() {                    @Override                    public void run() {                        callback.onException(e);                    }                });            }            @Override            public void onResponse(Call call, Response response) throws IOException {                final String result = response.body().string();                mHandler.post(new Runnable() {                    @Override                    public void run() {                        callback.onSuccess(result);                    }                });                response.body().close();            }        });    }    /**     * Post請求     * @param url     * @param params 參數     * @param callback 回調函數     */    public static void httpPost(String url,Map<String,String> params,final IOkCallBack callback) {        if (callback == null) throw new NullPointerException("callback is null");        if (params == null) throw new NullPointerException("params is null");        FormBody.Builder formBodyBuilder = new FormBody.Builder();        Set<String> keySet = params.keySet();        for(String key:keySet) {            String value = params.get(key);            formBodyBuilder.add(key,value);        }        FormBody formBody = formBodyBuilder.build();        Request request = new Request                .Builder()                .post(formBody)                .url(url)                .build();        okHttpClient.newCall(request).enqueue(new Callback() {            @Override            public void onFailure(Call call, final IOException e) {                mHandler.post(new Runnable() {                    @Override                    public void run() {                        callback.onException(e);                    }                });            }            @Override            public void onResponse(Call call, Response response) throws IOException {                final String result = response.body().string();                mHandler.post(new Runnable() {                    @Override                    public void run() {                        callback.onSuccess(result);                    }                });                response.body().close();            }        });    }}復制代碼本文章的源碼:Github
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 绵竹市| 中卫市| 同德县| 德保县| 玛曲县| 柯坪县| 恩平市| 宁津县| 江达县| 桐城市| 枝江市| 康马县| 乐东| 固原市| 洛川县| 内江市| 乐昌市| 江口县| 鹰潭市| 鄂伦春自治旗| 寿宁县| 元朗区| 鄢陵县| 合作市| 应城市| 文水县| 郁南县| 拉萨市| 浦东新区| 甘泉县| 河南省| 格尔木市| 沙湾县| 石阡县| 仪征市| 斗六市| 瑞安市| 宿迁市| 铁岭县| 张北县| 昆山市|