我在使用restTemplate进行Spring Boot api调用时不断收到此403 Forbidden:“错误代码:1010”。有人可以帮我清除这个错误吗?

问题描述 投票:0回答:4

Country.java 该类用于收集和填充响应。

@NoArgsConstructor
@Getter
public class Country {
    private String name;

    private double iso_code;

    @Override
    public String toString() {
        return "Name: " + name + "\nIso Code: " + iso_code;
    }
}

CountryRestClient.java:我检查了 api 密钥以确保没有收到禁止错误,但它不起作用。

@Component
public class CountryRestClient {

    private static final String url = "https://vaccovid-coronavirus-vaccine-and-treatment-tracker.p.rapidapi.com/api/npm-covid-data/countries-name-ordered";


    private static final String apiKeyName = "X-RapidAPI-Key";

    private static final String apiKeyValue = "42f0727d22msh9d";

    private static final String hostName = "X-RapidAPI-Host";

    private static final String hostValue = "vaccovid-coronavirus-vaccine-and-treatment-tracker.p.rapidapi.com";

    RestTemplate restTemplate;

    public CountryRestClient(RestTemplateBuilder restTemplateBuilder) {

        restTemplate = restTemplateBuilder.build();
    }


    public Country getCountry() {
        Country country = null;
        try {
            URI uri = new URI(url);

            HttpHeaders headers = new HttpHeaders();
            headers.set(apiKeyName, apiKeyValue);
            headers.set(hostName, hostValue);

            headers.setContentType(MediaType.APPLICATION_JSON);
            headers.setAccept(Collections.singletonList(MediaType.APPLICATION_JSON));

            HttpEntity<String> request = new HttpEntity<>(headers);

            ResponseEntity<Country[]> countryEntity = restTemplate.exchange(uri, HttpMethod.GET, request, Country[].class);

            country = countryEntity.getBody()[0];

            System.out.println("Name:" + country.getName() + "\nISO: " + country.getIso_code());

        } catch (URISyntaxException e) {
            e.printStackTrace();
        }
        return country;
    }
}

CountryController.java:我还制作了这个控制器来公开端点。

@RestController
public class CountryController {

    @GetMapping("/countries")
    public Country getCountries() {
        return new CountryRestClient(new RestTemplateBuilder()).getCountry();
    }

}

我得到的错误是: 我得到的错误是: 我得到的错误是: 我得到的错误是: 我得到的错误是: 我得到的错误是: 我得到的错误是: 我得到的错误是:

**Whitelabel Error Page**
This application has no explicit mapping for /error, so you are seeing this as a fallback.

Thu Sep 08 23:10:25 EDT 2022
There was an unexpected error (type=Internal Server Error, status=500).
403 Forbidden: "error code: 1010"
org.springframework.web.client.HttpClientErrorException$Forbidden: 403 Forbidden: "error code: 1010"
    at org.springframework.web.client.HttpClientErrorException.create(HttpClientErrorException.java:109)
    at org.springframework.web.client.DefaultResponseErrorHandler.handleError(DefaultResponseErrorHandler.java:168)
    at org.springframework.web.client.DefaultResponseErrorHandler.handleError(DefaultResponseErrorHandler.java:122)
    at org.springframework.web.client.ResponseErrorHandler.handleError(ResponseErrorHandler.java:63)
    at org.springframework.web.client.RestTemplate.handleResponse(RestTemplate.java:819)
    at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:777)
    at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:751)
    at org.springframework.web.client.RestTemplate.exchange(RestTemplate.java:621)
    at com.thymeleafdemo.client.CountryRestClient.getCountries(CountryRestClient.java:49)
    at com.thymeleafdemo.controller.CountryController.getCountries(CountryController.java:15)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:205)
    at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:150)
    at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:117)
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:895)
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:808)
    at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1070)
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:963)
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006)
    at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:898)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:655)
    at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:764)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:227)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
    at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
    at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
    at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:197)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:541)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:135)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:360)
    at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:399)
    at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65)
    at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:890)
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1789)
    at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
    at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191)
    at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659)
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    at java.lang.Thread.run(Thread.java:750)
spring spring-boot resttemplate
4个回答
0
投票

我遇到了类似的问题,我试图通过公开的 API 调用另一个系统。它在 SOAP UI 和邮递员上运行,但无法从实际服务器调用。我必须添加这些额外的标头才能使其正常工作:

接受:

*/*

用户代理:PostmanRuntime/7.28.4

连接:保持活动状态

缓存控制:无缓存

如果您找到任何其他方法来修复它,请告诉我。据我所知,问题是由于缺少一些标头而出现的


0
投票

如果您在应用程序中使用 cloudflare 证书,请禁用 Cloud Orange 并进行测试。不用担心 API 端证书。相信一定会解决的。


0
投票

我遇到了同样的事情,我尝试了@Vivek_bats建议的解决方案,它对我有用,但我们不需要包含所有标头,我们只需要用户代理标头和值可以是这样的应用程序

headers.set("User-Agent", "Application");

参考这篇帖子


0
投票

我在 spring-security 版本 2.2.13.RELEASE 上遇到了这个问题。这也适用于 spring-boot 版本 3 及更低版本。

我的 keycloak 服务器通过 Cloud Flare 橙色云进行代理,当 spring-security 尝试获取 jwk-set-uri 时,它抛出“HttpStatus 403,错误 1010,无法获取 jwk-set-uri”

我通过禁用 浏览器完整性检查解决了此错误。

© www.soinside.com 2019 - 2024. All rights reserved.