首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >关于RestTemplate

关于RestTemplate
EN

Stack Overflow用户
提问于 2017-05-31 08:15:04
回答 4查看 15.4K关注 0票数 0

我在下面的配置中链接了Spring和Go。尽管存在目标URI的服务,但我打算在一个可通信的环境中使用RestTemplate进行连接,但不知何故,它是一个404错误。

  • 客户端<-(1)->Spring-启动Rest <-(2)->Go Rest API<-(3)-->DB
  • Client<---------------------------------(2)-->Go Rest <-(3)->DB

首先,沟通是正常的。

Go Rest的Rest服务可以通过下面的cURL命令从终端获得。

代码语言:javascript
复制
$ curl http://localhost:18000/ping -X GET
% Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                             Dload  Upload   Total   Spent    Left  Speed
100   120  100   120    0     0    480      0 --:--:-- --:--:-- --:--:--   591
{"pong":"ok","meta":{"host":"622c72386c52","rid":"","StartTime":"2017-05-31T06:33:37.654710044Z","execute_time":0.0061}}

我希望前端有,并在内部使用RestTemplate访问上面的URL。它被编码如下。

代码语言:javascript
复制
@RequestMapping(value = "/ping/", method = RequestMethod.POST)
public final ResponseEntity<ResPongDto> ping(@RequestBody SalesSituationInquiries input) {

    String methodName = Thread.currentThread().getStackTrace()[1].getMethodName();
    this.logger.info("■■UT:[{}]disposalDate:{}   ", methodName,input.getDisposalDate());
    // ①To   Client Response:ResPongDto
    HttpHeaders headers = new HttpHeaders();
    headers.setContentType(MediaType.APPLICATION_JSON);

    // ②From Client Request:SalesSituationInquiries
    this.logger.info("■■UT:[{}] From: {} To: {}", methodName,TotalSalesUtil.getStrFromByTo(input.getDisposalDate().toString()),input.getDisposalDate().toString());
    this.logger.info("■■UT:[{}] URL: {}", methodName,DailyReportsUtil.API_GO_PING_URL);
    restTemplate.getMessageConverters().add(new MappingJackson2HttpMessageConverter());

    // ③To   Go Rest API Request:null
    // ④From Go Rest API Response:ResPongDto
    ResponseEntity<ResPongDto> resultGoMonth = restTemplate.exchange(
            TotalSalesUtil.createTotalSalesUrl(DailyReportsUtil.API_GO_PING_URL, "", "")
            , HttpMethod.GET
            , new HttpEntity<>(null)
            , ResPongDto.class);
    this.logger.info("■■UT:[{}] testRestTemplate.exchange(): ", methodName);

    result = new ResponseEntity<ResPongDto>(resultGoMonth.getBody(), headers, HttpStatus.CREATED);
    return result;
}

(2)通过(1)不幸的是,结果是404错误。

代码语言:javascript
复制
2017-05-31 15:35:43.190 [maekawa-PC-main]                   INFO  Exp:[id: tenant_id:] j.c.b.b.a.hogehogeApplication Started hogehogeApplication in 5.61 seconds (JVM running for 10.472)
2017-05-31 15:38:50.700 [maekawa-PC-http-nio-9999-exec-1]   WARN  Exp:[id: tenant_id:] j.c.b.b.a.i.YamlAuthenticationProcessingMockInterceptor YamlAuthenticationProcessingMockInterceptor:モック機能が動作しています。
2017-05-31 15:38:50.767 [maekawa-PC-http-nio-9999-exec-1]   INFO  Exp:[id: tenant_id:] j.c.b.b.m.r.a.TotalSalesStatusCommandService ■■UT:[ping]disposalDate:2017-04-03
2017-05-31 15:38:50.770 [maekawa-PC-http-nio-9999-exec-1]   INFO  Exp:[id: tenant_id:] j.c.b.b.m.r.a.TotalSalesStatusCommandService ■■UT:[ping] From: 2017-04-01 To: 2017-04-03
2017-05-31 15:38:50.770 [maekawa-PC-http-nio-9999-exec-1]   INFO  Exp:[id: tenant_id:] j.c.b.b.m.r.a.TotalSalesStatusCommandService ■■UT:[ping] URL: http://localhost:18000/ping
2017-05-31 15:38:50.868 [maekawa-PC-http-nio-9999-exec-1]   ACS   Exp:[id: tenant_id:] url:/api/v1/totalsalesstatus/ping/ status:200 elapsedNanoTime:146217390
2017-05-31 15:38:50.871 [maekawa-PC-http-nio-9999-exec-1]   ERROR  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: 404 Not Found] with root cause

org.springframework.web.client.HttpClientErrorException: 404 Not Found
    at org.springframework.web.client.DefaultResponseErrorHandler.handleError(DefaultResponseErrorHandler.java:91)
    at org.springframework.web.client.RestTemplate.handleResponse(RestTemplate.java:700)
    at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:653)
    at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:613)
    at org.springframework.web.client.RestTemplate.exchange(RestTemplate.java:531)
    at xx.xx.api.TotalSalesStatusCommandService.ping(TotalSalesStatusCommandService.java:90)
    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:133)
    at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:116)
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:827)
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:738)
    at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:85)
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:963)
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:897)
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:970)
    at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:872)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:648)
    at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:846)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:230)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:165)
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:192)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:165)
    at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:99)
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:192)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:165)
    at org.springframework.web.filter.HttpPutFormContentFilter.doFilterInternal(HttpPutFormContentFilter.java:105)
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:192)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:165)
    at org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:81)
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:192)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:165)
    at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:197)
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:192)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:165)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:198)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:474)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:140)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:349)
    at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:783)
    at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)
    at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:798)
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1434)
    at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    at java.lang.Thread.run(Thread.java:745)

注意:

(2)curl http://localhost:18000/ping -X GET

(1)curl http://localhost:9999/api/v1/totalsalesstatus/ping/ -X POST -H "Content-Type: application/json“-d '{"hoghoge":"1234","disposalDate":"2017-04-03"}‘

我不知道他们为什么不与cURL沟通,所以请帮助我。

EN

回答 4

Stack Overflow用户

发布于 2017-05-31 11:14:18

你试过使用getForEntity而不是exchange吗?

代码语言:javascript
复制
ResponseEntity<ResPongDto> resultGoMonth = restTemplate.getForEntity(
        TotalSalesUtil.createTotalSalesUrl(DailyReportsUtil.API_GO_PING_URL, "", "")
        , ResPongDto.class);

我猜你的问题是你没有设置正确的标题。您可以尝试将接受头添加到请求中。

代码语言:javascript
复制
final HttpHeaders httpHeaders = new HttpHeaders();
httpHeaders.setAccept(Arrays.asList(MediaType.APPLICATION_JSON));

HttpEntity entity = new HttpEntity(headers);
ResponseEntity<ResPongDto> resultGoMonth = restTemplate.exchange(
            TotalSalesUtil.createTotalSalesUrl(DailyReportsUtil.API_GO_PING_URL, "", ""),
            HttpMethod.GET,
            entity,
            ResPongDto.class);

此代码尚未测试。这只是一个例子。

顺便说一下,我不知道您是如何创建resttemplate对象的,但是不应该更新转换器。这应该只在初始化点进行,因为been模板一旦创建就不是线程安全的。

票数 1
EN

Stack Overflow用户

发布于 2017-05-31 10:01:14

试试下面的代码。这个耗用应用程序/ json作为主体,产生是json响应。

代码语言:javascript
复制
@RequestMapping(value = "/ping", method = RequestMethod.POST, produces = "application/json", consumes = "application/json")
public final ResponseEntity<ResPongDto> ping(@RequestBody SalesSituationInquiries input) {
    ..
}
票数 0
EN

Stack Overflow用户

发布于 2019-01-09 22:40:11

尝尝这个。我也犯了同样的错误。这个问题是由不正确的编码引起的。

代码语言:javascript
复制
public String getWeather(String cityName) {
    UriComponentsBuilder builder = UriComponentsBuilder.fromUriString(weatherDataURL)
                                                       .queryParam("q", cityName)
                                                       .queryParam("APPID", apiKey);
    return restTemplate.getForObject(builder.buildAndExpand().toUri(), String.class);
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44279252

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档