Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.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
Odata 带有本地数据的UI5模拟服务器;rootUri";不起作用_Odata_Sapui5_Mockserver - Fatal编程技术网

Odata 带有本地数据的UI5模拟服务器;rootUri";不起作用

Odata 带有本地数据的UI5模拟服务器;rootUri";不起作用,odata,sapui5,mockserver,Odata,Sapui5,Mockserver,我目前正在执行以下操作,并且一直坚持:模拟服务器配置 问题在于模拟服务器的rootUri配置。我正在使用as per教程,并在manifest.json中为发票配置了dataSource 现在,为了使用本地模拟数据而不是在线服务,我创建了教程中所述的必要文件。然后,当我运行mockServer.html时,服务器不会将服务请求重定向到本地mock数据,而是发出请求并由于web安全问题而失败 如果使用以下rootUri,模拟服务器不会重定向,服务请求失败: // Snippet from mock

我目前正在执行以下操作,并且一直坚持:模拟服务器配置

问题在于模拟服务器的
rootUri
配置。我正在使用as per教程,并在
manifest.json
中为发票配置了
dataSource

现在,为了使用本地模拟数据而不是在线服务,我创建了教程中所述的必要文件。然后,当我运行
mockServer.html
时,服务器不会将服务请求重定向到本地mock数据,而是发出请求并由于web安全问题而失败

如果使用以下
rootUri
,模拟服务器不会重定向,服务请求失败:

// Snippet from mockserver.js
var oMockServer = new MockServer({
    rootUri: "/destinations/northwind/V2/Northwind/Northwind.svc/"
});
未能加载$metadata?sap语言=DE: 对飞行前请求的响应未通过访问控制检查: 请求的资源上不存在“Access Control Allow Origin”标头。 因此,不允许访问源“”。 响应的HTTP状态代码为501

显示使用“通配符”根uri的模拟服务器,但这也会失败:

// Snippet from mockserver.js
var oMockServer = new MockServer({
    rootUri: "/"
});
使模拟服务器配置工作的唯一方法是使用与manifest.json中写入的
rootUri
完全相同的URL作为我要模拟的数据源的URI:

// Snippet from mockserver.js
var oMockServer = new MockServer({
    rootUri: "https://services.odata.org/V2/Northwind/Northwind.svc/"
});
上面的代码可以工作,但Web IDE指出这是一种不好的做法:

错误:Fiori体系结构指南:ESLint(sap无硬编码url):找到硬编码(非相对)url。()

我现在的问题是:如何使用相对的
rootUri


webapp/manifest.json(摘录)


webapp/test/mockServer.html

<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <meta charset="utf-8">
        <title>Hello World App - Test Page</title>
        <script src="/resources/sap-ui-core.js"
                id="sap-ui-bootstrap"
                data-sap-ui-theme="sap_belize"
                data-sap-ui-libs="sap.m"
                data-sap-ui-compatVersion="edge"
                data-sap-ui-preload="async"
                data-sap-ui-resourceroots='{
                    "sap.ui.tutorial.walkthrough": "../"
                }'></script>

        <script type="text/javascript">
            sap.ui.getCore().attachInit(function() {
                sap.ui.require([
                    "sap/ui/tutorial/walkthrough/localService/mockserver",
                    "sap/m/Shell",
                    "sap/ui/core/ComponentContainer"
                ], function(mockserver, Shell, ComponentContainer) {
                    mockserver.init();

                    new Shell({
                        app: new ComponentContainer({
                            name: "sap.ui.tutorial.walkthrough",
                            height: "100%"
                        })
                    }).placeAt("content")
                });
            });
        </script>
    </head>
    <body class="sapUiBody" id="content">
    </body>
</html>

webapp/localService/metadata.xml

<edmx:Edmx Version="1.0" xmlns:edmx="http://schemas.microsoft.com/ado/2007/06/edmx">
    <edmx:DataServices m:DataServiceVersion="1.0" m:MaxDataServiceVersion="3.0"
                       xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata">
        <Schema Namespace="NorthwindModel" xmlns="http://schemas.microsoft.com/ado/2008/09/edm">
            <EntityType Name="Invoice">
                <Key>
                    <PropertyRef Name="ProductName"/>
                    <PropertyRef Name="Quantity"/>
                    <PropertyRef Name="ShipperName"/>
                </Key>
                <Property Name="ShipperName" Type="Edm.String" Nullable="false" MaxLength="40" FixedLength="false"
                          Unicode="true"/>
                <Property Name="ProductName" Type="Edm.String" Nullable="false" MaxLength="40" FixedLength="false"
                          Unicode="true"/>
                <Property Name="Quantity" Type="Edm.Int16" Nullable="false"/>
                <Property Name="ExtendedPrice" Type="Edm.Decimal" Precision="19" Scale="4"/>
            </EntityType>
        </Schema>
        <Schema Namespace="ODataWebV2.Northwind.Model" xmlns="http://schemas.microsoft.com/ado/2008/09/edm">
            <EntityContainer Name="NorthwindEntities" m:IsDefaultEntityContainer="true" p6:LazyLoadingEnabled="true"
                             xmlns:p6="http://schemas.microsoft.com/ado/2009/02/edm/annotation">
                <EntitySet Name="Invoices" EntityType="NorthwindModel.Invoice"/>
            </EntityContainer>
        </Schema>
    </edmx:DataServices>
</edmx:Edmx>

在为模拟服务器定义
rootUri
时,需要注意一些规则

rootUri

  • 应该是相对的
  • 必须以斜杠结束(
    “/”
  • 必须与分配给模型的URI匹配
在以下文件中提到:

(rootUri)与描述符文件中数据源的URL匹配

以及在主题中:

根URI必须是相对的,并且需要结尾的“/”。它还需要匹配OData/JSON模型或简单XHR调用中的URI集,以便模拟服务器拦截它们


因此,如何定义
rootUri
并不重要,只要它满足上述三个要求。这就是为什么像
rootUri:“/”
这样的任意uri也可以工作,但是只有当数据源中的
uri
相同时才能工作

在您的情况下,如下更改
rootUri
值应使模拟服务器运行:

var-oMockServer=新建MockServer({
rootUri:“/destinations/northwind/V2/northwind/northwind.svc/”
});
分别在应用程序描述符(manifest.json)中:

“数据源”:{
“发票远程”:{
“uri”:“/destinations/northwind/V2/northwind/northwind.svc/”,
“类型”:“OData”,
“设置”:{
“odataVersion”:“2.0”
}
}
}
要使该路径在非MockServer场景中工作,您需要在项目中相应地添加和。

无需更改应用程序代码。

在为模拟服务器定义
rootUri
时,需要注意一些规则

rootUri

  • 应该是相对的
  • 必须以斜杠结束(
    “/”
  • 必须与分配给模型的URI匹配
在以下文件中提到:

(rootUri)与描述符文件中数据源的URL匹配

以及在主题中:

根URI必须是相对的,并且需要结尾的“/”。它还需要匹配OData/JSON模型或简单XHR调用中的URI集,以便模拟服务器拦截它们


因此,如何定义
rootUri
并不重要,只要它满足上述三个要求。这就是为什么像
rootUri:“/”
这样的任意uri也可以工作,但是只有当数据源中的
uri
相同时才能工作

在您的情况下,如下更改
rootUri
值应使模拟服务器运行:

var-oMockServer=新建MockServer({
rootUri:“/destinations/northwind/V2/northwind/northwind.svc/”
});
分别在应用程序描述符(manifest.json)中:

“数据源”:{
“发票远程”:{
“uri”:“/destinations/northwind/V2/northwind/northwind.svc/”,
“类型”:“OData”,
“设置”:{
“odataVersion”:“2.0”
}
}
}
要使该路径在非MockServer场景中工作,您需要在项目中相应地添加和。

无需更改应用程序代码。

本教程第27章中的一些细节非常容易引起误解

  • MockServer的
    rootUri
    必须与manifest.json中数据源的
    uri
    参数匹配

  • 不要将datasource的uri更改为教程中给出的MockServer的(错误的)
    rootUri
    ,实际上应该将MockServer的
    rootUri
    更改为外部源的uri。在
    webapp/localService/mockserver.js中使用以下更正的块:

        var oMockServer = new MockServer({
            rootUri: "https://services.odata.org/V2/Northwind/Northwind.svc/"
        });
    
  • 这将创建一个MockServer,拦截对该外部URI的所有调用,并在本地响应它们。有了这个结构,它实际上是
    <edmx:Edmx Version="1.0" xmlns:edmx="http://schemas.microsoft.com/ado/2007/06/edmx">
        <edmx:DataServices m:DataServiceVersion="1.0" m:MaxDataServiceVersion="3.0"
                           xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata">
            <Schema Namespace="NorthwindModel" xmlns="http://schemas.microsoft.com/ado/2008/09/edm">
                <EntityType Name="Invoice">
                    <Key>
                        <PropertyRef Name="ProductName"/>
                        <PropertyRef Name="Quantity"/>
                        <PropertyRef Name="ShipperName"/>
                    </Key>
                    <Property Name="ShipperName" Type="Edm.String" Nullable="false" MaxLength="40" FixedLength="false"
                              Unicode="true"/>
                    <Property Name="ProductName" Type="Edm.String" Nullable="false" MaxLength="40" FixedLength="false"
                              Unicode="true"/>
                    <Property Name="Quantity" Type="Edm.Int16" Nullable="false"/>
                    <Property Name="ExtendedPrice" Type="Edm.Decimal" Precision="19" Scale="4"/>
                </EntityType>
            </Schema>
            <Schema Namespace="ODataWebV2.Northwind.Model" xmlns="http://schemas.microsoft.com/ado/2008/09/edm">
                <EntityContainer Name="NorthwindEntities" m:IsDefaultEntityContainer="true" p6:LazyLoadingEnabled="true"
                                 xmlns:p6="http://schemas.microsoft.com/ado/2009/02/edm/annotation">
                    <EntitySet Name="Invoices" EntityType="NorthwindModel.Invoice"/>
                </EntityContainer>
            </Schema>
        </edmx:DataServices>
    </edmx:Edmx>
    
        var oMockServer = new MockServer({
            rootUri: "https://services.odata.org/V2/Northwind/Northwind.svc/"
        });