ReactNative之網(wǎng)絡請求(十三)

前言

眼看很多公司都開始嘗試使用ReactNative,達到跨平臺開發(fā),最近也寫了很多文章,希望讓更多想了解的同學快速上手ReactNative.

如果喜歡我的文章十酣,可以關注我微博:袁崢Seemygo

ReactNative之網(wǎng)絡請求

  • 任何App都少不了從服務器獲取數(shù)據(jù),那就需要進行網(wǎng)絡請求,那在RN中如何進行網(wǎng)絡請求了落剪。

fetch API

  • RN網(wǎng)絡請求常用方法
fetch: 發(fā)送請求,默認Get請求
then : 傳入一個回調函數(shù),當上一次操作處理完,就會自動執(zhí)行then的回調函數(shù),并且自動把處理完的結果,作為參數(shù)傳遞給then的回調函數(shù)
response.json(): 把請求到的數(shù)據(jù)轉換為json
catch : 在請求或者處理數(shù)據(jù)失敗的時候,就會執(zhí)行catch里的回調函數(shù)尿庐,捕獲異常

GET請求

fetch(http://192.168.0.102:3000/home?name=xmg) // 發(fā)送GET請求
            .then((response)=>response.json()) // 請求成功忠怖,把請求數(shù)據(jù)轉換為 JSON
            .then((json)=>{                    // 獲取JSON數(shù)據(jù)做事情
                console.log(json)
            })
            .catch((error)=>{               // 請求失敗或者處理JSON數(shù)據(jù)失敗,調用
                console.log(error)
            })

GET請求封裝

  • 每次請求抄瑟,都要自己拼接url和自己轉JSON數(shù)據(jù)凡泣,比較麻煩.
  • 自定義XMGRequest請求類
  • 封裝技巧:
    • 直接使用class定義類,不需要繼承誰
    • GET方法皮假,聲明類方法就好鞋拟,沒必要創(chuàng)建對象去調用,用static聲明
    • 方法需要添加文檔注釋(/** + 回車)惹资,就有文檔注釋
    • GET方法:提供四個參數(shù)贺纲,url,參數(shù)字典,成功回調褪测,失敗回調
    • for in 遍歷參數(shù)字典,拼接參數(shù)
export default class XMGRequest {


    /**
     * GET請求
     * @param {字符串} url
     * @param {字典} param
     * @param {成功回調(param:JSON)} success
     * @param {失敗回調(param:ERROR)} failure
     * @returns 功能:GET請求
     */
    static GET(url,param,success,failure){

        // 總長度
        var totalParamStr = '';

        // 判斷字典參數(shù)是否有值
        // 把字典轉換為字符串,如果字典為空,轉換為'{}'
        var jsonStr = JSON.stringify(param);

        if (jsonStr != '{}') {

            // 符合
            var mark = '?';

            var i = 0;

            for (key in param){

                if (i > 0) {
                    mark = '&'
                }

                var value = param[key];

                var paramStr = mark + key + '=' + value;

                totalParamStr += paramStr;

                i++;

            }

        }



        // 拼接url
        url += totalParamStr;

        fetch(url)
            .then((response)=>response.json())
            .then((json)=>{
                success(json);
            })
            .catch((error)=>{
                failure(error)
            })
    }

}

搭建Get請求服務器


// 獲取express模塊
var express = require('express');

// 獲取http請求
var httpRequest = require('request');

// 創(chuàng)建服務器
var server = express();

server.get('/home',function (request,response) {

    // /home?a=list&c=data&type=1

    // 字符串截取,也可以使用request.query獲取請求參數(shù)
    var url = request.url;

    var i = url.indexOf('?');

    var paramStr = url.substring(i);

    var baseUrl = 'http://api.budejie.com/api/api_open.php';

    url = baseUrl + paramStr;

    httpRequest(url,function (error, res, data) {

        response.send(data)

    });
    
});

server.listen(3000);

Post請求

  • Post請求有三種方式
    • application/x-www-form-urlencoded: 普通http請求方式,參數(shù)是普通的url參數(shù)拼接
    • application/json: JSON請求方式分扎,參數(shù)是json格式
    • multipart/form-data: 文件上傳
  •  Fetch還有可選的第二個參數(shù)澄成,可以用來定制HTTP請求一些參數(shù)。你可以定制header參數(shù),請求方式墨状,提交數(shù)據(jù)卫漫。
    

application/x-www-form-urlencoded請求

  • 注意:Content-Type:一定不要寫錯,否則服務器解析不出來
    // application/x-www-form-urlencoded
    Post(){

        var requestOptional = {
            method:'POST',
            headers:{
                'Content-Type':'application/x-www-form-urlencoded'
            },
            body:'account=xmg&pwd=123'
        };

        fetch('http://192.168.0.102:3000/login',requestOptional)
            .then((response)=>response.json())
            .then((json)=>{
                console.log(json)
            })
            .catch((error)=>{
                console.log(error)
            })
    }

application/x-www-form-urlencoded服務器搭建

  • bodyParser:用于解析post參數(shù)

// 獲取express模塊
var express = require('express');

// 獲取http請求
var httpRequest = require('request');

// post解析對象
var bodyParser = require('body-parser');

// 創(chuàng)建服務器
var server = express();

// 這個代碼必須寫在post之前,因為bodyParser框架,用于中間件,而中間件優(yōu)于get,post請求調用
// 正確的邏輯也是,先把post請求參數(shù)解析出來,然后在post中就能通過body拿到了
// 由于bodyParser必須寫在post之前,因此接口文檔就應該寫清楚post請求參數(shù)類型,否則傳入錯誤,就不能解析了.
// 不同post參數(shù)類型,就必須用對應的解析器,否則解析出來就不對了

// 解析post的參數(shù),post參數(shù)是url拼接類型

// application/x-www-form-urlencoded
var jsonParser = bodyParser.urlencoded({extended:true});

// 使用中間件,當攔截到login,就立馬執(zhí)行,bodyParser因為用于中間件
server.use('/login',jsonParser);


server.post('/login',function (request,response) {

    // 獲取post請求參數(shù)
    console.log(request.body);

    // 根據(jù)這個去查詢數(shù)據(jù)

});

server.listen(3000);

application/json請求

  • JSON.stringify(param) => JSON對象轉字符串 {name:xmg} => '{name:xmg}'
  • 因為body:只能放字符串,所以必須要把JSON對象轉字符串
  • 注意:Content-Type:一定不要寫錯,否則服務器解析不出來
// application/json
    
    Post(){

        var param = {
            account:'xmg',
            pwd:'123'
        };

        var paramStr = JSON.stringify(param);

        console.log(paramStr)
        
        // post請求描述
        var requestDesc = {
            method:'POST',
            headers:{
                'Content-Type':'application/json'
            },
            body:paramStr
        };

        // 發(fā)送post請求
        fetch('http://192.168.0.102:3000/login',requestDesc)
            .then((response)=>response.json())
            .then((json)=>{
                console.log(json)
            })
            .catch((error)=>{
                console.log(error)
            })
    }

application/json服務器搭建


// 獲取express模塊
var express = require('express');

// 獲取http請求
var httpRequest = require('request');

// post解析對象
var bodyParser = require('body-parser');

// 創(chuàng)建服務器
var server = express();

// 解析post的參數(shù),post參數(shù)是url拼接類型
// application/json
var jsonParser =  bodyParser.json();

// 使用中間件,當攔截到login,就立馬執(zhí)行,bodyParser因為用于中間件
server.use('/login',jsonParser);

// 監(jiān)聽post請求
server.post('/login',function (request,response) {

    // 獲取post請求參數(shù)
    console.log(request.body);

    // 根據(jù)這個去查詢數(shù)據(jù)

});


server.listen(3000);

Post請求封裝

  • application/x-www-form-urlencoded
/**
     * POST請求,application/x-www-form-urlencoded
     * @param {字符串} url
     * @param {字典} param
     * @param {成功回調(param:JSON)} success
     * @param {失敗回調(param:ERROR)} failure
     * @returns 功能:POST請求 application/x-www-form-urlencoded
     */
    static PostWithHttpParam(url,param,success,failure){

        var body = '';

        // 判斷字典參數(shù)是否有值
        // 把字典轉換為字符串,如果字典為空,轉換為'{}'
        var jsonStr = JSON.stringify(param);

        if (jsonStr != '{}') {

            // 符合
            var mark = '';

            var i = 0;

            for (key in param){

                if (i > 0) {
                    mark = '&'
                }

                var value = param[key];

                var paramStr = mark + key + '=' + value;

                body += paramStr;

                i++;

            }

        }

        console.log(body);

        var requestOptional = {
            method:'POST',
            headers:{
                'Content-Type':'application/x-www-form-urlencoded'
            },
            body:body
        };

        fetch(url,requestOptional)
            .then((response)=>response.json())
            .then((json)=>{
                success(json);
            })
            .catch((error)=>{
                failure(error);
            })
    }
  • application/json
 /**
     * POST請求,application/json
     * @param {字符串} url
     * @param {字典} param
     * @param {成功回調(param:JSON)} success
     * @param {失敗回調(param:ERROR)} failure
     * @returns 功能:POST請求 application/json
     */
    static PostWithJsonParam(url,param,success,failure) {
        
        var paramStr = JSON.stringify(param);
        
        // post請求描述
        var requestDesc = {
            method:'POST',
            headers:{
                'Content-Type':'application/json'
            },
            body:paramStr
        };

        // 發(fā)送post請求
        fetch(url,requestDesc)
            .then((response)=>response.json())
            .then((json)=>{
                success(json);
            })
            .catch((error)=>{
                failure(error);
            })
    }

上傳

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市歉胶,隨后出現(xiàn)的幾起案子汛兜,更是在濱河造成了極大的恐慌,老刑警劉巖通今,帶你破解...
    沈念sama閱讀 217,734評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件粥谬,死亡現(xiàn)場離奇詭異,居然都是意外死亡辫塌,警方通過查閱死者的電腦和手機漏策,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評論 3 394
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來臼氨,“玉大人掺喻,你說我怎么就攤上這事〈⒕兀” “怎么了感耙?”我有些...
    開封第一講書人閱讀 164,133評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長持隧。 經(jīng)常有香客問我即硼,道長,這世上最難降的妖魔是什么屡拨? 我笑而不...
    開封第一講書人閱讀 58,532評論 1 293
  • 正文 為了忘掉前任只酥,我火速辦了婚禮,結果婚禮上呀狼,老公的妹妹穿的比我還像新娘裂允。我一直安慰自己,他們只是感情好哥艇,可當我...
    茶點故事閱讀 67,585評論 6 392
  • 文/花漫 我一把揭開白布绝编。 她就那樣靜靜地躺著,像睡著了一般貌踏。 火紅的嫁衣襯著肌膚如雪瓮增。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,462評論 1 302
  • 那天哩俭,我揣著相機與錄音,去河邊找鬼拳恋。 笑死凡资,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播隙赁,決...
    沈念sama閱讀 40,262評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼垦藏,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了伞访?” 一聲冷哼從身側響起掂骏,我...
    開封第一講書人閱讀 39,153評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎厚掷,沒想到半個月后弟灼,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,587評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡冒黑,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,792評論 3 336
  • 正文 我和宋清朗相戀三年田绑,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片抡爹。...
    茶點故事閱讀 39,919評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡掩驱,死狀恐怖,靈堂內的尸體忽然破棺而出冬竟,到底是詐尸還是另有隱情欧穴,我是刑警寧澤,帶...
    沈念sama閱讀 35,635評論 5 345
  • 正文 年R本政府宣布泵殴,位于F島的核電站涮帘,受9級特大地震影響,放射性物質發(fā)生泄漏袋狞。R本人自食惡果不足惜焚辅,卻給世界環(huán)境...
    茶點故事閱讀 41,237評論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望苟鸯。 院中可真熱鬧同蜻,春花似錦、人聲如沸早处。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,855評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽砌梆。三九已至默责,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間咸包,已是汗流浹背桃序。 一陣腳步聲響...
    開封第一講書人閱讀 32,983評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留烂瘫,地道東北人媒熊。 一個月前我還...
    沈念sama閱讀 48,048評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親芦鳍。 傳聞我的和親對象是個殘疾皇子嚷往,可洞房花燭夜當晚...
    茶點故事閱讀 44,864評論 2 354

推薦閱讀更多精彩內容