2017-05-12 256 views
1

當我嘗試使用Spring的RestTemplate進行獲取請求時,它提供了400BAD請求。我可以用下面的標題成功地從JavaScript調用同一個網址:RestTemplate在獲取請求時給出400錯誤請求錯誤

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; 
} 
+0

信息太少。你的代碼在哪裏接受這個休息請求。重新檢查你所放的網址。這是一個真正的網址? – pvpkiran

+0

當然,您可以在瀏覽器上試用它。當通過HttpUrlConnection或IOUtils.read()直接調用時,它也會正確運行。這是接受請求的代碼。問題出在Springs RestTemplate的內部工作方式,我認爲它可能是標題第一,並且可以在問題中看到,但問題依然存在。沒有太多的信息可以提供,這段代碼也可以正常運行,並且從其他客戶端調用時,這個url響應正確。 – cuneytyvz

+0

@cuneytyvz你是否知道Rest模板對URL進行了編碼,除非你使用URI的特定構造方法? – Coder

回答

0

您的網址已被編碼。 Chrome等常用瀏覽器能夠正確理解和響應。但是,這與RestTemplate不一樣。

我不得不解碼你的URI here和解碼的URI是DESCRIBE <http://dbpedia.org/resource/Concept_learning>

檢查過瀏覽器控制檯,我才知道你在URL通過了兩項查詢字符串,它們是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方法已經得到它處理URI的編碼和查詢參數的UriComponentsBuilder實例。

綜上所述,您的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); 
    } 

爲所需的查詢參數已經在builder對象已經通過以上方法沒扔HTTP400

希望這會有所幫助,祝你好運!