摘要:通過來對數據進行轉化處理或最終暴露給調用者對異常的處理。封裝在實際開發中,的都是相同的,不同的是請求的方法名與參數。上述提到的與的請求時機。下面來看下完整的封裝。
每一門語言都離不開網絡請求,有自己的一套Networking Api。React Native使用的是Fetch。 今天我們來談談與Fetch相關的一些事情。
purpose通過這篇文章,你將了解到以下幾點關于Fetch的獨家報道
Fetch的簡單運用
Fetch的主要Api
Fetch使用注意事項
Fetch的Promise封裝
fetchfetch的使用非常簡單,只需傳入請求的url
fetch("https://facebook.github.io/react-native/movies.json");
當然是否請求成功與數據的處理,我們還需處理成功與失敗的回調
function getMoviesFromApiAsync() { return fetch("https://facebook.github.io/react-native/movies.json") .then((response) => response.json()) .then((responseJson) => { return responseJson.movies; }) .catch((error) => { console.error(error); }); }
通過response.json()將請求的返回數據轉化成json數據以便使用。通過.then來對數據進行轉化處理或最終暴露給調用者;.catch對異常的處理。
以上就是一個簡單的網絡請求,該請求默認是get方式。那么post又該如何請求呢?
Api & Note在fetch中我們直接傳入url進行請求,其實內部本質是使用了Request對象,只是將url出入到了Request對象中。
const myRequest = new Request("https://facebook.github.io/react-native/movies.json"); const myURL = myRequest.url; // https://facebook.github.io/react-native/movies.jsonflowers.jpg const myMethod = myRequest.method; // GET fetch(myRequest) .then(response => response.json()) .then(responseJson => { //todo });
如果我們需要請求post,需要改變Request的method屬性。
fetch("https://mywebsite.com/endpoint/", { method: "POST", headers: { Accept: "application/json", "Content-Type": "application/json", }, body: JSON.stringify({ firstParam: "yourValue", secondParam: "yourOtherValue", }), });
非常簡單,在url后直接傳入{}對象,其中指定method使用post。
相信大家應該都知道get與post的一個主要區別是get可以在url上直接添加參數,而post為了安全都不采用直接將參數追加到url上,而是使用body來傳給service端。
在使用body前,這里還需知道headers。下面某個post請求的headers信息
需要注意的是Content-Type字段,它代表的是service端接收的數據類型,圖片中使用的是application/x-www-form-urlencoded。這對于我們的body來說是非常重要的。只有匹配Content-Type的類型才能正確的傳遞參數信息。
示例的代碼使用的是application/json,所以body使用Json.stringify()進行參數轉換,而對于Content-Type為application/x-www-form-urlencoded,需要使用queryString.stringify()。
Request中除了method、headers與body,還有以下屬性
Request.cache: 請求的緩存模式(default/reload/no-cache)
Request.context: 請求的上下文(audio/image/iframe)
Request.credentials: 請求的證書(omit/same-origin/include)
Request.destination: 請求的內容描述類型
Request.integrity: 請求的 subresource integrity
Request.mode: 請求的模式(cors/no-cors/same-origin/navigate)
Request.redirect: 請求的重定向方式(follow/error/manual)
Request.referrer: 請求的來源(client)
Request.referrerPolicy: 請求的來源政策(no-referrer)
Request.bodyUsed: 聲明body是否使用在response中
請求成功之后,使用.then來轉換數據,使用最多的是Body.json(),當然你也可以使用以下的幾種數據轉換類型
Body.arrayBuffer
Body.blob
Body.formData
Body.text
以上是fetch請求相關的屬性與方法。如果你已經有所了解,那么恭喜你對fetch的基本使用已經過關了,下面對fetch的使用進行封裝。
封裝在實際開發中,url的host都是相同的,不同的是請求的方法名與參數。而對于不同的環境(debug|release)請求的方式也可能不同。例如:在debug環境中為了方便調試查看請求的參數是否正確,我們會使用get來進行請求。所以在封裝之前要明確什么是不變的,什么是變化的,成功與失敗的響應處理。
經過上面的分析,羅列一下封裝需要做的事情。
不變的: host,headers,body.json()
變化的: url,method,body
響應方式: Promise(resolve/reject)
function convertUrl(url, params) { let realUrl = ApiModule.isDebug? url + "?" + queryString.stringify(Object.assign({}, params, commonParams)) : url; if (ApiModule.isDebug) { console.log("request: " + realUrl); } return realUrl; }
首先對url與參數params進行拼接,如果為debug模式將params拼接到url后。這里使用到了Object.assign()將params與commonParams組合成一個{}對象。最終通過queryString.stringify轉化成string。
ApiModule.isDebug是原生傳遞過來的值,對于Android/IOS只需傳遞自己的ApiModule即可。
function getMethod() { return ApiModule.isDebug? "get": "post"; }
上述提到的get與post的請求時機。
const headers = { Accept: "application/json", "Content-Type": "application/x-www-form-urlencoded;charset=UTF-8" };
在headers中Content-Type類型為application/x-www-form-urlencode
function convertBody(params) { return ApiModule.isDebug? undefined : queryString.stringify(Object.assign({}, params, commonParams)); }
由于debug模式使用的是get方式,但get規定是不能有body的,所以這里使用了undefined來標識。同時為了匹配headers中的Content-Type,params的轉化必須使用queryString.stringify;如果接受的是json,可以使用JSON.stringify。
定義完之后fetch對外只需接受params參數即可。
async function fetchRequest(params){ let body = convertBody(params); fetch(convertUrl(baseUrl, params),{ method: method, headers: headers, body: body }) .then((response) => response.json()) .then((responseJson) => { //todo success }) .catch((error) => { if (ApiModule.isDebug) { console.error("request error: " + error); }; //todo error }); }
fetch的請求封裝完成,但我們的成功與失敗的狀態并沒有通知給調用者,所以還需要一個回調機制。Promise是一個異步操作最終完成或者失敗的對象。它可以接受兩個函數resolve、reject
const p = new Promise((resolve, reject){ ... //success resolve("success") //error reject("error") }); //use p.then(success => { console.log(success); }, error => { console.log(error) });
將fetch請求放入到Promise的異步操作中,這樣一旦數據成功返回就調用resolve函數回調給調用者;失敗調用reject函數,返回失敗信息。而調用者只需使用Promise的.then方法等候數據的回調通知。下面來看下完整的fetch封裝。
async function fetchRequest(params){ let body = convertBody(params); return new Promise(function(resolve, reject){ fetch(convertUrl(baseUrl, params),{ method: method, headers: headers, body: body }) .then((response) => response.json()) .then((responseJson) => { resolve(responseJson); }) .catch((error) => { if (ApiModule.isDebug) { console.error("request error: " + error); }; reject(error); }); }); }
之后對fetch的使用就非常簡單了,只需傳入需要的參數即可。
fetchRequest({method: "goods.getInfo", goodsId: 27021599158370074}) .then(res =>{ this.setState({ shareInfo: res.data.shareInfo }); });
以上是有關fetch的全部內容,當然在React Native中還有其它的第三方請求庫:XMLHttpRequest,同時也支持WebSockets。感興趣的也可以去了解一下,相信會有不錯的收獲。
精選文章5分鐘吃透React Native Flexbox
ViewDragHelper之手勢操作神器
tensorflow-梯度下降,有這一篇就足夠了
七大排序算法總結(java)
拉粉環節:感覺不錯的可以來一波關注,掃描下方二維碼,關注公眾號,及時獲取最新知識技巧。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/97153.html
摘要:移動精英開發社群的第期,也是圍繞架構這個話題進行討論。本次我們希望結合實際開發中遇到的問題,來聊聊移動端的架構設計。這樣的模式改進一些,可能會更適合移動端架構。潘衛杰之前我們公司移動端的大項目就是插座式開發的,批量出各個行業的。 此前,58 同城的技術委員會執行主席沈劍在 OneAPM 的技術公開課上分享過一個主題,「好的架構不是設計出來的,而是演技出來的」。因為對很多創業公司而言,隨...
摘要:初步理解如果最近打電話給武漢的小伙伴,他說信號不好,那么相信我,他肯定不是真的信號不好,也不是不想和你說話,而是他可能在冰箱里。。。 初步理解 如果最近打電話給武漢的小伙伴,他說信號不好,那么相信我,他肯定不是真的信號不好,也不是不想和你說話,而是他可能在冰箱里。。。武漢的天氣從來都是喜怒無常的,是吧,屌絲氣十足,今年也是絲毫看不出有任何逆襲的跡象和可能性,當然咱也沒必要去操那個心;好...
摘要:單頁面應用的出現依然存在著爭議性,我們該如何看待他的兩面性呢接下來小生給大家總結一下他的優缺點。單頁面應用的優勢無刷新體驗沒有了令人詬病的頁面頻繁刷新,同時節約瀏覽器資源,路由響應比較及時,提升了用戶的體驗。 前端猿一天不學習就沒飯吃了,后端猿三天不學習仍舊有白米飯擺于桌前。IT行業的快速發展一直在推動著前端技術棧在不斷地更新換代,前端的發展成了互聯網時代的一個縮影。而單頁面應用的發展...
閱讀 2670·2021-11-11 16:54
閱讀 3667·2021-08-16 10:46
閱讀 3447·2019-08-30 14:18
閱讀 3040·2019-08-30 14:01
閱讀 2729·2019-08-29 14:15
閱讀 2012·2019-08-29 11:31
閱讀 3090·2019-08-29 11:05
閱讀 2593·2019-08-26 11:54