POST-Anfrage senden json Daten java HttpUrlConnection

Ich habe einen Java-Code entwickelt, der das folgende cURL mittels URL und HttpUrlConnection in Java-Code konvertiert. die Locke ist:

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"}}' 

Ich habe diesen Code geschrieben, aber es gibt immer HTTP-Code 400 schlechte Anfrage. Ich konnte nicht finden, was fehlt.

 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()); } 

Dein JSON ist nicht korrekt. Anstatt von

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

schreiben

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

Daher sollte JSONObject.toString () nur einmal für das äußere Objekt aufgerufen werden.

Eine andere Sache (wahrscheinlich nicht dein Problem, aber ich möchte es erwähnen):

Um sicher zu sein, dass keine Kodierungsprobleme auftreten, sollten Sie die Kodierung angeben, wenn es nicht 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; } 

Sie können diesen Code für die Verbindung und die Anfrage mit http und json verwenden

 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 (MalformedURLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } 

Die richtige Antwort ist gut, aber

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

arbeite nicht für mich , statt dessen verwende :

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

Ich hatte ein ähnliches Problem, ich bekam 400, schlechte Anfrage nur mit der PUT, wo als POST-Anfrage völlig in Ordnung war.

Unten Code funktionierte gut für POST, aber gab BAD Anfrage für PUT:

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

Nachdem die Änderungen unten vorgenommen wurden, funktionierte das sowohl für POST als auch für PUT

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