簡體   English   中英

從 Breeze 到 SAP Gateway 的元數據查詢總是返回 406 Not Acceptable

[英]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 ) 有效。

我已經將應用程序指向不同的服務,甚至是不同的網關實例,所有結果都相同。 我錯過了一個基本的配置嗎?

編輯 31/10/14

根據下面 Ward 的回答,我攔截了 dataJS 請求(如http://www.getbreezenow.com/documentation/controlling-ajaxOData 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM