1. 程式人生 > >轉載: React Native 採用Fetch方式傳送跨域POST請求

轉載: React Native 採用Fetch方式傳送跨域POST請求

關於跨域:

A上的頁面獲取B上的資源,瀏覽器會檢查伺服器B的HTTP頭(HEAD請求),如果Access-Control-Allow-Origin中有A,或者是萬用字元*,瀏覽器就會允許跨域。這叫CORS,

還有一點比較重要,限制跨域是瀏覽器的行為,而不是JS的行為,你也可以自己開發一個瀏覽器,或者拿開原始碼改,使得自己開發的瀏覽器能夠跨域。

  由於瀏覽器同源策略,凡是傳送請求url的協議、域名、埠三者之間任意一與當前頁面地址不同即為跨域。具體可以查看下錶(來源

  


Fetch以後是趨勢,勢必要取代傳統的Ajax,而且RN框架支援Fetch。下面僅做了一個跨域請求的例子,在本域請求是一樣的,而且更簡單一些。客戶端環境用的是RN寫的一個頁面,也可以用瀏覽器的console控制檯模擬。後端服務用的是NodeJs express框架。

  

1)Fetch請求

[javascript] view plain copy
  1. //傳送Ajax請求
  2.     sendAjax(){  
  3.         //POST方式,IP為本機IP
  4.         fetch("http://192.168.111.102:8085", {  
  5.             method: "POST",  
  6.             mode: "cors",  
  7.             headers: {  
  8.                 "Content-Type""application/x-www-form-urlencoded"
  9.             },  
  10.             body: 'key=1'
  11.         }).then(function (res) {  
  12.             console.log("fetch request ", JSON.stringify(res.ok));  
  13.             if(res.ok){  
  14.                 res.json().then(function (json) {  
  15.                     console.info(json);  
  16.                     Alert.alert('提示','來自後臺數據:名字'+json.name+
    '、年齡'+json.age,[{text: '確定', onPress: () => console.log('OK Pressed!')},]);  
  17.                 });  
  18.             }else{  
  19.                 Alert.alert('提示','請求失敗',[{text: '確定', onPress: () => console.log('OK Pressed!')},]);  
  20.             }  
  21.         }).catch(function (e) {  
  22.             console.log("fetch fail");  
  23.             Alert.alert('提示','系統錯誤',[{text: '確定', onPress: () => console.log('OK Pressed!')},]);  
  24.         });  
  25.     }  

1、mode屬性控制是否允許跨域。same-origin(同源請求)、no-cors(預設)和cros(允許跨域請求),第一種跨域求情會報error,第二種可以請求其他域的指令碼、圖片和其他資源,但是不能訪問response裡面的屬性,第三種可以獲取第三方資料,前提是所訪問的服務允許跨域訪問。否則,會出現如下錯誤:

 

2、Fetch請求後臺時,返回時一個Promise物件。物件支援解析返回資料的方法有:arrayBuffer()、blob()、formData()、json()、text()。

3、Body傳入引數,注意!注意!注意!重要的事情說三次,只能傳啊a=1&b=2...這種引數形式,不可傳物件{a:1,b:2,...},用JSON.stringify({a:1,b:2,...})也不行。在jquery中,傳入物件框架會自動封裝成formData的形式,fetch沒有這個功能。

4、使用時請注意瀏覽器版本,低版本不支援此物件。RN是可以用的

2)Nodejs express框架開啟允許跨域請求: [javascript] view plain copy
  1. //設定跨域訪問
  2. app.all('*'function(req, res, next) {  
  3.     res.header("Access-Control-Allow-Origin""*");  
  4.     res.header("Access-Control-Allow-Headers""X-Requested-With");  
  5.     res.header("Access-Control-Allow-Methods","PUT,POST,GET,DELETE,OPTIONS");  
  6.     res.header("X-Powered-By",' 3.2.1');  
  7.     res.header("Content-Type""application/json;charset=utf-8");  
  8.     next();  
  9. });  
3)Nodejs express框架開啟處理POST資料功能,預設POST請求的引數是在請求體裡面,用res.query是獲取不到的,為{};需要使用res.body獲取,前提是要在express框架裡面開啟body解析功能,否則顯示undefined。 [javascript] view plain copy
  1. var express = require('express');  
  2. //Post方式請求引數放在請求體裡面,需引用body-parser解析body
  3. var bodyParser = require("body-parser");  
  4. var app = express();  
  5. // 引用
  6. app.use(bodyParser.urlencoded({ extended: false }));  
4)支援jsonp方式跨域訪問,開啟跨域訪問後用傳統的jsonp方式請求時,會報錯。因為jsonp請求需要返回一個callback包裹的資料,否則解析出錯。此處有一個坑,用$.ajax({method:POST,dataType:jsonp})方式請求時,依然傳送的是GET請求。 [javascript] view plain copy
  1. //json資料
  2. var  data  =   { "name":   "Test",   "age":   "19" };  
  3. app.get('/'function(req, res) {  
  4.     console.log('get..........');  
  5.     console.log(req.query);  
  6.     if (req.query && req.query.callback) {  
  7.         var str = req.query.callback + "(" + JSON.stringify(data) + ")"//jsonp  
  8.         console.log('jsonp: '+str);  
  9.         res.end(str);  
  10.     }else{  
  11.         console.log('json: '+JSON.stringify(data));  
  12.         res.end(JSON.stringify(data));  
  13.     }  
  14. });  
5)完整程式碼:

1、RN前端

/** * Created by linyufeng on 2016/8/22. */import React, { Component } from 'react';import { AppRegistry, StyleSheet, Text, TouchableHighlight, Alert, View} from 'react-native';class HelloWorld extends Component {//傳送Ajax請求 sendAjax(){ //POST方式 fetch("http://192.168.111.102:8085", { method: "POST", mode: "cors", headers: { "Content-Type": "application/x-www-form-urlencoded" }, body: 'key=1' }).then(function (res) { console.log("fetch request ", JSON.stringify(res.ok)); if(res.ok){ res.json().then(function (json) { console.info(json); Alert.alert('提示','來自後臺數據:名字'+json.name+'、年齡'+json.age,[{text: '確定', onPress: () => console.log('OK Pressed!')},]); }); }else{ Alert.alert('提示','請求失敗',[{text: '確定', onPress: () => console.log('OK Pressed!')},]); } }).catch(function (e) { console.log("fetch fail"); Alert.alert('提示','系統錯誤',[{text: '確定', onPress: () => console.log('OK Pressed!')},]); }); } render() { return ( <View style={styles.container}> <TouchableHighlight style={styles.wrapper} onPress={this.sendAjax}> <View style={styles.button}> <Text>點擊發送Ajax請求</Text> </View> </TouchableHighlight> </View> ); }}const styles = StyleSheet.create({ container: { flex: 1, justifyContent: 'center', alignItems: 'center', backgroundColor: '#F5FCFF', }, wrapper: { borderRadius: 5, marginBottom: 5, }, button: { backgroundColor: '#eeeeee', padding: 10, },});AppRegistry.registerComponent('HelloWorld', () => HelloWorld);
fetch.js 2、NodeJs
/** * Created by linyufeng on 2016/8/22. */var express = require('express');//Post方式請求引數放在請求體裡面,需引用body-parser解析bodyvar bodyParser = require("body-parser");var app = express();// 引用app.use(bodyParser.urlencoded({ extended: false }));//設定跨域訪問app.all('*', function(req, res, next) { res.header("Access-Control-Allow-Origin", "*"); res.header("Access-Control-Allow-Headers", "X-Requested-With"); res.header("Access-Control-Allow-Methods","PUT,POST,GET,DELETE,OPTIONS"); res.header("X-Powered-By",' 3.2.1'); res.header("Content-Type", "application/json;charset=utf-8"); next();});//json資料var data = { "name": "Test", "age": "19" };app.get('/', function(req, res) { console.log('get..........'); console.log(req.query); if (req.query && req.query.callback) { var str = req.query.callback + "(" + JSON.stringify(data) + ")"; //jsonp   console.log('jsonp: '+str); res.end(str); }else{ console.log('json: '+JSON.stringify(data)); res.end(JSON.stringify(data)); }});app.post('/', function(req, res) { console.log('post............'); console.log(req.body); console.log('json: '+JSON.stringify(data)); res.end(JSON.stringify(data));});app.listen(8085, function () { console.log('Listening on port 8085...');});

相關推薦

轉載: React Native 採用Fetch方式傳送POST請求

關於跨域: A上的頁面獲取B上的資源,瀏覽器會檢查伺服器B的HTTP頭(HEAD請求),如果Access-Control-Allow-Origin中有A,或者是萬用字元*,瀏覽器就會允許跨域。這叫CORS, 還有一點比較重要,限制跨域是瀏覽器的行為,而不是JS的行

React Native 採用Fetch方式傳送POST請求

Fetch以後是趨勢,勢必要取代傳統的Ajax,而且RN框架支援Fetch。下面僅做了一個跨域請求的例子,在本域請求是一樣的,而且更簡單一些。客戶端環境用的是RN寫的一個頁面,也可以用瀏覽器的console控制檯模擬。後端服務用的是NodeJs express框架。   

React 採用Fetch方式傳送POST請求

主實現類: import fetch from ‘isomorphic-fetch’; export default async function post(url,method,params)

JS問題以及採用JSONP方式解決問題

在做專案的時候,客戶要做成客戶端和服務端兩部分,客戶端向服務端進行認證,我開始的時候沒有直接替換ip地址,後來採用ip地址替換之後,出現了問題,後臺可以收到訪問的請求,但是無法拿到後臺返回的資訊,後來

SpringBoot專案ajax post請求問題的完美解決方式(詳細步

最近專案上不是很緊,想利用這段時間學學Es6的新特性,今天正好學到ES6為了解決js“回撥地獄”問題出的Promise新物件。於是就使用以前寫的SpringBoot專案做後臺,前臺就新寫一個HTML檔案。前後臺都準備好了,就著手準備用ajax試試看介面可不可以走通,於是本次文

vue-resource post請求詳解

vue-resource 跨域 post請求時,需要後端工程師配合設定 Access-Control-Allow-Origin 為 * 在使用之前要下載和引入:cnpm install vue-resource --save  //這裡我使用的是淘寶的cn

ajaxpost請求

為什麼會出現跨域問題? 首先我們要先了解一個概念--同源策略。同源策略,它是由Netscape提出的一個著名的安全策略。現在所有支援JavaScript 的瀏覽器都會使用這個策略。所謂同源是指,域名,協議,埠相同。目的是出於安全考慮,防止js指令碼隨意呼叫其他網站的資源。

ajaxpost請求的java代理實現

    最近開發的專案有個功能的需求如下:根據使用者提供的外部連結(outter_url),在頁面填寫好查詢條件(param)並向該url發起查詢請求,查詢返回的資料來動態生成html的table來顯示資料,同時要求請求的方法是post請求。 在開發過程中用的是jquery

教你React Native使用fetch實現圖片上傳

本篇文章主要介紹了React Native使用fetch實現圖片上傳的示例程式碼,寫的十分的全面細緻,具有一定的參考價值,對此有需要的朋友可以參考學習下。如有不足之處,歡迎批評指正。 普通網路請求引數是JSON物件 圖片上傳的請求引數使用的是formData物件 使用fet

ReactFetch之cors請求的使用

本篇文章主要介紹了react中fetch之cors跨域請求的實現方法,寫的十分的全面細緻,具有一定的參考價值,對此有需要的朋友可以參考學習下。如有不足之處,歡迎批評指正。 專案中使用了react,當中需要使用fetch來代替ajax。 由於react的create_reac

react native元件通訊方式

1:父元件給子元件通過props 2:   通過回撥父元件傳遞一個函式 子元件將執行結果回傳給父元件 3:通過ref方式引用元件呼叫方法,傳遞引數。 4:通過廣播事件監聽DeviceEventEmitter 註冊監聽事件 5:可以不通過state或者props來更新子vie

通過註解的方式允許

兩種 需要 ber 接口 XML 其他 協作開發 post 可能 SpringMVC解決跨域的兩種方案 1. 什麽是跨域 跨域,即跨站HTTP請求(Cross-site HTTP request),指發起請求的資源所在域不同於請求指向資源所在域的HTTP請求。 2. 跨

create-react-app創建react項目,使用axios

資源 使用 ios https 問題 use 圖片 圖表 json 最近用react做項目練手,項目中調用接口有跨域問題,引用的插件是axios,react項目是用 create-react-app創建的,解決跨域問題可以後臺設置cros(跨域資源共享),如果前端解

fetch各種報錯誤,數據無法獲取的解決方案

pla 簡單的 eth 博客 tar 是你 -a redirect 就是 1、介紹 fetch 提供了一個獲取資源的接口 (包括跨域)。 fetch 的核心主要包括:Request , Response , Header , Body 利用了請

八種方式實現請求

防範 erro create ati brush col html5新特性 ole als 瀏覽器的同源策略 ? 提到跨域不能不先說一下”同源策略”。 ? 何為同源?只有當協議、端口、和域名都相同的頁面,則兩個頁面具有相同的源。只要網站的 協議名protocol、 主

https 傳送get或post請求時忽略證書認證方式

原創地址:http://www.cnblogs.com/shipengzhi/archive/2012/08/22/2650953.html 在開發java時呼叫別人介面(這個介面還是https開頭的)過程中,需要認證你的證書,然而測試伺服器常常沒有一個(有效的)SSL證書。在你的客戶端連線測試伺

SpringBoot(十三)CORS方式實現

什麼是跨域?瀏覽器從一個域名的網頁去請求另一個域名的資源時,域名、埠、協議任一不同,都是跨域 。 跨域資源訪問是經常會遇到的場景,當一個資源從與該資源本身所在的伺服器不同的域或埠請求一個資源時,資源便會發起一個跨域 HTTP 請求。出於安全考慮,瀏覽器會限制從指令碼內發起的跨域HTTP請求。

Axios傳送請求時,預設不攜帶cookie的問題解決示例。

問題發現: 在使用vue開發學子商城專案時,發現登入頁面即使登入成功了,也無法將正確的登入狀態資訊傳遞迴主頁。 如圖:登陸成功之後,登入狀態碼為1,且通過cookie儲存下來,跳轉到首頁後通過axios請求獲取cookie中儲存的登入狀態碼。但是此時獲取到的狀態碼卻

Java Web 學習筆記之十二:JBoss RestEasy處理OPTIONS請求方式

跨域請求問題 前提 前後端分離的B/S架構系統 前後端獨立開發,後端採用JBoss restEasy 框架搭建restful服務 後端程式碼開發完成並且部署在某一臺測試機上 前端開發過程中,需

post方式傳遞資料解決方案--CORS

摘要: 一晃又到新年了,於是開始著手好好整理下自己的文件,順便把一些自認為有意義的放在部落格上,記錄成點的點滴。         跨域是我在日常面試中經常會問到的問題,這詞在前端界出現的頻率不低,主要原因還是由於安全限制(同源策略, 即JavaScript或