ReactNative開發(fā)之網(wǎng)絡(luò)請(qǐng)求

在ReactNative中,使用fetch實(shí)現(xiàn)網(wǎng)絡(luò)請(qǐng)求。fetch同XMLHttpRequest非常類似芙粱,是一個(gè)封裝程度更高的網(wǎng)絡(luò)API,使用起來很簡(jiǎn)潔氧映,因?yàn)槭褂昧薖romise春畔。

Promise是異步編程的一種解決方案,比傳統(tǒng)的解決方案--回調(diào)函數(shù)和事件--更合理岛都、更強(qiáng)大律姨。ES6將其寫進(jìn)了語(yǔ)言標(biāo)準(zhǔn),統(tǒng)一了用法臼疫,原生提供了Promise對(duì)象择份。簡(jiǎn)單說就是一個(gè)容器,里面保存著某個(gè)未來才會(huì)結(jié)束的事件(通常是一個(gè)異步操作)的結(jié)果多矮。

Promise對(duì)象代表一個(gè)異步操作缓淹,有三種狀態(tài):Pending(進(jìn)行中)、Resolved(已完成)塔逃、Rejected(已失斚曜尽)荠雕。Promise實(shí)例生成以后,可以分別指定“完成”和“失敗”狀態(tài)的回調(diào)函數(shù)。實(shí)現(xiàn)方式:鏈?zhǔn)秸{(diào)用方法揭保,fetch中使用的就是該特性。

語(yǔ)法:
  fetch(參數(shù))
  .then(完成的回調(diào)函數(shù))
  .catch(失敗的回調(diào)函數(shù))

  fetch(url, opts)
  .then((response) => {
    // 網(wǎng)絡(luò)請(qǐng)求成功執(zhí)行的回調(diào)函數(shù)舍哄,得到響應(yīng)對(duì)象钓猬,通過response可以獲取請(qǐng)求的數(shù)據(jù)。例如:json帐萎、text等等
    return response.text();
    // return response.json();
  })
  .then((responseData) => {
    // 處理請(qǐng)求得到的數(shù)據(jù)
  })
  .catch((error) => {
    // 網(wǎng)絡(luò)請(qǐng)求失敗執(zhí)行該回調(diào)函數(shù)比伏,得到錯(cuò)誤信息
  })

在POST請(qǐng)求中需要用到一個(gè)FormData的概念。

FormData

Web應(yīng)用中頻繁使用的一項(xiàng)功能就是表單數(shù)據(jù)的序列化疆导,XMLHttpRequest2級(jí)定義了FormData類型赁项,F(xiàn)ormData主要用于實(shí)現(xiàn)序列化表單以及創(chuàng)建與表單格式相同的數(shù)據(jù)。

var data = new FormData();
data.append("name", "xiaoming");
append方法接收兩個(gè)參數(shù):鍵和值澈段。分別對(duì)應(yīng)表單字段的名字和字段中包含的值悠菜,添加多個(gè)鍵值對(duì)。

在jQuery中败富,“key1=value1&key2=value2”作為參數(shù)傳入對(duì)象框架會(huì)自動(dòng)封裝成FormData形式悔醋。在Fetch中進(jìn)行post請(qǐng)求時(shí),需要自動(dòng)創(chuàng)建FormData對(duì)象傳給body兽叮。

示例1 - 網(wǎng)絡(luò)請(qǐng)求的用法

import React, { Component } from 'react';
import {
  StyleSheet,
  Text,
  View,
  TouchableOpacity
} from 'react-native';

// GET請(qǐng)求
function getRequest(url) {
  var opts = {
    method: "GET"
  };

  fetch(url, opts)
  .then((response) => {
    return response.text(); // 返回一個(gè)帶文本的對(duì)象
  })
  .then((responseText) => {
    alert(responseText);
  })
  .catch((error) => {
    alert(error);
  })
}

// POST請(qǐng)求
function postRequest(url) {
  // 將“key1=value1&key2=value2”封裝成FormData形式
  let formData = new FormData();
  formData.append("username", "xiaoming");
  formData.append("password", "123");

  var opts = {
    method: "POST",
    body: formData
  };

  fetch(url, opts)
  .then((response) => {
    return response.text(); // 返回一個(gè)帶文本的對(duì)象
  })
  .then((responseText) => {
    alert(responseText);
  })
  .catch((error) => {
    alert(error);
  })
}

var GetData = React.createClass({
  render: function () {
    return(
      <View style={styles.container}>
        <TouchableOpacity onPress={getRequest.bind(this, "http://demo.php?username=小&password=123")}>
          <View style={styles.btn}>
            <Text>GET</Text>
          </View>
        </TouchableOpacity>
        <TouchableOpacity opPress={postRequest.bind(this, "http://demo.php")}>
          <View style={styles.btn}>
            <Text>POST</Text>
          </View>
        </TouchableOpacity>
      </View>
    );
  }
});

var styles = StyleSheet.create({
  container: {
    flex: 1,
    marginTop: 30,
    backgroundColor: "cyan",
    flexDirection: "row",
    justifyContent: "space-around",
    alignItems: "center"
  },
  btn: {
    width: 60,
    height: 30,
    borderWidth: 1,
    borderRadius: 3,
    borderColor: "black",
    backgroundColor: "yellow",
    justifyContent: "center",
    alignItems: "center"
  },
});

module.exports = GetData;

運(yùn)行結(jié)果:

運(yùn)行結(jié)果.png

示例2 - 網(wǎng)絡(luò)請(qǐng)求獲取列表數(shù)據(jù)

import React, { Component } from 'react';
import {
  StyleSheet,
  Text,
  View,
  TouchableOpacity,
  ListView,
  Image
} from 'react-native';

/*
  展示電影列表

  邏輯:未獲取數(shù)據(jù)時(shí)芬骄,顯示等待頁(yè)面猾愿;獲取數(shù)據(jù)時(shí),顯示電影列表頁(yè)面
  需要給state添加一個(gè)屬性德玫,用于記錄數(shù)據(jù)獲取狀態(tài)
*/

var REQUEST_URL = "https://raw.githubusercontent.com/facebook/react-native/master/docs/MoviesExample.json";

var MovieList = React.createClass({
  // 設(shè)置初始狀態(tài)值
  getInitialState: function () {
    // 定義一個(gè)dataSource對(duì)象
    var ds = new ListView.DataSource({
      rowHasChanged: (oldRow, newRow) => oldRow != newRow
    });
    return {
      // 數(shù)據(jù)是否下載成功的標(biāo)識(shí)
      loaded: false,
      dataSource: ds
    };
  },
  // 請(qǐng)求數(shù)據(jù)
  getData: function () {
      fetch(REQUEST_URL)
      .then((response) => {
        return response.json();
      })
      .then((responseData) => {
        // 刷新組件匪蟀,重新渲染組件,展示ListView
        // 得到新的數(shù)據(jù)宰僧,更新dataSource
        this.setState({
          loaded: true,
          dataSource: this.state.dataSource.cloneWithRows(responseData.movies)
        });
      })
      .catch((error) => {
        alert(error);
      })
  },

  render: function () {
    // 如果未請(qǐng)求到數(shù)據(jù)材彪,提示“加載等待”頁(yè)面
    if (!this.state.loaded) {
      return this.renderLoadingView();
    }

    // 電影列表
    return (
      <ListView
        style={styles.listView}
        dataSource={this.state.dataSource}
        initialListSize={10}
        renderHeader={this._renderHeader}
        renderRow={this._renderRow}
        renderSeparator={this._renderSeparator}
      />
    );
  },
  // 組件掛載完成 生命周期函數(shù)
  componentDidMount: function () {
    // 組件掛載后,開始請(qǐng)求數(shù)據(jù)
    this.getData();
  },

  // 等待加載頁(yè)面
  renderLoadingView: function () {
    return(
      <View style={styles.loadingContainer}>
        <Text style={styles.loadingText}>Loading movies ...</Text>
      </View>
    );
  },

 // 渲染行
 _renderRow: function (movie) {
   return (
     <View style={styles.rowContainer}>
       <Image style={styles.thumbnail} source={{uri:movie.posters.thumbnail}}/>
       <View style={styles.textContainer}>
         <Text style={styles.title}>{movie.title}</Text>
         <Text style={styles.year}>{movie.year}</Text>
       </View>
     </View>
   );
 },

 // 渲染頭部
 _renderHeader: function () {
   return (
     <View style={styles.header}>
       <Text style={styles.header_text}>Movie List</Text>
       <View style={styles.headerSeparator}></View>
     </View>
   );
 },

 // 渲染分割線
 _renderSeparator: function (sectionID: number, rowID: number) {
   var style = {
     height: 1,
     backgroundColor: "#CCC"
   };

   return (
     <View style={style} key={sectionID + rowID}></View>
   );
 }
});

var styles = StyleSheet.create({
  // Loading樣式
  loadingContainer: {
    flex: 1,
    marginTop: 25,
    backgroundColor: "cyan",
    justifyContent: "center",
    alignItems: "center",
  },
  loadingText: {
    fontSize: 30,
    fontWeight: "bold",
    textAlign: "center",
    marginLeft: 10,
    marginRight: 10
  },
  // ListView Row樣式
  rowContainer: {
    flexDirection: "row",
    padding: 5,
    alignItems: "center",
    backgroundColor: "#F5FCFF"
  },
  thumbnail: {
    width: 53,
    height: 81,
    backgroundColor: "gray"
  },
  textContainer: {
    flex: 1,
    marginLeft: 10
  },
  title: {
    marginTop: 3,
    fontSize: 18,
    textAlign: "center"
  },
  year: {
    marginTop: 3,
    marginBottom: 3,
    textAlign: "center"
  },
  // List Header樣式
  header: {
    height: 44,
    backgroundColor: "#F5FCFF"
  },
  header_text: {
    flex: 1,
    fontSize: 20,
    fontWeight: "bold",
    textAlign: "center"
  },
  headerSeparator: {
    height: 1,
    backgroundColor: "#CCC"
  },
  listView: {
    marginTop: 25,
    backgroundColor: "#F5FCFF"
  }
});

module.exports = MovieList;

運(yùn)行結(jié)果

運(yùn)行結(jié)果.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末琴儿,一起剝皮案震驚了整個(gè)濱河市段化,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌造成,老刑警劉巖显熏,帶你破解...
    沈念sama閱讀 212,454評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異晒屎,居然都是意外死亡喘蟆,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,553評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門鼓鲁,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蕴轨,“玉大人,你說我怎么就攤上這事骇吭〕热酰” “怎么了?”我有些...
    開封第一講書人閱讀 157,921評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵燥狰,是天一觀的道長(zhǎng)棘脐。 經(jīng)常有香客問我,道長(zhǎng)龙致,這世上最難降的妖魔是什么蛀缝? 我笑而不...
    開封第一講書人閱讀 56,648評(píng)論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮目代,結(jié)果婚禮上屈梁,老公的妹妹穿的比我還像新娘。我一直安慰自己像啼,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,770評(píng)論 6 386
  • 文/花漫 我一把揭開白布潭苞。 她就那樣靜靜地躺著忽冻,像睡著了一般。 火紅的嫁衣襯著肌膚如雪此疹。 梳的紋絲不亂的頭發(fā)上僧诚,一...
    開封第一講書人閱讀 49,950評(píng)論 1 291
  • 那天遮婶,我揣著相機(jī)與錄音,去河邊找鬼湖笨。 笑死旗扑,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的慈省。 我是一名探鬼主播臀防,決...
    沈念sama閱讀 39,090評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼边败!你這毒婦竟也來了袱衷?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,817評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤笑窜,失蹤者是張志新(化名)和其女友劉穎致燥,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體排截,經(jīng)...
    沈念sama閱讀 44,275評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡嫌蚤,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,592評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了断傲。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片脱吱。...
    茶點(diǎn)故事閱讀 38,724評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖艳悔,靈堂內(nèi)的尸體忽然破棺而出急凰,到底是詐尸還是另有隱情,我是刑警寧澤猜年,帶...
    沈念sama閱讀 34,409評(píng)論 4 333
  • 正文 年R本政府宣布抡锈,位于F島的核電站,受9級(jí)特大地震影響乔外,放射性物質(zhì)發(fā)生泄漏床三。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,052評(píng)論 3 316
  • 文/蒙蒙 一杨幼、第九天 我趴在偏房一處隱蔽的房頂上張望撇簿。 院中可真熱鬧,春花似錦差购、人聲如沸四瘫。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,815評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)找蜜。三九已至,卻和暖如春稳析,著一層夾襖步出監(jiān)牢的瞬間洗做,已是汗流浹背弓叛。 一陣腳步聲響...
    開封第一講書人閱讀 32,043評(píng)論 1 266
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留诚纸,地道東北人撰筷。 一個(gè)月前我還...
    沈念sama閱讀 46,503評(píng)論 2 361
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像畦徘,于是被迫代替她去往敵國(guó)和親毕籽。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,627評(píng)論 2 350

推薦閱讀更多精彩內(nèi)容

  • 本文詳細(xì)介紹了 XMLHttpRequest 相關(guān)知識(shí)旧烧,涉及內(nèi)容: AJAX影钉、XMLHTTP、XMLHttpReq...
    semlinker閱讀 13,645評(píng)論 2 18
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理掘剪,服務(wù)發(fā)現(xiàn)平委,斷路器,智...
    卡卡羅2017閱讀 134,637評(píng)論 18 139
  • AFHTTPRequestOperationManager 網(wǎng)絡(luò)傳輸協(xié)議UDP夺谁、TCP廉赔、Http、Socket匾鸥、X...
    Carden閱讀 4,333評(píng)論 0 12
  • 暮色濃 夜未央 一彎相思掛穹蒼 兩行清淚素顏霜 秋風(fēng)起 葉彷徨 片片干紅情如火 朵朵銀黃訴衷腸 曲悠揚(yáng) 路綿長(zhǎng) 煢...
    默默Mona閱讀 337評(píng)論 3 0
  • 連載:九境成丹萬(wàn)骨枯 《目錄》[http://www.reibang.com/p/4986656b28ca] 上...
    冬知餃子閱讀 433評(píng)論 1 6