当咱们的 SAP UI5 利用里应用了 OData 模型从远端服务器读取数据,具体实现细节能够参考我这篇文章:SAP UI5 初学者教程之二十四 - 如何应用 OData 数据模型,能够在 Chrome 开发者工具里,察看到一个由 SAP UI5 框架主动收回的元数据申请。

申请的 url :

https://services.odata.org/V2...$metadata?sap-language=EN

该申请没有 content-type 字段,只有一个 accept 字段,值为:application/xml

还有一个 MaxDataServiceVersion,值为 3.0

响应的头部字段里,没有 Accept 字段,只有 Content-Type 字段,留神大小写:

具体发动该 HTTP 申请的代码地位:ODataMetadata 的 _loadMetadata 办法:

在构造函数里触发 _loadMetadata:

基于 url 创立 request 对象:

依据如下的 API 取得 HTTP 申请反对的语言:Accept-Language

sap.ui.getCore().getConfiguration().getLanguageTag()

计算出来是:en-US

bAsync 标记位为 true,代表这是个异步申请:

withCredentials 标记位为 false:

而后应用传统的 promise API 发动申请:

如果 metadata 加载胜利,就在其回调里执行初始化逻辑:

if (!this.oMetadata.isLoaded()) {                this.oMetadata.attachFailed(this.onMetadataFailed);            }

上面调用 OData API,传入方才结构好的申请对象,进行申请发送:

进入 datajs.js, 首先 prepareRequest:

normalizeHeaders:对头部字段进行规范化解决,其实就是将头部字段转换成小写:

而后调用 invokeRequest 进行发送:

移交给 httpClient:

datajs.js 的底层还是基于 XHR 即 XmlHttpRequest:

间接应用浏览器原生的 XMLHttpRequest:

这里的 fallback 机制用的是曾经很古老的 ActiveXObject 了,古代浏览器都不会执行到:

var createXmlHttpRequest = function () {        /// <summary>Creates a XmlHttpRequest object.</summary>        /// <returns type="XmlHttpRequest">XmlHttpRequest object.</returns>        if (window.XMLHttpRequest) {            return new window.XMLHttpRequest();        }        var exception;        if (window.ActiveXObject) {            try {                return new window.ActiveXObject("Msxml2.XMLHTTP.6.0");            } catch (_) {                try {                    return new window.ActiveXObject("Msxml2.XMLHTTP.3.0");                } catch (e) {                    exception = e;                }            }        } else {            exception = { message: "XMLHttpRequest not supported" };        }        throw exception;    };

最初调用 xhr.open:

应用 send api 进行申请发送。

更多Jerry的原创文章,尽在:"汪子熙":