Java Spring引导RestTemplate exchange 400错误请求
我对Spring Boot RestTemplate exchange有问题 我有以下代码:Java Spring引导RestTemplate exchange 400错误请求,java,spring,rest,http,spring-boot,Java,Spring,Rest,Http,Spring Boot,我对Spring Boot RestTemplate exchange有问题 我有以下代码: @RequestMapping(path = "/add") public @ResponseBody String addFromTo () { String apikey = ""; String baseurl = "http://demowebshop.webshop8.dk/admin/WEBAPI/v2/orders?start=2018-10-05T20%3A49%3A41
@RequestMapping(path = "/add")
public @ResponseBody String addFromTo () {
String apikey = "";
String baseurl = "http://demowebshop.webshop8.dk/admin/WEBAPI/v2/orders?start=2018-10-05T20%3A49%3A41.745Z&end=2018-10-15T20%3A49%3A41.745Z&api_key=" + apikey;
RestTemplate restTemplate = new RestTemplate();
HttpHeaders headers = new HttpHeaders();
headers.setAccept(Collections.singletonList(MediaType.APPLICATION_JSON));
headers.setBasicAuth("", apikey);
HttpEntity<String> request = new HttpEntity<String>(" ", headers);
ResponseEntity<OrderResponse> response = restTemplate.exchange(baseurl, HttpMethod.GET, request, OrderResponse.class);
return "Some text.";
}
我曾尝试使用具有完全相同URL的Postman,并使用apikey添加了Basic Auth和“Accept:application/json”头,效果很好,但当我运行此代码时,会收到错误消息:
There was an unexpected error (type=Internal Server Error, status=500).
400 Bad Request
编辑:
指向程序引发的异常的Pastebin链接:
仅用于用户名和密码,不用于基本令牌。
如果您想使用基本令牌,请尝试使用诸如标头之类的内容。添加(“授权”、“基本”+apiKey)而不是标头。setBasicAuth(…)在curl请求中,您使用的是
apiKey
和encodedapikey
。而在Java代码中,则没有。接下来,您还将传递一个编码的URL作为要使用的URL。这将导致重新编码编码的URL。所以不要那样做。而是使用带有占位符的URL并为其提供值
@RequestMapping(path = "/add")
public @ResponseBody String addFromTo () {
String apikey = "";
String baseurl = "http://demowebshop.webshop8.dk/admin/WEBAPI/v2/orders?start={start}&end={end}&api_key={apikey}";
Map<String, Object> parameters = new HashMap<>();
parameters.put("start", "2018-10-05T20:49:41.745Z");
parameters.put("end", "2018-10-16T06:43:40.926Z");
parameters.put("apikey", apikey);
HttpHeaders headers = new HttpHeaders();
headers.setAccept(Collections.singletonList(MediaType.APPLICATION_JSON));
headers.setBasicAuth("", apikey);
ResponseEntity<OrderResponse> response = restTemplate.getForEntity(baseurl, OrderResponse.class, parameters);
return "Some text.";
}
当然,您也可以将其放入
@Bean
方法中,并将特定的restemplate
注入到您的类中 是否setBasicAuth
应该是''”
?不应该有用户名。如果您试图访问URL,它也可以在浏览器中工作,它要求用户名和密码,我将用户名留空,并使用apikey作为密码。似乎缺少一些东西。如果您看到代码字符串apikey=”"; 但是您在哪里设置这个字符串值呢..它总是作为''。apikey字段通常不会丢失,我只是没有将其包含在问题中。您没有发布相同的。。。参数被再次编码,导致%3A
被再次编码为其他内容。其次,您没有像使用CURL那样提供encodedapikey
。因此,您没有执行相同的操作,但期望得到相同的结果…答案很好,但是如果我使用getForEntity而不是exchange,那么如何包含标题?我建议使用RestTemplateBuilder
创建RestTemplate
(一次!),并在其中设置身份验证,而不是每次在方法中设置身份验证。这样你就不需要设置标题了。
@RequestMapping(path = "/add")
public @ResponseBody String addFromTo () {
String apikey = "";
String baseurl = "http://demowebshop.webshop8.dk/admin/WEBAPI/v2/orders?start={start}&end={end}&api_key={apikey}";
Map<String, Object> parameters = new HashMap<>();
parameters.put("start", "2018-10-05T20:49:41.745Z");
parameters.put("end", "2018-10-16T06:43:40.926Z");
parameters.put("apikey", apikey);
HttpHeaders headers = new HttpHeaders();
headers.setAccept(Collections.singletonList(MediaType.APPLICATION_JSON));
headers.setBasicAuth("", apikey);
ResponseEntity<OrderResponse> response = restTemplate.getForEntity(baseurl, OrderResponse.class, parameters);
return "Some text.";
}
public YourClassCOnstructor(RestTemplateBuilder builder) {
this.restTemplate = builder.basicAuthorization("", apikey).build();
}