使用 http-proxy 代理 SAP UI5 应用发起的 HTTP 请求
  ehrZuhofWJiC 2024年08月09日 53 0

源代码如下:使用方法 createProxyServer 创建一个代理服务器, 监听在端口 8082 上,把请求发送给 localhost:9000 上监听的服务器。

后者仅仅返回一个 request successfully proxied 的消息给请求方。

var http = require('http'),
    httpProxy = require('http-proxy');

httpProxy.createProxyServer({target).listen(8082); 

http.createServer(function (req, res) {
  res.writeHead(200, { 'Content-Type': 'text/plain' });
  res.write('request successfully proxied!' + '\n' + JSON.stringify(req.headers, true, 2));
  res.end();
}).listen(9000);

遇到错误消息:

Access to XMLHttpRequest at language=EN' from originResponse to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource.

解决方案

在 HTTP response 头部字段增添一条字段:"Access-Control-Allow-Origin": "*"

#yyds干货盘点# 使用 http-proxy 代理 SAP UI5 应用发起的 HTTP 请求

重启 proxy 服务器之后,错误消息变成了:

Access to XMLHttpRequest at language=EN' from origin  Request header field maxdataserviceversion is not allowed by Access-Control-Allow-Headers in preflight response.

#yyds干货盘点# 使用 http-proxy 代理 SAP UI5 应用发起的 HTTP 请求

解决办法是,在 response 里添加如下字段:

res.writeHead(200, { 'Content-Type': 'text/plain',
                        "Access-Control-Allow-Origin": "*",
                        "Access-Control-Allow-Headers": "*" });

修改之后问题消失: #yyds干货盘点# 使用 http-proxy 代理 SAP UI5 应用发起的 HTTP 请求

SAP UI5 应用发起的 metadata 数据请求,被 proxy 服务器成功拦截并返回: #yyds干货盘点# 使用 http-proxy 代理 SAP UI5 应用发起的 HTTP 请求

Error [ERR_TLS_CERT_ALTNAME_INVALID]: Hostname/IP does not match certificate's altnames: Host: localhost. is not in the cert's altnames: DNS:., DNS:.scm., DNS:., DNS:.scm., DNS:.sso. at Object.checkServerIdentity (tls.js:287:12) at TLSSocket.onConnectSecure (_tls_wrap.js:1511:27) at TLSSocket.emit (events.js:315:20) at TLSSocket._finishInit (_tls_wrap.js:936:8) at TLSWrap.ssl.onhandshakedone (_tls_wrap.js:710:12) { reason: "Host: localhost. is not in the cert's altnames: DNS:., DNS:.scm., DNS:., DNS:.scm., DNS:.sso.", host: 'localhost',

这个错误和这个 StackOverflow 讨论相关。

代码也类似:

var express = require('express');
var app = express();
var httpProxy = require('http-proxy');
var apiProxy = httpProxy.createProxyServer();
var serverOne 

app.all('/idena', function (req, res) {
  apiProxy.web(req, res, {target: serverOne});
});

app.listen(3000, function () {
  console.log('Working!');
});

当请求发送给 idena 时,代理服务器试图发送往服务器

源服务器是 HTTP,而目的服务器是 HTTPS.

解决这个错误的办法:在 proxy option 里,指定下列这个选项:

changeOrigin: true

#yyds干货盘点# 使用 http-proxy 代理 SAP UI5 应用发起的 HTTP 请求

重新 proxy 服务器之后,问题消失:ERR_TLS_CERT_ALTNAME_INVALID 错误被修复了。 #yyds干货盘点# 使用 http-proxy 代理 SAP UI5 应用发起的 HTTP 请求

400 bad request:

#yyds干货盘点# 使用 http-proxy 代理 SAP UI5 应用发起的 HTTP 请求

会遇到如下错误:

#yyds干货盘点# 使用 http-proxy 代理 SAP UI5 应用发起的 HTTP 请求

【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2024年08月09日 0

暂无评论

推荐阅读
  ehrZuhofWJiC   2024年08月02日   68   0   0 服务器
  ehrZuhofWJiC   2024年08月09日   49   0   0 linux服务器
  ehrZuhofWJiC   2024年08月09日   56   0   0 linux服务器
ehrZuhofWJiC