从 https rest api 调用 http rest api 错误 502

Posted

技术标签:

【中文标题】从 https rest api 调用 http rest api 错误 502【英文标题】:Calling http rest api from https rest api with error 502 【发布时间】:2019-12-27 02:27:52 【问题描述】:

我调用我的 https REST APi,它使用 Postman 在另一台服务器上调用 http api,它返回 502 bad gateway 错误。 https API 的身份验证在标头中设置,并且也接受:应用程序/json。所有其他不在远程服务器上调用 ohter http api 的 https rest api 都可以正常工作。

我已经使用 SpringBoot 创建了带有身份验证的 REST API。有 GET 和 POST 方法。它们都有像 https://...这样的 URL。在调用它们之前,用户必须获得一个安全令牌。这些 Rest api 可用作驻留在部署在 tomcat 中的 Server_1 上的 war 文件。从许多 API 中,我调用了作为 jar 文件驻留在另一个 Server_2 上的另一个 Rest 服务,其 URL 的 URL 类似于 http://...。当我调用驻留在 Server_1 上的 war 文件中的一个 https rest api 时,请求进入 Server_2。 Server_2 上的 Http rest api 使用 JSON 文件回答。我可以在 Server_2 的日志中看到它,而且我已经捕获了服务器之间的 http 流量。看起来 http rest api 接收到请求并将答案发回,但是来自 Server_1 的 https RestApi 拒绝了答案,因为它没有加密并给出错误的网关 502 错误。有什么办法可以解决这个错误?

//这就是我在服务器2上调用http rest api的方式。这段代码是服务器1上https rest api的一部分(tomcat中的war文件)

public ResponseEntity<String> function()

RestTemplate restTemplate = new RestTemplate();
String myUrl = "http://xxxxxx:8081";
ResponseEntity<String> response = restTemplate.getForEntity(myUrl + "/api/test/suspend/12", String.class);
return responce

【问题讨论】:

【参考方案1】:

您的代码中有一些小问题 最后一行(return 语句)需要以分号结尾,并且您写的是“responce”而不是“response”。

public ResponseEntity<String> function()

  RestTemplate restTemplate = new RestTemplate();
  String myUrl = "http://xxxxxx:8081";
  ResponseEntity<String> response = restTemplate.getForEntity(myUrl + "/api/test/suspend/12", String.class);
  return response;

您应该额外使用HTTP请求的响应内容并将其用作您实际HTTPS请求的内容,否则您将混合使用不起作用的请求。

【讨论】:

您好丹尼尔,感谢您的更正。我的问题是对调用 http rest api 的 https rest api 的调用不会返回任何内容,无论我可以看到 http rest api 返回值。你认为“内容”会有帮助吗?我将响应返回给控制器,它将 ResponseEntity 类型的响应直接返回给用户。所以我认为我确实将 http 海峡的内容返回给 https。但还是什么都没有。 当我检查了 http 的响应时 - 数据属于“分块数据”类型。难道是我等待json的情况,这就是输出标记为502错误的原因吗?那么它是否可以通过其他标题以某种方式修复? 对不起,自从我上次回复以来很长时间,我正在度假。我的猜测是您应该等待所有数据块,然后将它们解析为字符串,然后将答案与您的 HTTPS 请求一起发回。 这里的答案也可以帮助你,试一试:***.com/a/30960274/4763898【参考方案2】:

在postman中,在Authorization标签下,有Type listbox,请选择“No Auth”

【讨论】:

克里斯托弗,谢谢你的回答。如果我不在邮递员中使用授权,那么由于没有安全令牌,我调用 http rest api 的 https rest api 将不可用。

以上是关于从 https rest api 调用 http rest api 错误 502的主要内容,如果未能解决你的问题,请参考以下文章

调用 GCP App 引擎 REST API 时权限被拒绝

Azure Rest API 附加现有托管磁盘

如何从Windows服务调用REST API

在spring boot应用程序中从自己的rest api调用另一个rest api

如何在微服务中处理从 UI 到 API 的 REST 调用

调用Azure REST API时如何使用分页