我試圖訪問我不控制的REST服務。第一個問題是該服務不包含Access-Control-Allow-Origin頭,這是一個問題,如果我理解正確,立即將我限制爲JSONP。
此外,默認情況下,此服務發送XML而不是JSON,儘管它能夠發送JSON。我認爲它應該回應我的Accept標題,服務負責人說它看起來在我的內容類型。這意味着我需要做一個POST而不是一個GET(雖然當我剛剛得到一些靜態數據時,get會更有意義,對吧?)。
固執,因爲我在嘗試我的Accept頭。由於角只接受JSON,我希望它默認使用Accept: application/json
頭,但它沒有,而忽略我嘗試手動設置:
app.config(['$httpProvider', function($httpProvider){
console.log($httpProvider.defaults.headers.common);
delete $httpProvider.defaults.headers.common['X-Requested-With'];
$httpProvider.defaults.headers.post['Accept'] = 'application/json, text/javascript';
$httpProvider.defaults.headers.post['Content-Type'] = 'application/json; charset=utf-8';
$httpProvider.defaults.headers.post['Access-Control-Max-Age'] = '1728000';
$httpProvider.defaults.headers.common['Access-Control-Max-Age'] = '1728000';
$httpProvider.defaults.headers.common['Accept'] = 'application/json, text/javascript';
$httpProvider.defaults.headers.common['Content-Type'] = 'application/json; charset=utf-8';
$httpProvider.defaults.useXDomain = true;
}]);
我在實際的資源再這樣做:
return $resource('http://foo.com/getStuff', {}, {
fetch: {
method:'JSONP',
params: params,
headers: {
'Accept':'application/json, text/javascript',
'Content-Type':'application/json; charset=utf-8'
},
isArray:false,
callback: 'JSON_CALLBACK'
}
});
但儘管如此,請求頭包含Accept: */*
。
我的問題是:爲什麼?爲什麼Angular忽略我的頭文件?我怎樣才能讓它使用正確的頭文件呢?
還有:有沒有辦法在POST中使用JSONP?
編輯:本來我使用的是Angular 1.0.7,但我只是用1.2.3試過,得到了相同的結果。標題被忽略,但大家都聲稱這是做到這一點的方法。
我也試着用$ http直接做,而不是用$ resource做,結果相同。
編輯2:這裏是JSFiddle。它是匿名的,不使用我的真實服務器,但使用Firebug /開發人員工具,可以驗證它在兩個呼叫上都發送了Accept: */*
,儘管我多次試圖設置application/json
標題。這是我真正的問題。在我的真實服務器上,我得到了一個XML結果,儘管我真正的服務器能夠發送JSON。
(無論是真實的服務器支持JSONP是目前較少有關這個虛擬的服務器顯然沒有,不過沒關係我只關心頭。)
編輯3:我已經嘗試了兩種解決方案,建議如下:
$http.defaults.headers.common['Accept'] = 'application/json, text/javascript';
$http.defaults.transformRequest.push(function (data, headersGetter) {
headersGetter().Accept = "application/json, text/javascript";
return data;
});
我已經嘗試了兩個報表分別。在控制器中,然後在http呼叫本身之前的服務中。仍然不起作用。
有人可以給我一個的jsfiddle這何處顯示工作?
編輯4:我注意到,當我使用GET而不是JSONP時,Accept頭是正確的。但是,由於它沒有正確的標題,因此拒絕迴應。
應在JSONP調用有什麼樣的頭?因爲有在JSONP調用了很多頭,但沒有將其標識爲JSONP。服務器是否必須有明確的JSONP支持才能正常工作?我突然意識到我對jsonp的瞭解不夠。
您確定您使用的WebService是否響應您的請求的有效[JSONP](http://en.wikipedia.org/wiki/JSONP)? 我注意到的第一件事是,你沒有正確設置你的'callback'查詢參數。 ''resource'應該是:'...,params:{callback:'JSON_CALLBACK'},...'如果可能的話,請提供一個Plunk或者JSFiddle,這樣我們就可以玩你的代碼了。 – vucalur
我相信它不會以有效的JSONP響應。它向我發送XML,可能是因爲我沒有發送正確的標題。我現在的主要問題是正確設置標題,以便服務知道向我發送json或jsonp。 – mcv
我知道,這就是爲什麼我建議首先查看您的REQUEST URL( - :.每個使用JSONP響應的WebService都在URL查詢字符串中搜索'callback',並且永遠不會用JSONP響應,因爲它需要'callback'參數值得這樣做 它基本上提取'callback'參數值併發送:'<< callback_param_value >>(<< response_JSON_object >>);'回給你'application/javascript' – vucalur