Java Spring引导RestTemplate exchange 400错误请求

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

我对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.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();
}