当我尝试使用Spring的RestTemplate发出get请求时,它会提供400 BAD请求。我可以通过以下标题成功调用javascript中的相同网址:
但是下面的代码不起作用。可能是什么原因?
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;
}
答案 0 :(得分:0)
您的网址已经过编码。 Chrome等热门浏览器能够正确理解和响应。但是,RestTemplate
与<{1}}的情况不同。
我必须解码你的uri here,解码的uri是DESCRIBE <http://dbpedia.org/resource/Concept_learning>
检查浏览器控制台后,我知道您在网址中传递了两个查询字符串,它们分别是query
和format
,分别为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();
}