当前位置: 首页 > 知识库问答 >
问题:

使用Spring Boot获取外部API,在应用程序重启后返回400个错误请求

郑伟彦
2023-03-14

我使用Spring Boot作为我的应用程序的API网关,我有一个奇怪的问题——当我重新启动应用程序(有时甚至经常发生)并调用我的endpoint(例如:/API/all)时,它应该从外部API返回解析和格式化的数据,第一个外部API调用返回400个错误的请求状态。我不知道这是他们的后端还是我的后端有问题,但当我在postman中调用他们的endpoint时,它工作得很好。

我发现他们可能有一些。NET后端(通过搜索返回的错误消息),但我不确定这是否对您有帮助。

此外,我正在使用编译组:“com。hynnet,名称:“httpclient”,版本:“4.5.1”,用于获取外部API。

这是我的POST request builder方法

public static HttpRequest buildPostRequest(final String url, final String body) {
    return HttpRequest.newBuilder()
            .version(HttpClient.Version.HTTP_1_1)
            .uri(URI.create(url))
            .setHeader(CONTENT_TYPE, APPLICATION_JSON)
            .POST(HttpRequest.BodyPublishers.ofString(body))
            .build();
}

这是我的POST请求发件人方法

public HttpResponse<String> sendPostRequest(
        final LinkedHashMap<String, Object> bodyStructure,
        final String url)
        throws Exception {
    final String body = buildBody(bodyStructure);
    final HttpRequest request = buildPostRequest(url, body);

    return client.send(request, HttpResponse.BodyHandlers.ofString());
}

这是我的CacheService(它只是缓存来自外部API的响应,当它失败时,它会在一秒钟后再次尝试)。顺便说一句。这种方法工作得很好,在第二次调用时,它会返回200 OK响应。

@Override
@Cacheable(value = TRANSPORT_LOCATIONS, cacheManager = CACHE_MANAGER, key = ROOT_METHOD_NAME)
public HttpResponse<String> getTransportsLocations(
        final LinkedHashMap<String, Object> bodyStructure,
        final String url)
        throws Exception {
    HttpResponse<String> response = requestSender.sendPostRequest(bodyStructure, url);

    if (response.statusCode() != OK_STATUS) {
        LOG.error(GET_TRANSPORT_LOCATION_BAD_REQUEST_ERROR_MESSAGE);
        Thread.sleep(FALLBACK_TIMEOUT);
        response = requestSender.sendPostRequest(bodyStructure, url);
    }
    return response;
}

你知道问题出在哪里吗?非常感谢。

共有1个答案

糜鸿风
2023-03-14

我认为你们需要检查你们发送的参数的差异,看起来api端返回了错误的请求。

更重要的是,您可以尝试将repsonsebody保存在一个html文件中,这样更容易读取响应信息。

顺便说一句,我注意到第二个调用的标题是“access control allow origin:*”,

在Springboot中,您可以在控制器到CRO上使用@CrossOrigin

 类似资料:
  • 我正在使用Amadeus API explorer for flight search API测试该服务。然而,我似乎收到了400个错误的请求。 我尝试使用api资源管理器的默认参数https://test.api.amadeus.com/v2/shopping/flight-offers?originLocationCode=SYD

  • 我试图使用Gmail API将用户设置应用到Gmail帐户,但它不断返回错误400错误请求。 我可以看到错误代码在Gmail API控制台,它来自我的服务号,所以代码不可能是如此错误,但它让我发疯,只是不能找出什么是错误的。 如果有人能给我指出正确的方向,我会非常感激。

  • 我有这个代码,我用它从电子表格创建PDF,我修改了它,在另一个电子表格中使用,现在我得到这个错误。 异常:https://docs.google.com 返回代码 400 的请求失败。截断的服务器响应: 完整的错误似乎是: .goog-inline-block{position:relative;display:-moz-inline-box;display:inline-block}* html

  • 在我的API控制器类中有方法如下, 如下所示, 我从postman调用了API,并返回了它的请求。 我在Controller方法中放置了断点,但它没有命中。在我从方法参数breakpoin hit中删除了之后,没有返回。当我使用时,为什么它返回400?我如何从HTTP客户端调用这个控制器方法?。 我试过这个,它也会返回400个请求 我该怎么解决这个问题?请帮帮我。我删除了前面的问题,这才是我真正的

  • 问题内容: 这工作正常: 这将返回400 Bad Request(只是使用.ajax来支持错误处理的上述jQuery的重新格式)。 问题答案: 我认为您只需要再添加2个选项(和):

  • 我在Tomcat中部署了一个Java的Web应用程序。 如果我的URL是这样的,我会收到来自Tomcat 8的400个错误请求 编码为 但是如果我从 URL 中删除 a:b:ab,a:b:abc 和 renditionFilter=cmis:thumbnail,application/pdf,image/bmp,image/gif,image/jpeg,image/png,那么它就可以工作了,这个