options請求

以前寫用node.js寫了api後臺,但在對接的時候遇到了很多的問題.node

res.body

由於實驗比較簡單,就用了jquery的ajax請求數據,再用post方法發送數據時,api用res.body老是讀不到數據,發現頭部:Content-Type: application/x-www-form-urlencoded,這致使了發送數據時是以表單形式發送的,用res.body不能獲取數據.解決方法也簡單,就是把content-Type改爲application/json就好了.jquery

$.ajax({

    type: 'POST',

    contentType: 'application/json',

    url: 'http://localhost:3000/' ,

    data:  JSON.stringify({name: 'zhansan'}),

    success: function() {
        console.log('success');
    } ,

    dataType: 'json'

});

options請求

一開始我覺得改成請求頭就好了,誰知道改完以後,後臺接口連請求都沒有接收到。打開瀏覽器一看,請求方法變成了options,說實話,以前只是據說過這個方法,但根本不知道爲何會出現這個方法,也不知道這個方法有什麼用:ios

clipboard.png

去搜索了一下:爲何會有options請求ajax

文章寫的挺詳細:json

規範要求,對那些可能對服務器數據產生反作用的 HTTP 請求方法(特別是 GET 之外的 HTTP 請求,或者搭配某些 MIME 類型的 POST 請求),瀏覽器必須首先使用 OPTIONS 方法發起一個預檢請求(preflight request),從而獲知服務端是否容許該跨域請求。服務器確認容許以後,才發起實際的 HTTP 請求。
以前沒用contentType:application/json沒有出現options請求,是由於options請求只針對複雜請求,簡單請求不會觸發options請求,文章也有發送options請求的條件:
當請求知足下述任一條件時,即應首先發送預檢請求(使用OPTIONS):

一、使用了下面任一 HTTP 方法:api

PUT跨域

DELETE瀏覽器

CONNECT安全

OPTIONS服務器

TRACE

PATCH

二、人爲設置了對 CORS 安全的首部字段集合以外的其餘首部字段。該集合爲:

Accept

Accept-Language

Content-Language

Content-Type (but note the additional requirements below)

DPR

Downlink

Save-Data

Viewport-Width

Width

三、Content-Type 的值不屬於下列之一:

application/x-www-form-urlencoded

multipart/form-data

text/plain
最後的解決,在後臺加上容許optiosn請求便可:

app.all('*', function (req, res, next) {
res.header("Access-Control-Allow-Origin", "*");
res.header("Access-Control-Allow-Headers", "X-Requested-With, accept, origin, content-type");
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();
});

總結

感受本身基礎還不是很好,還有不少的基礎知識不瞭解,因此在實踐的時候常常會遇到許多意想不到的事。

相關文章
相關標籤/搜索