2013-03-22 3 views
17

Ich möchte die JSON-Daten aus der folgenden abzurufen: https://git.eclipse.org/r/#/c/11376/Wie senden Sie Request Payload an REST-API in Java?

Anforderungs-URL: Payload

Accept:application/json 

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

Anfrage: https://git.eclipse.org/r/gerrit/rpc/ChangeDetailService

Anfrage Methode: POST

Anfrageheaders

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

Ich versuchte bereits this answer, aber ich bekomme 400 BAD REQUEST.

Kann mir jemand helfen, das herauszufinden?

Danke.

Antwort

29

Der folgende Code funktioniert für mich.

//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); 

Methode Umsetzung:

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 leicht übertrieben ist hier. Darüber hinaus werden Sie Probleme haben, wenn Sie UTF-8-Zeichen senden. Sie sollten stattdessen 'OutputStreamWriter writer = new OutputStreamWriter (os," UTF-8 ");' verwenden. –

+0

Da der Inhalt einer 'String' nicht geändert werden kann (nur die Referenz kann), werden beim wiederholten Verknüpfen von Strings immer größere Objekte erzeugt. Sie sollten stattdessen 'StringBuffer' verwenden. https://github.com/Hypertopic/Porphyry/blob/master/src/org/hypertopic/RESTDatabase.java#L221 –

+0

Was ist, wenn die URL ein xm-Format bietet? Wie würdest du das machen? – Jesse

0

Ich versuchte mit einem Rest-Client.

Headers:

  • 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-Zeichensatz: ISO-8859-1, utf-8; q = 0,7, *; q = 0,3
  • Inhaltstyp: application/json; charset = UTF-8
  • Content-Length: 73
  • Verbindung: Keep-Alive-

es funktioniert gut. Ich bekomme 200 OK mit einem guten Körper.

Warum setzen Sie in Ihrer Anfrage einen Statuscode? und mehrere Deklaration "Akzeptieren" mit Akzeptieren: application/json, application/json, application/jsonrequest. nur eine Aussage ist genug.