要开发自定义 SAPUI5/Fiori 应用程序,我们需要使用来自另一台服务器的 RESTful Web 服务。为了避免 CORS(跨源)错误,我们在本地使用 eclipse,它通过“UI5 Simple Proxy Servlet”支持我们。
<!-- ============================================================== -->
<!-- UI5 proxy servlet -->
<!-- ============================================================== -->
<servlet>
<servlet-name>SimpleProxyServlet</servlet-name>
<servlet-class>com.sap.ui5.proxy.SimpleProxyServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>SimpleProxyServlet</servlet-name>
<url-pattern>/proxy/*</url-pattern>
</servlet-mapping>
如果我在 SAP 应用程序服务器上测试该应用程序,则它无法使用 URL 中的 proxy-servlet 进行以下调用:
var serviceUrl = 'proxy/<host>/<service>/rest/api/content/' + contentID + '?parameters';
$.ajax({
type: 'GET',
url : serviceUrl,
headers: {
'Authorization': "Basic " + btoa('USERNAME' + ":" + 'PWD') },
dataType: 'json',
indexValue: { param1:oView,
param2:oModel
},
crossDomain: true,
success: function(data,textStatus,ErrorHandler) {
alert("Success");
},
error: function(ErrorHandler,textStatus,errorThrown) {
alert("Error");
}
在没有代理的情况下运行它,使用 Chrome 和选项“--disable-web-security”,RESTcall 工作正常。
有没有办法在 SAP Netweaver 应用程序服务器上使用代理 servlet?
最佳答案
它不起作用的原因是它不应该起作用。在 the official documentation SAP 对此表示:
Be aware that due to security reasons the SimpleProxyServlet is restricted to local testing purposes only. It can only be used for local host scenarios (accessing Gateway services to avoid cross-domain issues) and will not work when deployed on an application server. For productive use, refer to a mature proxy servlet.
当然,您可以忽略这一点并继续执行。我不确定他们到底是如何阻止 servlet 成为您部署的应用程序的一部分,但我确信您可以通过一种或另一种方式让它工作:
- 如果包含它的 JAR 实际上并未包含在 WAR/EAR 中,那么您可以尝试将其强制包含在其中(例如更改 Maven 依赖项的范围或更改构建本身)。
- 最糟糕的情况是,AS 只是将 servlet 列入“黑名单”。在这种情况下,您始终可以围绕 SAP 的 servlet 构建一个小型“代理”servlet。
- 如果这也不起作用,那么复制粘贴可能是你的 friend 。无论如何,您都不会从 SAP 获得对此 servlet 的支持,因为文档明确告诉您不要在生产中使用它。
但我不会走这条路。在我看来,除了使用 SAP servlet 之外,您还有三个主要解决方案:
- 在您正在使用的 REST 服务上添加 CORS header 。这假设您有权访问它(情况可能并非如此)。如果确实可以做到,出于性能考虑,这应该是首选解决方案。
- 在嵌入模式下使用另一个“代理 servlet”实现来模仿您在本地使用的设置。你可以看看例如Netflix Zuul .
- 部署一个单独的应用程序,该应用程序的唯一作用是充当 AS 上所有应用程序的反向代理。好处是您可以更轻松地重用和管理此类设置(即同一个 Java 应用程序将代理多个 REST 服务并为多个 UI 应用程序提供服务)。同样,为了实现这一目标,我建议使用像 Zuul 这样的库。
关于javascript - sap 服务器上的代理 servlet web-inf/web.xml 以调用外部 REST,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49011622/