2013-03-22 12 views
17

Voglio recuperare i dati JSON dal seguente: https://git.eclipse.org/r/#/c/11376/Come inviare il carico utile di richiesta all'API REST in java?

Richiesta URL: https://git.eclipse.org/r/gerrit/rpc/ChangeDetailService

Richiesta Metodo: POST

intestazioni di richiesta:

Accept:application/json 

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

Richiesta Carico utile:

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

Ho già provato this answer ma sto ricevendo 400 BAD REQUEST.

Qualcuno può aiutarmi a risolvere questo problema?

Grazie.

risposta

29

Il seguente codice funziona per me.

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

implementazione del metodo:

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 è leggermente eccessivo qui. Inoltre, si avranno problemi se si inviano caratteri UTF-8. Dovresti usare 'OutputStreamWriter writer = new OutputStreamWriter (os," UTF-8 ");' invece. –

+0

Poiché il contenuto di un 'String' non può essere modificato (solo il riferimento può), concatenando le stringhe ripetutamente si creeranno oggetti sempre più grandi. Dovresti invece usare 'StringBuffer'. https://github.com/Hypertopic/Porphyry/blob/master/src/org/hypertopic/RESTDatabase.java#L221 –

+0

Cosa succede se l'url fornisce un formato xm? come lo faresti? – Jesse

0

Ho provato con un client di riposo.

intestazioni:

  • POST/r/Gerrit/RPC/ChangeDetailService HTTP/1.1
  • Host: git.eclipse.org
  • User-Agent: Mozilla/5.0 (Windows NT 5.1; camper : 18,0) Gecko/Firefox 20.100.101/18,0
  • Accept: application/json
  • Accept-Language: null
  • Accept-Encoding: gzip, deflate, SDCH
  • 012.
  • 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

funziona benissimo. Ricevo 200 OK con un buon corpo.

Perché si imposta un codice di stato nella richiesta? e dichiarazione multipla "Accetta" con Accept: application/json, application/json, application/jsonrequest. solo una dichiarazione è sufficiente.