[英]Metadata queries to SAP Gateway from Breeze always return 406 Not Acceptable
我在 Angular 1.3 項目中使用 BreezeJS 1.5.1 來嘗試查詢 SAP Gateway 服務器,我確信它實現了 OData。 正如標題所說,對 $metadata 服務的每個請求都會從服務器返回406 Not Acceptable響應。
<error xmlns="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata">
<code>005056A509B11ED19BEB6513AA349DA5</code>
<message xml:lang="en">
The resource identified by the request is only capable of generating response entities which have content characteristics not acceptable according to the accept headers sent in the request
</message>
</error>
我嘗試使用幾種不同的適配器配置('OData'、'odata'、'WebApiOData')初始化 Breeze; 這可確保 Breeze 在啟動時調用/$metadata
而不是/Metadata
,但不會解決問題。
// breeze.config.initializeAdapterInstances({ dataService: 'OData' });
// breeze.config.initializeAdapterInstance('dataService', 'odata', true);
breeze.config.initializeAdapterInstances({ dataService: 'webapiodata' });
網關服務器必須始終為其元數據調用返回 XML(SAP 上不提供 JSON 元數據),並且在處理請求的 Accept 標頭 ( Accept:application/json;odata.metadata=full
) 時Accept:application/json;odata.metadata=full
。 除了直接從 Chrome 調用元數據服務( Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
) 有效。
我已經將應用程序指向不同的服務,甚至是不同的網關實例,所有結果都相同。 我錯過了一個基本的配置嗎?
根據下面 Ward 的回答,我攔截了 dataJS 請求(如http://www.getbreezenow.com/documentation/controlling-ajax的OData Ajax部分所建議的)並替換了 $metadata 調用的 Accept 標頭。
var oldClient = $window.OData.defaultHttpClient;
var myClient = {
request: function (request, success, error) {
$log.log('Intercepting OData request', request.requestUri);
if (endsWith(request.requestUri, '$metadata')) {
request.headers.Accept = 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8';
}
return oldClient.request(request, success, error);
}
};
$window.OData.defaultHttpClient = myClient;
當然現在還有一個不同的問題,但這個問題至少已經解決了。
不,你沒有錯過任何基本的東西。 但是,SAP 可能有。
我記得,OData $metadata 請求的結果始終是 XML,而不是 JSON,我相信 Breeze 會很樂意接收它作為 XML。
是的,即使響應不是 JSON,accept 標頭也會指定 JSON。 這對 Breeze 來說有點草率(或者 Breeze 委托的 Data.js 庫......還不確定)。
但 SAP 不應該驚慌失措。 請求的接受頭應該是建議性的,服務器應該盡其所能滿足請求的媒體類型格式。 它不必遵守請求的格式。 如果需要,可以以不同的格式返回。
在這種情況下,SAP 應該以 XML 格式發送元數據。 顯然,SAP 很挑剔。
我很快就會研究這個。 同時,您可以使用 $http 攔截器為這個特定請求自己修補接受標頭。
稍后再回來。
僅供參考,在 SAP Gateway 中,您可以通過 ...?$format=json 或 ...?$format=xml 輕松指定 JSON 或 XML 呈現。 默認為 xml。 所以對於元數據,它看起來像這樣: ...IWBEP/GWDEMO/ProductCollection/?$metadata&$format=json 或 ...IWBEP/GWDEMO/ProductCollectio/?$metadata&$format=xml
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.