Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angularjs 从Breeze到SAP网关的元数据查询始终返回406不可接受_Angularjs_Odata_Breeze_Sap Gateway - Fatal编程技术网

Angularjs 从Breeze到SAP网关的元数据查询始终返回406不可接受

Angularjs 从Breeze到SAP网关的元数据查询始终返回406不可接受,angularjs,odata,breeze,sap-gateway,Angularjs,Odata,Breeze,Sap Gateway,我在Angular 1.3项目中使用BreezeJS 1.5.1来尝试查询SAP网关服务器,我确信它实现了OData。正如标题所述,对$metadata服务的每个请求都会从服务器返回406个不可接受的响应 005056A509B11ED19BEB6513AA349DA5 根据请求中发送的accept标头,请求标识的资源只能生成具有不可接受内容特征的响应实体 我尝试过使用几种不同的适配器配置(“OData”、“OData”、“WebApiOData”)初始化Breeze;这确保Breeze在启

我在Angular 1.3项目中使用BreezeJS 1.5.1来尝试查询SAP网关服务器,我确信它实现了OData。正如标题所述,对$metadata服务的每个请求都会从服务器返回406个不可接受的响应


005056A509B11ED19BEB6513AA349DA5
根据请求中发送的accept标头,请求标识的资源只能生成具有不可接受内容特征的响应实体
我尝试过使用几种不同的适配器配置(“OData”、“OData”、“WebApiOData”)初始化Breeze;这确保Breeze在启动时调用
/$metadata
,而不是
/metadata
,但不会解决问题

//breeze.config.initializedapterninstances({dataService:'OData'});
//initializedapterninstance('dataService','odata',true);
initializedapterninstances({dataService:'webapiodata'});
网关服务器必须始终为其元数据调用返回XML(JSON元数据在SAP上不可用),并且请求的Accept标头出现问题(
Accept:application/JSON;odata.metadata=full
)。我找不到它在Postman中可以接受的标题的正确组合,除了那些直接从Chrome调用元数据服务的标题(
accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
)可以工作

我已经将应用程序指向了不同的服务,甚至不同的网关实例,所有这些都得到了相同的结果。我是否错过了配置的一个基本部分

2014年10月31日编辑 根据下面Ward的回答,我截取了dataJS请求(如中的OData Ajax部分所建议的),并替换了$metadata调用的Accept头

var oldClient=$window.OData.defaultHttpClient;
var myClient={
请求:函数(请求、成功、错误){
$log.log('拦截OData请求',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';
}
返回oldClient.request(请求、成功、错误);
}
};
$window.OData.defaultHttpClient=myClient;

当然,现在有一个不同的问题,但这个问题至少解决了。

不,你没有错过任何基本的东西。然而,SAP可能已经做到了这一点

我记得,OData$元数据请求的结果总是XML,而不是JSON,我相信Breeze会很乐意将其作为XML接收

是的,即使响应不是JSON,accept头也会指定JSON。对于Breeze(或者Data.js库Breeze委托给…还不确定)来说,这有点草率

但SAP不应该惊慌失措。请求的accept头应该是建议性的,服务器应该尽最大努力满足请求媒体类型格式。它不必遵守要求的格式。如果需要,In可以以不同的格式返回

在这种情况下,SAP应该只发送XML格式的元数据。显然,SAP是在挑剔

我很快会调查的。同时,您可以使用$http拦截器自己为这个特定请求修补accept头


稍后再回来。

fyi,在SAP网关中,您可以通过…?$format=JSON或…?$format=XML轻松指定JSON或XML呈现。 默认值是xml。 因此,对于元数据,它将如下所示:
…IWBEP/GWDEMO/ProductCollection/?$metadata&$format=json或…IWBEP/GWDEMO/ProductCollectio/?$metadata&$format=xml

谢谢Ward,很高兴不仅仅是我。我很想听到更多,但在此期间,我将实现一个拦截器,并在它工作后将其标记为可接受的答案。不正确。接受不是建议,而是要求。根据规范,“如果不存在Accept header字段,则假定客户端接受所有媒体类型。如果存在Accept header字段,并且如果服务器无法发送根据组合Accept字段值可接受的响应,则服务器应发送406(不可接受)响应。”--虽然网关调用通常是这样,但$metadata调用是一种特殊情况,不允许使用格式或筛选器参数(至少我提供的网关补丁版本不允许),因此元数据始终以XML形式返回。幸运的是,Breeze在处理XML响应方面做得非常出色。好的方面——我的系统是一个新系统(SP09)。这里元数据也以JSON显示:{d:{EntitySets:[“ContactPersonCollection”、“BusinessPartnerCollection”、“DimensionUnitCollection”、“QuantityUnitCollection”、“SalesOrderCollection”。。。。。