【问题标题】:Get request from browser works but using RestTemplate class I got 404 response for the same request从浏览器获取请求有效,但使用 RestTemplate 类我得到了相同请求的 404 响应
【发布时间】:2017-02-22 18:32:48
【问题描述】:

如果我从浏览器发送以下获取请求,我可以轻松获得预期的 JSON 响应:

http://www.bookandwalk.hu/api/AdminTransactionList?password=XXX&begindate=2016-04-30&enddate=2016-10-12&corpusid=HUBW

我尝试使用 SPRING BOOT 1.4 创建一个小型演示应用程序,以查看 Spring 中的 rest 调用如何工作。 所以我创建了一个代表我的域对象的 POJO,并通过以下方法调用请求域对象列表:

String startDate=new SimpleDateFormat("yyyy-MM-dd").format(start.getTime());
String endDate=new SimpleDateFormat("yyyy-MM-dd").format(end.getTime());
UriComponents uri=UriComponentsBuilder.newInstance().scheme("http").host("www.bookandwalk.hu").path("/api/AdminTransactionList").queryParam("password","xxx").queryParam("begindate",startDate).queryParam("enddate",endDate).queryParam("corpusid","HUBW").build().encode();

    LOG.log(Level.INFO,"{0} were called as a rest call",uri.toString());

    ResponseEntity<List<BandWTransaction>> transResponse =
            restTemplate.exchange(uri.toString(),
                        HttpMethod.GET, null, new ParameterizedTypeReference<List<BandWTransaction>>() {
                });

    List<BandWTransaction> transactions = transResponse.getBody();

我遇到了以下异常:

org.springframework.web.client.HttpClientErrorException: 404 Not Found

当我记录 uri.toString() 时,我将它复制到我的浏览器以仔细检查我的 uri 中是否有任何拼写错误,但它可以正常工作而没有任何故障。 有谁知道为什么相同的字符串在浏览器中有效,但在代码中无效?

【问题讨论】:

    标签: spring spring-boot


    【解决方案1】:

    看来你应该在这个 webapp 的请求中指定一个用户代理头。使用 HttpEntity 对象设置此标头。

    final HttpHeaders headers = new HttpHeaders();
    headers.set("User-Agent", "eltabo");
    
    final HttpEntity<String> entity = new HttpEntity<String>(headers);
    
    ResponseEntity<List<BandWTransaction>> transResponse =
            restTemplate.exchange(uri.toString(),
                    HttpMethod.GET, entity, 
                    new ParameterizedTypeReference<List<BandWTransaction>>() {});
    

    希望对你有帮助。

    【讨论】:

    • 你帮了我很多。实际上,您让我注意到了 httpheaders 的重要性。我还将接受标头设置为 MediaType.APPLICATION_JSON。
    • 根据您的问题,我写了一个小示例,如果您需要为每个请求添加相同的标头Setting headers on Spring RestTemplate request,它可能会很有用
    • 感谢 restTemplate 的额外支持材料。现在至少我可以连接到资源。也许这应该是一个新问题,但我仍然有一个问题。通过属性设置为 null 的域对象的 Spring Boot 结果列表注册的 Jackson HttpMessageConverter 进行自动消息转换。我的 POJO 包含与 JSON 中完全相同的属性名称,并且属性的类型与 JSON 数据一致。知道要检查什么吗?
    • @Roland 请将其作为一个新问题发布,添加您使用的 POJO、要映射的一段 JSON 数据以及您可以提供的任何相关信息(Jackson 的版本,...)
    猜你喜欢
    • 2018-04-02
    • 2016-07-14
    • 2019-12-20
    • 1970-01-01
    • 2023-04-08
    • 2017-09-20
    • 2020-01-01
    • 2020-11-23
    • 1970-01-01
    相关资源
    最近更新 更多