- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试从“https://swapi.co/api/people/?format=json ”获取数据并使用 RestTemplate.getForObject() 方法将其放入 POJO 中。我按照以下教程使用 RESTful Web 服务,并将其改编为我自己的项目:https://spring.io/guides/gs/consuming-rest/ .
在按照教程进行操作后,我以某种方式使代码可以工作..有一次..我从教程中复制了确切的代码,并更改了源 URL 和对象以适应数据。但是当我尝试创建自己的 Maven 项目时,包含所有需要的依赖项,我收到 403 禁止异常。
我的代码:
@RestController
public class CharacterListController {
@RequestMapping("/")
public SWData swData() {
RestTemplate restTemplate = new RestTemplate();
SWData swData = restTemplate.getForObject("https://swapi.co/api/people/?format=json", SWData.class);
return swData;
}
@JsonIgnoreProperties(ignoreUnknown = true)
public class SWData {
String next;
String results;
public String getNext() {
return next;
}
public void setNext(String next) {
this.next = next;
}
public String getResults() {
return results;
}
public void setResults(String results) {
this.results = results;
}
@Override
public String toString() {
return "SWData{" +
"next='" + next + '\'' +
", results='" + results + '\'' +
'}';
}
}
堆栈跟踪:
2019-05-28 15:00:28.800 ERROR 3643 --- [nio-8080-exec-1] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.springframework.web.client.HttpClientErrorException$Forbidden: 403 Forbidden] with root cause
org.springframework.web.client.HttpClientErrorException$Forbidden: 403 Forbidden
at org.springframework.web.client.HttpClientErrorException.create(HttpClientErrorException.java:83) ~[spring-web-5.1.6.RELEASE.jar:5.1.6.RELEASE]
at org.springframework.web.client.DefaultResponseErrorHandler.handleError(DefaultResponseErrorHandler.java:122) ~[spring-web-5.1.6.RELEASE.jar:5.1.6.RELEASE]
at org.springframework.web.client.DefaultResponseErrorHandler.handleError(DefaultResponseErrorHandler.java:102) ~[spring-web-5.1.6.RELEASE.jar:5.1.6.RELEASE]
at org.springframework.web.client.ResponseErrorHandler.handleError(ResponseErrorHandler.java:63) ~[spring-web-5.1.6.RELEASE.jar:5.1.6.RELEASE]
at org.springframework.web.client.RestTemplate.handleResponse(RestTemplate.java:778) ~[spring-web-5.1.6.RELEASE.jar:5.1.6.RELEASE]
at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:736) ~[spring-web-5.1.6.RELEASE.jar:5.1.6.RELEASE]
at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:670) ~[spring-web-5.1.6.RELEASE.jar:5.1.6.RELEASE]
at org.springframework.web.client.RestTemplate.getForObject(RestTemplate.java:311) ~[spring-web-5.1.6.RELEASE.jar:5.1.6.RELEASE]
at io.github.BasPeter.SWAPI.rest.CharacterListController.swData(CharacterListController.java:16) ~[classes/:na]
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_211]
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_211]
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_211]
at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_211]
at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:189) ~[spring-web-5.1.6.RELEASE.jar:5.1.6.RELEASE]
at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:138) ~[spring-web-5.1.6.RELEASE.jar:5.1.6.RELEASE]
at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:102) ~[spring-webmvc-5.1.6.RELEASE.jar:5.1.6.RELEASE]
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:892) ~[spring-webmvc-5.1.6.RELEASE.jar:5.1.6.RELEASE]
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:797) ~[spring-webmvc-5.1.6.RELEASE.jar:5.1.6.RELEASE]
at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) ~[spring-webmvc-5.1.6.RELEASE.jar:5.1.6.RELEASE]
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1038) ~[spring-webmvc-5.1.6.RELEASE.jar:5.1.6.RELEASE]
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:942) ~[spring-webmvc-5.1.6.RELEASE.jar:5.1.6.RELEASE]
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1005) ~[spring-webmvc-5.1.6.RELEASE.jar:5.1.6.RELEASE]
at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:897) ~[spring-webmvc-5.1.6.RELEASE.jar:5.1.6.RELEASE]
at javax.servlet.http.HttpServlet.service(HttpServlet.java:634) ~[tomcat-embed-core-9.0.17.jar:9.0.17]
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:882) ~[spring-webmvc-5.1.6.RELEASE.jar:5.1.6.RELEASE]
at javax.servlet.http.HttpServlet.service(HttpServlet.java:741) ~[tomcat-embed-core-9.0.17.jar:9.0.17]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) ~[tomcat-embed-core-9.0.17.jar:9.0.17]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.17.jar:9.0.17]
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) ~[tomcat-embed-websocket-9.0.17.jar:9.0.17]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.17.jar:9.0.17]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.17.jar:9.0.17]
at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:99) ~[spring-web-5.1.6.RELEASE.jar:5.1.6.RELEASE]
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) ~[spring-web-5.1.6.RELEASE.jar:5.1.6.RELEASE]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.17.jar:9.0.17]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.17.jar:9.0.17]
at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:92) ~[spring-web-5.1.6.RELEASE.jar:5.1.6.RELEASE]
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) ~[spring-web-5.1.6.RELEASE.jar:5.1.6.RELEASE]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.17.jar:9.0.17]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.17.jar:9.0.17]
at org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:93) ~[spring-web-5.1.6.RELEASE.jar:5.1.6.RELEASE]
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) ~[spring-web-5.1.6.RELEASE.jar:5.1.6.RELEASE]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.17.jar:9.0.17]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.17.jar:9.0.17]
at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:200) ~[spring-web-5.1.6.RELEASE.jar:5.1.6.RELEASE]
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) ~[spring-web-5.1.6.RELEASE.jar:5.1.6.RELEASE]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.17.jar:9.0.17]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.17.jar:9.0.17]
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:200) ~[tomcat-embed-core-9.0.17.jar:9.0.17]
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96) [tomcat-embed-core-9.0.17.jar:9.0.17]
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:490) [tomcat-embed-core-9.0.17.jar:9.0.17]
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139) [tomcat-embed-core-9.0.17.jar:9.0.17]
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) [tomcat-embed-core-9.0.17.jar:9.0.17]
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74) [tomcat-embed-core-9.0.17.jar:9.0.17]
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343) [tomcat-embed-core-9.0.17.jar:9.0.17]
at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:408) [tomcat-embed-core-9.0.17.jar:9.0.17]
at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66) [tomcat-embed-core-9.0.17.jar:9.0.17]
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:834) [tomcat-embed-core-9.0.17.jar:9.0.17]
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1415) [tomcat-embed-core-9.0.17.jar:9.0.17]
at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) [tomcat-embed-core-9.0.17.jar:9.0.17]
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) [na:1.8.0_211]
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) [na:1.8.0_211]
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) [tomcat-embed-core-9.0.17.jar:9.0.17]
at java.lang.Thread.run(Thread.java:748) [na:1.8.0_211]
最令人沮丧的部分是代码在某些时候起作用。看起来使用教程提供的 gradle 东西可以工作,但使用我自己的 maven pom 时就不行了。
不知何故,我的请求被服务器拒绝(?),但我不知道为什么。我认为我的代码实际上与教程中的代码相同..
-BP
最佳答案
您还有一些额外的工作要做:)
1- 更改您的 SWData
类,以便它能够匹配您在输入目标网址<时收到的 JSON 文档/em> 在您的浏览器上。所以你的类应该如下所示:
@JsonIgnoreProperties(ignoreUnknown = true)
public class People {
private long count;
private String next;
private String previous;
private Infos results[];
// Constructors, getters and setters
// Extra: You can add the Lombock project to automatically generates, constructors // getters and setters
}
这是 Infos
类:
public class Infos {
private String name;
private long height;
private long mass;
private String hair_color;
private String skin_color;
private String eye_color;
private String birth_year;
private String gender;
private String homeworld;
private String films[];
private String species[];
private String vehicles[];
private String starships[];
private String created;
private String edited;
private String url;
// Constructors, getters and setters
}
2- 现在,如果您没有注意到,您正在尝试访问 https 网址。因此,您必须首先配置您的 RestTemplate
才能使用 SSL 证书进行请求。为此,您应该首先将 Apache HttpClient 依赖项添加到 pom.xml 中。使用最新版本例如:
<!-- https://mvnrepository.com/artifact/org.apache.httpcomponents/httpclient -->
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.8</version>
</dependency>
3- 一旦您的项目中拥有 Apache HttpClient 库,您现在就可以配置您的 RestTemplate
。这样做的方法如下:
// Imports
@RestController
public class CharacterListController {
@RequestMapping("/")
public SWData swData() {
CloseableHttpClient httpClient = HttpClients.custom()
.setSSLHostnameVerifier(new NoopHostnameVerifier())
.build();
HttpComponentsClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory();
requestFactory.setHttpClient(httpClient);
RestTemplate restTemplate = new RestTemplate(requestFactory);
SWData swData = restTemplate.getForObject("https://swapi.co/api/people/?format=json", SWData.class);
return swData;
}
}
4- 就这样,您现在只需运行 Spring-Boot 应用程序即可。希望这会有所帮助。让我随时了解最新情况:)
关于java - RestTemplate.getForObject 上的 HttpClientErrorException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56343789/
我的休息服务请求: Price[] prices = restTemplate.getForObject("https://sbk02.test.sparebank1.no/sbk/rest/poc1
自定义类结构 DocumentListVO 与 JSON 响应一对一映射,但是在使用 DocumentListVO dv1 =restTemplate.getForObject(uri,Documen
我正在编写一个简单的 REST 客户端,我的服务类有一个使用的方法 RestTemplate.getForObject() 我想练习测试,但我真的不知道我们是否应该测试类(class)。我也不知道如何
自定义类结构 DocumentListVO 与 JSON 响应一对一映射,但是在使用 DocumentListVO dv1 =restTemplate.getForObject(uri,Documen
2018 年 2 月 5 日更新(大约 4 年后)...我再次对此进行了测试,因为人们一直在支持我的问题/答案,而 Sotirios Delimanolis 是正确的,我不应该写我的答案中的代码来完成
我正在尝试从“https://swapi.co/api/people/?format=json ”获取数据并使用 RestTemplate.getForObject() 方法将其放入 POJO 中。我
为了编写干净智能的代码,我想知道我可以做些什么来改进我的实际代码: public JSONObject getCustomer(final String customerId) { if (c
我同时使用了 entity()、exchange()、getforObject(),一切似乎都运行良好。但不确定哪种方法适合不同的场景。请提供有关每种方法的更多信息,例如优缺点,在哪里使用哪里不使用。
我想使用restTemplate.getForObject方法,并且当所有请求的响应JSON键都相同时,我已经让它工作了。然后我使用了 @JsonProperty 注释,一切正常。 但现在我有一个响应
我是 Spring 的新手。我正在编写尝试使用 restTemplate.getForObject 传递 header 的代码 客户端: String userServiceUrl = "http:/
我会在 RestService 中为所有类型的 URI 和 VO 创建一个“通用” get() 。 但我不知道如何定义(并使用它)一个参数来创建通用 get(uri, className)。我试过这个
我想将以下 json 解析为 java 类: { "coord": { "lon": 5, "lat": 51 }, "weather": [ { "i
我在服务器端有一个方法可以提供有关在我的数据库中注册的特定名称的信息。我正在从我的 Android 应用程序访问它。 对Server的请求正常完成。我想要做的是根据我想要获得的名称将参数传递给服务器。
我在 Spring MVC Controller 中有一个简单的 REST 方法,如下所示,其签名为: @RequestMapping(value="/person/{personId}", meth
我正在尝试向 Api Rest 发出获取请求,但我总是收到 404,不过,如果尝试在浏览器或 postMan 中复制 queryUrl,它会完美运行。 restTemplate.getForObjec
我正在使用 Spring 的 RestTemplate 访问 Web 服务,并获取以下堆栈跟踪: Exception in thread "main" org.springframework.http
如何使用 jmockit 模拟 RestTemplate 类中的 getForObject 方法 - 我正在尝试这样做 - @Test public void test2DataClie
在我的浏览器中,以下 rest API url 正在运行,我可以看到 XML 结果。 "http://V7846EKZZJ1OJAW486D66IS7GO24XKUZ@localhost:8090/p
我创建了以下简单测试来查询 iTunes: @Test fun loadArtist() { val restTemplate = RestTemplate() val builder
我已经使用了这个答案中的解决方案: Get list of JSON objects with Spring RestTemplate它工作得很好。它完全符合我的需要。 ProcessDefiniti
我是一名优秀的程序员,十分优秀!