1. 程式人生 > >跨域請求 fetch 實現

跨域請求 fetch 實現

1.CORS 的分類

分為兩大類:簡單的請求;帶有preflight預請求的CORS。兩類請求的區分標準如下:

簡單請求

某些請求不會觸發 CORS 預檢請求。本文稱這樣的請求為“簡單請求”。若請求滿足所有下述條件,則該請求可視為“簡單請求”:

 1. 使用下列方法之一: GET HEAD POST 
 2. Fetch 規範定義了對 CORS 安全的首部欄位集合,不得人為設定該集合之外的其他首部欄位。該集合為: Accept Accept-Language Content-Language Content-Type (需要注意額外的限制) DPR Downlink Save-Data
Viewport-Width Width 3. Content-Type 的值屬於下列之一: application/x-www-form-urlencoded multipart/form-data text/plain

剩下的都是,帶有preflight的CORS。帶有preflight的CORS ,瀏覽器會先發出一個 OPTIONS請求,伺服器在響應裡寫入是否允許該域名發起訪問,在response的header裡面加入了Access-Control-Allow-Origin,Access-Contral-Allow-Methods,Access-Contraol-Allow-Headers,Access-Control-Max-Age,這幾個欄位(各個欄位詳細意義參見

reference 1),
這裡寫圖片描述

2.進行帶有身份憑證的CORS 請求

預設情況下的跨域請求都是不會把cookie傳送給伺服器的,在需要傳送的情況下,如果是xhr,那麼需要設定xhr.withCredentials = true,如果是採用fetch獲取的話,那麼需要在request裡面設定 credentials:'include', 但是如果伺服器在預請求的時候沒返回Access-Control-Allow-Crenditials:true的話,那麼在實際請求的時候,cookie是不會被髮送給伺服器端的,要特別注意對於簡單的get請求,不會有預請求的過程,那麼在實際請求的時候,如果伺服器沒有返回Access-Control-Allow-Crenditials:true

的話 那麼響應結果瀏覽器也不會交給請求者

3.fetch的配置

import {
  baseUrl
} from '../../config/env.config.js'
import {formDataToJson} from '../../utils/form.js';
import * as es6Promise from 'es6-promise'
import 'isomorphic-fetch'

es6Promise.polyfill();

export default async(type = 'GET', url = '', data = {}) => {

  type = type.toUpperCase();
  url = baseUrl + url;

  if (type == 'GET') {
    let dataStr = ''; //資料拼接字串
    Object.keys(data).forEach(key => {
      dataStr += key + '=' + data[key] + '&';
    })

    if (dataStr !== '') {
      dataStr = dataStr.substr(0, dataStr.lastIndexOf('&'));
      url = url + '?' + dataStr;
    }
  }
  if (type == 'DELETE') {
    url = url + "/" + data.id;
  }

  let requestConfig = {
    credentials: 'include',
    method: type,
    headers: {
      'Accept': 'application/json',
      'Content-Type' : 'application/json'
    },
    mode: "cors",
    cache: "force-cache"
  }

  if (type == 'POST') {
    if (window.FormData && data instanceof FormData) {
      Object.defineProperty(requestConfig, 'body', {
        value: formDataToJson(data)
      })
    } else {
      Object.defineProperty(requestConfig, 'body', {
        value: JSON.stringify(data)
      })
    }

  }

  try {
    var response = await fetch(url, requestConfig);
    var responseJson = await response.json();
  } catch (error) {
    throw new Error(error)
  }
  return responseJson

}

相關推薦

請求:Fetch實現請求與POST方式引數提交

一、要實現跨域,首先需要理解什麼叫做跨域。 跨域是指,不同域名之間相互訪問。 例如 :我的電腦上有2個伺服器 192.168.0.11 192.168.0.12 如果第一個伺服器上的頁面要訪問第二個伺服器,就叫做跨域 或者http://www.baidu.com

請求 fetch 實現

1.CORS 的分類 分為兩大類:簡單的請求;帶有preflight預請求的CORS。兩類請求的區分標準如下: 簡單請求 某些請求不會觸發 CORS 預檢請求。本文稱這樣的請求為“簡單請求”。若請求滿足所有下述條件,則該請求可視為“簡單請求”:

ajax請求簡單實現Java後臺

因為官網有一個合作加盟的功能,需要一個表單錄入,但是官網除了這個功能,都是靜態頁面,所以就準備寫一個ajax跨域,儲存到之前公司專案的後臺管理系統去,第一次用ajax跨域,網上很多參考。這也是我的第一篇博文,準備以後養成這個習慣,以備後期參考。。。。。 通過自己N久找程式碼

vue.js 請求 fetch / axios

跨域請求配置 在vue專案下 找到  config  > index.js 檔案;修改 index.js 檔案下的 proxyTable 物件的內容;如下 proxyTable: { '/api': { //

利用jsonp實現請求

get p地址 doc ajax請求 -s tar 原理 安全策略 都是   同源策略,它是由Netscape提出的一個著名的安全策略。現在所有支持JavaScript 的瀏覽器都會使用這個策略。所謂同源是指,域名,協議,端口相同。當一個瀏覽器的兩個tab頁中分別打開來 百

ajax獲取json數據及實現請求

cgi size 域名 3.2 方便 nap 不清楚 anti dex 最近想練習一下ajax獲取json數據 , 首先上網找一些在線的可用來測試的接口. -----------------------------------------------------這裏是接口分

【原】fetch請求附帶cookie(credentials)

allow src ssi ann oct o-c ech .com 頭部 HTTP訪問控制 https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Access_control_CORS 解決跨域的方式有很多種,本文介紹“跨域請

Java實現CORS請求

先來 pty contain type 資源共享 服務端 header req options 問題 使用前後端分離模式開發項目時,往往會遇到這樣一個問題 -- 無法跨域獲取服務端數據 這是由於瀏覽器的同源策略導致的,目的是為了安全。在前後端分離開發模式備受青睞的今天,前

[轉] 利用CORS實現請求

src 流程圖 exp 否則 expose 前端 eof 目前 star [From] http://newhtml.net/using-cors/ 跨域請求一直是網頁編程中的一個難題,在過去,絕大多數人都傾向於使用JSONP來解決這一問題。不過現在,我們可以考慮一下

nginx 實現 ajax 請求

ini syn methods acc -m www eth tran 響應 原文:http://www.nginx.cn/4314.html AJAX從一個域請求另一個域會有跨域的問題。那麽如何在nginx上實現ajax跨域請求呢?要在nginx上啟用跨域

WebAPI Ajax 請求解決方法(CORS實現

custom XML header 就會 情況 取數 -o cross serve 概述 ASP.NET Web API 的好用使用過的都知道,沒有復雜的配置文件,一個簡單的ApiController加上需要的Action就能工作。 但是在使用API的時候總會遇到跨

jsonp _____請求實現

ont pan text company () quest function status cross 請求如下: $.ajax({ type: "GET", async:false, url: "http://127.0.0.1:8080/Cross-sit

vue-cli項目本地代理實現請求

con 跨域 請求 AR url 本地 dex ams gin   使用 Vue-cli 創建的項目,開發地址是 localhost:8080,需要訪問非本機上的接口http://10.1.0.34:8000/queryRole。不同域名之間的訪問,需要跨域才能正確請求。跨

八種方式實現請求

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

WebAPI實現請求

一、跨域問題的由來     目前專案實現前後端分離,所以就會那麼此時前端和後端分別在不同的伺服器上,此時就會涉及到跨域問題。再具體說明一下。 1.前後端未分離:原來我們的積分系統採用MVC框架,整個系統的前端以及後端邏輯都在一個解決方案中,此時我們稱之為前後端沒有分離。

利用原生js實現ajax請求資料

首先,頁面中不需要引入任何的檔案。 1、前臺html頁面 <script> //定義一個ajax var $ = { ajax:function(option){ var url = option.url; var ca

axios實現請求

在使用vue.js進行開發,我們會遇到跨域請求的情況,這裡記錄下自己所遇到的情況。 使用的是目前主流的axios進行請求,首先開啟config資料夾下的index檔案,在proxyTable裡面新增程式碼 proxyTable: { '/api': { t

Vue前端服務代理實現請求資料。

開發中請求真實伺服器資料,配置伺服器代理實現跨域。 vue-cli + webpack 構建的專案 再 ./config/index.js 檔案中配置 proxyTable: { '/api':{ target: 'http://請求的伺服器地址',

Vue實現請求

實現跨域請求有兩種方式: 1、fetch (1)在App.vue中使用created方法建立fetch,將域名及方法等建立,如下圖 (2)在config配置檔案中的index.js中的跨域區域中寫入如下程式碼: (3)完善資訊,將介面相應的需求補充完整

cors實現請求請求

簡介 CORS:全稱"跨域資源共享"(Cross-origin resource sharing)。 CORS需要瀏覽器和伺服器同時支援,才可以實現跨域請求,目前幾乎所有瀏覽器都支援CORS,IE則不能低於IE10。CORS的整個過程都由瀏覽器自動完成,前端無需做任何設定