Richiesta POST invia json data java HttpUrlConnection

Ho sviluppato un codice java che converte il seguente cURL in codice java usando URL e HttpUrlConnection. il ricciolo è:

curl -i 'http://url.com' -X POST -H "Content-Type: application/json" -H "Accept: application/json" -d '{"auth": { "passwordCredentials": {"username": "adm", "password": "pwd"},"tenantName":"adm"}}' 

Ho scritto questo codice ma dà sempre una richiesta errata al codice HTTP 400. Non sono riuscito a trovare ciò che manca.

 String url="http://url.com"; URL object=new URL(url); HttpURLConnection con = (HttpURLConnection) object.openConnection(); con.setDoOutput(true); con.setDoInput(true); con.setRequestProperty("Content-Type", "application/json"); con.setRequestProperty("Accept", "application/json"); con.setRequestMethod("POST"); JSONObject cred = new JSONObject(); JSONObject auth = new JSONObject(); JSONObject parent = new JSONObject(); cred.put("username","adm"); cred.put("password", "pwd"); auth.put("tenantName", "adm"); auth.put("passwordCredentials", cred.toString()); parent.put("auth", auth.toString()); OutputStreamWriter wr = new OutputStreamWriter(con.getOutputStream()); wr.write(parent.toString()); wr.flush(); //display what returns the POST request StringBuilder sb = new StringBuilder(); int HttpResult = con.getResponseCode(); if (HttpResult == HttpURLConnection.HTTP_OK) { BufferedReader br = new BufferedReader( new InputStreamReader(con.getInputStream(), "utf-8")); String line = null; while ((line = br.readLine()) != null) { sb.append(line + "\n"); } br.close(); System.out.println("" + sb.toString()); } else { System.out.println(con.getResponseMessage()); } 

Il tuo JSON non è corretto. Invece di

 JSONObject cred = new JSONObject(); JSONObject auth=new JSONObject(); JSONObject parent=new JSONObject(); cred.put("username","adm"); cred.put("password", "pwd"); auth.put("tenantName", "adm"); auth.put("passwordCredentials", cred.toString()); // <-- toString() parent.put("auth", auth.toString()); // <-- toString() OutputStreamWriter wr= new OutputStreamWriter(con.getOutputStream()); wr.write(parent.toString()); 

Scrivi

 JSONObject cred = new JSONObject(); JSONObject auth=new JSONObject(); JSONObject parent=new JSONObject(); cred.put("username","adm"); cred.put("password", "pwd"); auth.put("tenantName", "adm"); auth.put("passwordCredentials", cred); parent.put("auth", auth); OutputStreamWriter wr= new OutputStreamWriter(con.getOutputStream()); wr.write(parent.toString()); 

Quindi, JSONObject.toString () dovrebbe essere chiamato una sola volta per l'object esterno.

Un'altra cosa (probabilmente non è il tuo problema, ma mi piacerebbe menzionarlo):

Per essere sicuri di non incorrere in problemi di codifica, devi specificare la codifica, se non è UTF-8 :

 con.setRequestProperty("Content-Type", "application/json; charset=UTF-8"); con.setRequestProperty("Accept", "application/json"); // ... OutputStream os = con.getOutputStream(); os.write(parent.toString().getBytes("UTF-8")); os.close(); 
 private JSONObject uploadToServer() throws IOException, JSONException { String query = "https://example.com"; String json = "{\"key\":1}"; URL url = new URL(query); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setConnectTimeout(5000); conn.setRequestProperty("Content-Type", "application/json; charset=UTF-8"); conn.setDoOutput(true); conn.setDoInput(true); conn.setRequestMethod("POST"); OutputStream os = conn.getOutputStream(); os.write(json.getBytes("UTF-8")); os.close(); // read the response InputStream in = new BufferedInputStream(conn.getInputStream()); String result = org.apache.commons.io.IOUtils.toString(in, "UTF-8"); JSONObject jsonObject = new JSONObject(result); in.close(); conn.disconnect(); return jsonObject; } 

È ansible utilizzare questo codice per connettersi e richiedere l’utilizzo di http e json

 try { URL url = new URL("https://www.googleapis.com/youtube/v3/playlistItems?part=snippet" + "&key=AIzaSyAhONZJpMCBqCfQjFUj21cR2klf6JWbVSo" + "&access_token=" + access_token); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setDoOutput(true); conn.setRequestMethod("POST"); conn.setRequestProperty("Content-Type", "application/json"); String input = "{ \"snippet\": {\"playlistId\": \"WL\",\"resourceId\": {\"videoId\": \""+videoId+"\",\"kind\": \"youtube#video\"},\"position\": 0}}"; OutputStream os = conn.getOutputStream(); os.write(input.getBytes()); os.flush(); if (conn.getResponseCode() != HttpURLConnection.HTTP_CREATED) { throw new RuntimeException("Failed : HTTP error code : " + conn.getResponseCode()); } BufferedReader br = new BufferedReader(new InputStreamReader( (conn.getInputStream()))); String output; System.out.println("Output from Server .... \n"); while ((output = br.readLine()) != null) { System.out.println(output); } conn.disconnect(); } catch (MalformsdURLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } 

la risposta corretta è buona, ma

 OutputStreamWriter wr= new OutputStreamWriter(con.getOutputStream()); wr.write(parent.toString()); 

non funziona per me , invece di usare :

 byte[] outputBytes = rootJsonObject.getBytes("UTF-8"); OutputStream os = con.getOutputStream(); os.write(outputBytes); 

Ho avuto un problema simile, stavo ottenendo 400, Bad Request solo con il PUT, dove la richiesta POST era perfetta.

Sotto il codice funzionava bene per POST ma stava dando BAD Request for PUT:

 conn.setRequestProperty("Content-Type", "application/json"); os.writeBytes(json); 

Dopo aver effettuato le modifiche in basso ha funzionato bene per entrambi POST e PUT

 conn.setRequestProperty("Content-Type", "application/json; charset=UTF-8"); os.write(json.getBytes("UTF-8"));