亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

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

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
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
91最新国产视频| 亚洲激情视频网站| 久久精品电影一区二区| 国产精品欧美日韩久久| 一本色道久久综合狠狠躁篇怎么玩| 欧美高清视频在线观看| 亚洲日韩中文字幕在线播放| 国产精品美乳一区二区免费| 亚洲人成电影在线观看天堂色| 亚洲网站在线播放| 狠狠久久五月精品中文字幕| 国产精品美女www| 国内精品在线一区| 国产精品美腿一区在线看| 日韩欧美成人免费视频| 日韩视频在线免费观看| 国产精品中文字幕在线观看| 久久久久久久久久久久av| 亚洲欧美激情在线视频| 国产精品免费看久久久香蕉| 91欧美视频网站| 国产日产久久高清欧美一区| 日本人成精品视频在线| 亚洲女在线观看| 亚洲免费中文字幕| 91精品国产91久久久久久| 亚洲欧美综合精品久久成人| 亚洲一二在线观看| 亚洲精品久久久久久下一站| 亚洲欧美一区二区三区四区| 91精品国产色综合久久不卡98| 中文字幕在线看视频国产欧美| 日韩毛片中文字幕| 2021久久精品国产99国产精品| 日韩av在线免费看| 久久久综合av| 久热精品视频在线免费观看| 日韩视频中文字幕| 欧美精品一二区| 亚洲精品国产精品国自产观看浪潮| 日韩欧美在线视频观看| 2020国产精品视频| 91青草视频久久| 日韩精品久久久久久久玫瑰园| 日日狠狠久久偷偷四色综合免费| 欧美激情在线播放| 精品国产乱码久久久久久天美| 成人av资源在线播放| 亚洲美女喷白浆| 色久欧美在线视频观看| 欧美日韩在线视频一区| 欧美老少做受xxxx高潮| 日韩黄色av网站| 亚洲乱码国产乱码精品精| 国产女人18毛片水18精品| 91性高湖久久久久久久久_久久99| 91免费看片在线| 国产精品亚洲片夜色在线| 欧美日韩在线观看视频| 国产精品久久久久久久久久久久| 欧美最顶级的aⅴ艳星| 国产精品亚洲精品| 欧美裸体男粗大视频在线观看| 8090成年在线看片午夜| 欧美最猛性xxxx| 久久久久久久97| 在线观看免费高清视频97| 亚洲色图狂野欧美| 亚洲护士老师的毛茸茸最新章节| 亚州成人av在线| 91视频免费在线| 国产精品嫩草视频| 成人激情在线播放| 欧美高清视频免费观看| 欧美精品九九久久| 久久免费视频网站| 欧美孕妇性xx| 中文字幕在线国产精品| 欧美另类极品videosbestfree| 日韩欧美高清在线视频| 国产91色在线| 亚州精品天堂中文字幕| 亚洲图片欧洲图片av| 国产亚洲精品久久久久久牛牛| 国产精品爽黄69天堂a| 欧美大片在线免费观看| 欧美日韩中文字幕日韩欧美| 欧美韩国理论所午夜片917电影| 综合国产在线观看| 浅井舞香一区二区| 国内精品小视频| 亚洲国产日韩一区| 久久久久久久久亚洲| 欧美日韩精品国产| 日韩美女av在线| 日韩久久免费视频| 久久久久亚洲精品| 日韩av有码在线| 久久激情视频久久| 欧美视频一区二区三区…| 亚洲国内高清视频| 中文字幕亚洲一区二区三区五十路| 亚洲精品成a人在线观看| 中文字幕av一区中文字幕天堂| 亚洲欧美三级在线| 亚洲国产一区自拍| 亚洲视频视频在线| 中文字幕自拍vr一区二区三区| 国产精品男女猛烈高潮激情| 亚洲精品免费一区二区三区| 日韩有码视频在线| 一区二区三区在线播放欧美| 亚洲国产精品成人精品| 九九九久久久久久| 日本一欧美一欧美一亚洲视频| 一本色道久久88亚洲综合88| 日韩av在线直播| 热99精品只有里视频精品| 亚洲乱码一区av黑人高潮| 亚洲网站在线观看| 欧美日本中文字幕| 欧美日韩国产中文字幕| 国产精品福利网站| 色yeye香蕉凹凸一区二区av| 91精品视频网站| 97免费在线视频| 国产精品盗摄久久久| 欧美在线视频播放| 国产欧美日韩综合精品| 亚洲在线观看视频网站| 91精品啪aⅴ在线观看国产| 成人动漫网站在线观看| 91探花福利精品国产自产在线| 最新国产精品拍自在线播放| 国产精品爱久久久久久久| 色偷偷av一区二区三区乱| 欧美午夜电影在线| 日韩在线观看免费全| 国产精自产拍久久久久久| 精品一区精品二区| 国产精品亚洲第一区| 揄拍成人国产精品视频| 久久精品久久久久久| 日韩精品亚洲元码| 久久综合色88| 亚洲国产精久久久久久| 国内揄拍国内精品少妇国语| 国产免费成人av| 欧美丰满少妇xxxx| 国产亚洲一区精品| 91精品视频观看| 一本大道久久加勒比香蕉| 亚洲成人免费网站| 97香蕉久久夜色精品国产| 日韩欧美亚洲国产一区| 91人人爽人人爽人人精88v| 精品国产乱码久久久久久天美| 亚洲xxxx做受欧美| 欧美日韩亚洲精品一区二区三区| 日韩成人中文电影| 国产一区二区黄| 国产综合色香蕉精品| 国产精品精品视频| 国产一区二区美女视频|