消耗休息与curl一起使用但在我使用RestTemplate时不起作用

时间:2017-09-27 06:34:26

标签: spring rest

RestTemplate存在问题,我想使用https://swapi.co/api/

当我使用Curl时它起作用:

curl -i -H "Accept: application/json" -H "Content-Type: application/json" -X GET

但是当我尝试使用RestTemplate时,它无效。

    RestTemplate restTemplate = new RestTemplate();
    HttpHeaders headers = new HttpHeaders();
    headers.setAccept(Collections.singletonList(MediaType.APPLICATION_JSON));
    headers.setContentType(MediaType.APPLICATION_JSON);
    HttpEntity<?> entity = new HttpEntity<>(headers);


    HttpEntity<String> response = restTemplate.exchange("http://swapi.co/api/", HttpMethod.GET, entity, String.class);

    Root root = new Gson().fromJson(response.getBody(), Root.class);
    System.out.println(root);

如您所见,我在curl命令中设置了Accept和ContentType。我有什么问题,我收到403禁止状态? 我使用弹簧安全弹簧启动,但我禁用了csrf模式。

3 个答案:

答案 0 :(得分:1)

检查响应显示请求通过Cloudflare,并且响应包含以下错误:

  

此网站的所有者(swapi.co)已根据您的浏览器签名禁止访问(3a4c8846af5169b2-ua21)。

因此,您可以作弊并添加可接受的User-Agent标头。例如:

headers.add("User-Agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.12; rv:55.0) Gecko/20100101 Firefox/55.0");

您应该联系swapi的所有者/维护者/开发者,在文档中添加关于该限制的部分,因为它远非明显,并且应该明确记录。

答案 1 :(得分:0)

只需使用restTemplate.getForObject("http://swapi.co/api/", String.class);(返回一个字符串)。 它更加直接和不言自明。

您获得的403必须是与标题相关的内容,很可能是headers.setAccept(Collections.singletonList(MediaType.APPLICATION_JSON))

的行

答案 2 :(得分:0)

检查网址https://swapi.co/api/,但上面的代码指向HTTP。

HttpEntity<String> response = restTemplate.exchange("https://swapi.co/api/", HttpMethod.GET, entity, String.class);