RestTemplate在获取请求上提供400错误请求错误

时间:2017-05-12 15:42:03

标签: spring rest http resttemplate dbpedia

当我尝试使用Spring的RestTemplate发出get请求时,它会提供400 BAD请求。我可以通过以下标题成功调用javascript中的相同网址:

enter image description here

但是下面的代码不起作用。可能是什么原因?

public Entity getEntityByUri(String uri) {
        String req = "http://live.dbpedia.org/sparql?query=DESCRIBE%20%3Chttp://dbpedia.org/resource/Concept_learning%3E&format=application%2Fjson-ld";
    HttpHeaders headers = new HttpHeaders();
    headers.setAccept(Arrays.asList(MediaType.ALL));

    HttpEntity<String> httpEntity = new HttpEntity<String>(headers);

    new RestTemplate().exchange(req, HttpMethod.GET, httpEntity, Map.class);

    Entity entity = new Entity();
    return entity;
}

2 个答案:

答案 0 :(得分:0)

您的网址已经过编码。 Chrome等热门浏览器能够正确理解和响应。但是,RestTemplate与<{1}}的情况不同。

我必须解码你的uri here,解码的uri是DESCRIBE <http://dbpedia.org/resource/Concept_learning>

检查浏览器控制台后,我知道您在网址中传递了两个查询字符串,它们分别是queryformat,分别为DESCRIBE <http://dbpedia.org/resource/Concept_learning>application/json-ld

我假设Entity类是json响应的pojo类。

从您的json响应中创建实体

public class Entity {

    private String value;

    private String type;

    // getters and setters omitted for brevity

}

最后在你的getEntityByUri方法中有UriComponentsBuilder的实例来处理uri编码和查询参数。

总而言之,您的getEntityByUri看起来如下。

public HttpEntity<Entity> getEntityByUri() {
        String req = "http://live.dbpedia.org/sparql";

        UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl(req)
                .queryParam("query",
                        "DESCRIBE <http://dbpedia.org/resource/Concept_learning>")
                .queryParam("format", "application/json-ld");
        HttpHeaders headers = new HttpHeaders();
        headers.setAccept(Arrays.asList(MediaType.ALL));
        HttpEntity<String> httpEntity = new HttpEntity<String>(headers);
        return new RestTemplate().exchange(builder.build().encode().toUri(), HttpMethod.GET, httpEntity, Entity.class);
    }

由于已在HTTP400对象中传递了所需的查询参数,因此上述方法无法抛出builder

希望这会有所帮助并祝你好运!

答案 1 :(得分:0)

任何人都遇到相同的错误,请确保您的网址已解码,这意味着网址中没有百分号(如果参数值中有空格)。

这对我有用

    try {
        requestURL = URLDecoder.decode("http://api.com?p=1&groups=3212&affected-since=2019-06-06T14%3A11%3A14.880&detail=full&after-id=43536", "UTF-8");
    } catch (UnsupportedEncodingException e) {
        e.printStackTrace();
    }