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模式。
答案 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);