POST request json data java HttpUrlConnection भेजें


98

मैंने एक जावा कोड विकसित किया है जो URL और HttpUrlConnection का उपयोग करके निम्न cURL को जावा कोड में बदल देता है। कर्ल है:

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

मैंने यह कोड लिखा है, लेकिन यह हमेशा HTTP कोड 400 खराब अनुरोध देता है। मुझे पता नहीं है कि क्या गायब है।

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

4
जावा वाचालता के लिए अच्छा चित्रण।
युरिन

जवाबों:


163

आपका JSON सही नहीं है। के बजाय

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

लिखो

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

तो, JSONObject.toString () को केवल एक बार बाहरी वस्तु के लिए बुलाया जाना चाहिए।

एक और बात (शायद आपकी समस्या नहीं है, लेकिन मैं इसका उल्लेख करना चाहूंगा):

एन्कोडिंग समस्याओं में नहीं चलना सुनिश्चित करने के लिए, आपको एन्कोडिंग निर्दिष्ट करना चाहिए, यदि यह नहीं है 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();

7
मेरे मामले में अनुरोध करने के लिए संपत्ति की सामग्री-प्रकार महत्वपूर्ण था:con.setRequestProperty("Content-Type", "application/json; charset=UTF-8");
मोरे

मेरे लिए कुछ भी काम नहीं कर रहा है। मैं इनपुट भेज रहा हूं, लेकिन एपीआई की ओर से मुझे खाली मिल रहा है।
आदर्श सिंह

35
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;
    }

15

आप इस कोड का उपयोग http और 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 (MalformedURLException e) {

        e.printStackTrace();

      } catch (IOException e) {

        e.printStackTrace();

     }

6

सही उत्तर अच्छा है, लेकिन

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

मेरे लिए काम नहीं , इसके बजाय, उपयोग करें :

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

यह आपके लिए काम नहीं आया क्योंकि आप आउटपुटस्ट्रीमराइटर को बंद करना भूल गए
सुजल मंडल

2

मेरे पास एक समान मुद्दा था, मुझे 400, खराब अनुरोध केवल PUT के साथ मिल रहा था, जहां POST अनुरोध पूरी तरह से ठीक था।

नीचे दिए गए कोड ने POST के लिए ठीक काम किया लेकिन PUT के लिए BAD रिक्वेस्ट दे रहा था:

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

नीचे किए गए परिवर्तनों के बाद POST और PUT दोनों के लिए ठीक काम किया

conn.setRequestProperty("Content-Type", "application/json; charset=UTF-8");
os.write(json.getBytes("UTF-8"));
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.