2013-03-22 12 views
17

Chcę odzyskać dane JSON z następujących opcji: https://git.eclipse.org/r/#/c/11376/Jak wysłać żądanie danych do REST API w java?

URL żądania: https://git.eclipse.org/r/gerrit/rpc/ChangeDetailService

Zapytanie metoda: POST

Żądanie Nagłówki:

Accept:application/json 

Content-Type:application/json; charset=UTF-8 

Zapytanie ładunku:

{"jsonrpc":"2.0","method":"changeDetail","params":[{"id":11376}],"id":1} 

Próbowałem już this answer, ale otrzymuję 400 BAD REQUEST.

Czy ktoś może mi pomóc rozwiązać ten problem?

Dzięki.

Odpowiedz

29

Poniższy kod działa dla mnie. Metoda

//escape the double quotes in json string 
String payload="{\"jsonrpc\":\"2.0\",\"method\":\"changeDetail\",\"params\":[{\"id\":11376}],\"id\":2}"; 
String requestUrl="https://git.eclipse.org/r/gerrit/rpc/ChangeDetailService"; 
sendPostRequest(requestUrl, payload); 

realizacja:

public static String sendPostRequest(String requestUrl, String payload) { 
    try { 
     URL url = new URL(requestUrl); 
     HttpURLConnection connection = (HttpURLConnection) url.openConnection(); 

     connection.setDoInput(true); 
     connection.setDoOutput(true); 
     connection.setRequestMethod("POST"); 
     connection.setRequestProperty("Accept", "application/json"); 
     connection.setRequestProperty("Content-Type", "application/json; charset=UTF-8"); 
     OutputStreamWriter writer = new OutputStreamWriter(connection.getOutputStream(), "UTF-8"); 
     writer.write(payload); 
     writer.close(); 
     BufferedReader br = new BufferedReader(new InputStreamReader(connection.getInputStream())); 
     StringBuffer jsonString = new StringBuffer(); 
     String line; 
     while ((line = br.readLine()) != null) { 
       jsonString.append(line); 
     } 
     br.close(); 
     connection.disconnect(); 
    } catch (Exception e) { 
      throw new RuntimeException(e.getMessage()); 
    } 
    return jsonString.toString(); 
} 
+2

BufferedWriter jest trochę przesadą tutaj. Co więcej, będziesz mieć problemy, jeśli wysyłasz znaki UTF-8. Zamiast tego powinieneś użyć 'OutputStreamWriter writer = new OutputStreamWriter (os," UTF-8 ");'. –

+0

Ponieważ zawartość 'String' nie może być modyfikowana (tylko odwołanie może), łączenie ciągów w kółko stworzy większe i większe obiekty. Zamiast tego należy użyć 'StringBuffer'. https://github.com/Hypertopic/Porphyry/blob/master/src/org/hypertopic/RESTDatabase.java#L221 –

+0

Co się stanie, jeśli adres URL zawiera format XM? Jak byś to zrobił? – Jesse

0

Próbowałem z klientem odpoczynku.

Nagłówki:

  • POST/r/Gerrit/RPC/ChangeDetailService HTTP/1.1
  • Host: git.eclipse.org
  • User-Agent: Mozilla/5.0 (Windows NT 5.1; rv : 18.0) Gecko/20100101 Firefox/18.0
  • Accept: application/json
  • Accept-Language: null
  • Accept-Encoding: gzip, deflate, SDCH
  • accept-charset: ISO-8859-1, utf-8; q = 0,7, *; q = 0,3
  • Content-Type: application/json; charset = UTF-8
  • Content-Length: 73
  • Connection: keep-alive

to działa dobrze. Odzyskuję 200 OK z dobrym ciałem.

Dlaczego w swoim żądaniu ustawiono kod statusu? i wiele deklaracji "Zaakceptuj" za pomocą Accept: application/json, application/json, application/jsonrequest. wystarczy oświadczenie.

Powiązane problemy