如何製作 header 傳送及接收資料
之前想說在header帶上參數,就可以POST到另一個API調用資料,這是一件很單純的問題,沒想到竟然這麼多問題啊!!
研究了很久,怎麼傳都無法傳過去,
- 先是 CROS (Cross-origin resource sharing)
- header 設定方式
- 接收 header 的一些基本問題
以下是 ajax 的範例表式。
1.以下是 ajax 的範例表式,兩種方式都可以
使用 headers {key:value} 來傳送資料
function uploadfile(){
var url = 'http://tt.bbb.com/';
$.ajax({
url : url,
dataType: 'json',
data : 'tttt',
type : 'POST',
headers : {
'ver' : '1.0',
'fileType' : 'mp4',
'md5' : '47e954ec481d097e96261d993ec43ba5',
'fileSize' : 276505673
},
success: function(data) {
console.log(data);
}
});
}
使用beforeSend:function來傳送資料
function uploadfile(){
var url = 'http://tt.bbb.com/';
$.ajax({
url : url,
dataType: 'json',
data : 'tttt',
type : 'POST',
beforeSend:function(xhr){
xhr.setRequestHeader('ver','1.0');
xhr.setRequestHeader('fileType','mp4');
xhr.setRequestHeader('md5','47e954ec481d097e96261d993ec43ba5');
xhr.setRequestHeader('fileSize',276505673);
},
success: function(data) {
console.log(data);
}
});
}
2.Server 端的設定
<?php
header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Methods: POST, GET, OPTIONS, PUT, DELETE');
header('Access-Control-Allow-Headers: *');
header('Access-Control-Allow-Credentials: true');
header('Access-Control-Expose-Headers: *');
header('Ver:1.0.1');
header('Status:OK');
header('StatusNum:200');
header('Msg:succuss');
?>
從這個 PHP 範例可以看到,都是 header,這就是要設定讓其它非相同網域使用者可以傳送值過來。
header(‘Access-Control-Allow-Origin: *’);
允許 * 任何 來源連線
header(‘Access-Control-Allow-Methods: POST, GET, OPTIONS, PUT, DELETE’);
允許 使用POST, GET, OPTIONS, PUT, DELETE 方式連線
header(‘Access-Control-Allow-Headers: *’);
允許 * 任何 header參數連線
header(‘Access-Control-Expose-Headers: *’);
允許 * 任何 header參數 可以被取得
(最後就是掛在這,因為要實現取得header回傳的資料,這部份要開啟)
例如,只允許開始四個參數名可存取的話也可以這樣寫
header(‘Access-Control-Expose-Headers: Ver, Status, StatusNum, Msg’);
3.如何取得 header 的 ajax 方式
使用 success 的回傳 (data, status, xhr), xhr.getResponseHeader(‘KEY’); 即可
function uploadfile(){
var url = 'http://tt.bbb.com/';
$.ajax({
url : url,
type : 'POST',
headers : {
'ver' : '1.0',
'fileType' : 'mp4',
'fileMd5' : '47e954ec481d097e96261d993ec43ba5',
'fileSize' : 276505673
},
error: function(XMLHttpRequest, textStatus, errorThrown) {
console.log(XMLHttpRequest);
console.log(textStatus);
console.log(errorThrown);
},
success: function(data, status, xhr) {
console.log(xhr.getResponseHeader('Ver'));
console.log(xhr.getResponseHeader('Status'));
console.log(xhr.getResponseHeader('StatusNum'));
console.log(xhr.getResponseHeader('Msg'));
},
failure: function(data) {
console.log(data);
}
});
}
4.另外補充說明一下有關 Options 的部份
你知道在使用 Ajax POST 時,在Chrome develop 上面會看到兩次的連線,是為什麼呢?這就是CROS在確認你的連線請求的權限。
如下圖,目地的是 tt.bbb.com 但在連線狀態這裡出現了兩次的連線。這個部份我們稱為 Preflight Request,中文叫「預檢請求」。
第一次請求是用 Options 主要是確認來源是否有使用的權限,如果有的話,才會進行至正式流程,如果沒有開啟對應的權限,你的headers的 key : value 就會變成下面這樣一串 Access-Control-Request-Headers: filemd5, filesize, filetype, ver ,Server端就一直無法解析。
如果你的目的地主機設定都是正常的,那你就會進入 POST 流程,然後你的Request Headers 就會看到正常的資料,Key : Value 都是一組一組的。


