以前寫用node.js寫了api後臺,但在對接的時候遇到了很多的問題.node
由於實驗比較簡單,就用了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,說實話,以前只是據說過這個方法,但根本不知道爲何會出現這個方法,也不知道這個方法有什麼用:ios
去搜索了一下:爲何會有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(); });
感受本身基礎還不是很好,還有不少的基礎知識不瞭解,因此在實踐的時候常常會遇到許多意想不到的事。