2012-05-08 19 views
49

मैं जावा में HttpURLConnection ऑब्जेक्ट के साथ मूल http auth कर रहा हूं।HttpURLConnection ऑब्जेक्ट से पार्स JSON

 URL urlUse = new URL(url); 
     HttpURLConnection conn = null; 
     conn = (HttpURLConnection) urlUse.openConnection(); 
     conn.setRequestMethod("GET"); 
     conn.setRequestProperty("Content-length", "0"); 
     conn.setUseCaches(false); 
     conn.setAllowUserInteraction(false); 
     conn.setConnectTimeout(timeout); 
     conn.setReadTimeout(timeout); 
     conn.connect(); 

     if(conn.getResponseCode()==201 || conn.getResponseCode()==200) 
     { 
      success = true; 
     } 

मैं एक JSON ऑब्जेक्ट, या एक मान्य JSON वस्तु, या सरल सादे पाठ के साथ HTML मान्य JSON है कि के प्रारूप में स्ट्रिंग डेटा की उम्मीद कर रहा हूँ। प्रतिक्रिया देने के बाद HttpURLConnection से मैं इसे कैसे एक्सेस करूं?

+2

ध्यान दें कि सभी 2xx HTTP स्थिति कोड सफलता दर्शाते हैं। – Fred

उत्तर

95

आप विधि नीचे का उपयोग कर कच्चे डेटा प्राप्त कर सकते हैं। बीटीडब्ल्यू, यह पैटर्न जावा 6 के लिए है। यदि आप जावा 7 या नए का उपयोग कर रहे हैं, तो कृपया try-with-resources pattern पर विचार करें।

public String getJSON(String url, int timeout) { 
    HttpURLConnection c = null; 
    try { 
     URL u = new URL(url); 
     c = (HttpURLConnection) u.openConnection(); 
     c.setRequestMethod("GET"); 
     c.setRequestProperty("Content-length", "0"); 
     c.setUseCaches(false); 
     c.setAllowUserInteraction(false); 
     c.setConnectTimeout(timeout); 
     c.setReadTimeout(timeout); 
     c.connect(); 
     int status = c.getResponseCode(); 

     switch (status) { 
      case 200: 
      case 201: 
       BufferedReader br = new BufferedReader(new InputStreamReader(c.getInputStream())); 
       StringBuilder sb = new StringBuilder(); 
       String line; 
       while ((line = br.readLine()) != null) { 
        sb.append(line+"\n"); 
       } 
       br.close(); 
       return sb.toString(); 
     } 

    } catch (MalformedURLException ex) { 
     Logger.getLogger(getClass().getName()).log(Level.SEVERE, null, ex); 
    } catch (IOException ex) { 
     Logger.getLogger(getClass().getName()).log(Level.SEVERE, null, ex); 
    } finally { 
     if (c != null) { 
      try { 
       c.disconnect(); 
      } catch (Exception ex) { 
      Logger.getLogger(getClass().getName()).log(Level.SEVERE, null, ex); 
      } 
     } 
    } 
    return null; 
} 

और फिर आप Google Gson के साथ वापस आ स्ट्रिंग का उपयोग कर सकते हैं JSON मैप करने के लिए इस तरह, निर्दिष्ट वर्ग के आपत्ति उठाने:

String data = getJSON("http://localhost/authmanager.php"); 
AuthMsg msg = new Gson().fromJson(data, AuthMsg.class); 
System.out.println(msg); 

AuthMsg वर्ग का एक नमूना है:

public class AuthMsg { 
    private int code; 
    private String message; 

    public int getCode() { 
     return code; 
    } 
    public void setCode(int code) { 
     this.code = code; 
    } 

    public String getMessage() { 
     return message; 
    } 
    public void setMessage(String message) { 
     this.message = message; 
    } 
} 

JSON http://localhost/authmanager.php द्वारा लौटाया जाना चाहिए:

{"code":1,"message":"Logged in"} 

सादर

+1

क्या मैं आपसे पूछ सकता हूं, जहां आप कनेक्शन 'सी' बंद करते हैं? –

+0

मूल रूप से मैंने इसे जावा 7 तरीके से संसाधनों के साथ लिखा था, लेकिन किसी ने जावा 6 रखने का फैसला किया, इसलिए कनेक्शन बंद होने पर अंततः अनदेखा कर दिया गया। लेकिन हाँ, कनेक्शन बंद होना चाहिए। मैं इसे बाद में संपादित करूंगा, धन्यवाद। – kbec

+0

@kbec मैं अभी भी नहीं देखता कि आप कनेक्शन कहां बंद करते हैं। क्या आप इसे अपने उत्तर में जोड़ सकते हैं? – confile

9

निम्नलिखित समारोह (मेरा नहीं, यकीन नहीं है, जहां मैं इसे बहुत पहले पाया जाता है) को परिभाषित करें:

private static String convertStreamToString(InputStream is) { 

BufferedReader reader = new BufferedReader(new InputStreamReader(is)); 
StringBuilder sb = new StringBuilder(); 

String line = null; 
try { 
    while ((line = reader.readLine()) != null) { 
     sb.append(line + "\n"); 
    } 
} catch (IOException e) { 
    e.printStackTrace(); 
} finally { 
    try { 
     is.close(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 
return sb.toString(); 

}

तब:

String jsonReply; 
if(conn.getResponseCode()==201 || conn.getResponseCode()==200) 
    { 
     success = true; 
     InputStream response = conn.getInputStream(); 
     jsonReply = convertStreamToString(response); 

     // Do JSON handling here.... 
    } 
+0

'कन्वर्टस्ट्रीम टॉस्ट्रिंग' कॉलिंग कोड को सूचित नहीं करता है कि कनेक्शन मिड-ट्रांसफर खो जाने पर स्ट्रिंग अपूर्ण है। आम तौर पर, अपवादों को बुलबुला करने देना बेहतर होता है। –

2

JSON स्ट्रिंग बस हो जाएगा आपके द्वारा बुलाए गए यूआरएल से प्रतिक्रिया प्राप्त करने का शरीर। तो यह कोड

... 
BufferedReader in = new BufferedReader(new InputStreamReader(
          conn.getInputStream())); 
String inputLine; 
while ((inputLine = in.readLine()) != null) 
    System.out.println(inputLine); 
in.close(); 

है कि आप को देखने के लिए JSON कंसोल को लौट जा रहा है की अनुमति देगा जोड़ें। तब आपके पास एकमात्र गायब टुकड़ा उस डेटा को पढ़ने और जावा प्रतिनिधित्व प्रदान करने के लिए JSON लाइब्रेरी का उपयोग कर रहा है।

Here's an example using JSON-LIB

+0

यदि इनपुट पढ़ने में कोई अपवाद है तो इनपुट बफर बंद नहीं होता है। –

2

इसके अलावा, यदि आप http त्रुटि (400-5 ** कोड), आप नीचे दिए गए कोड का उपयोग कर सकते की स्थिति में अपने वस्तु पार्स करने के लिए चाहते हैं: (सिर्फ 'getErrorStream' के साथ 'getInputStream' की जगह ले :

BufferedReader rd = new BufferedReader(
      new InputStreamReader(conn.getErrorStream())); 
    StringBuilder sb = new StringBuilder(); 
    String line; 
    while ((line = rd.readLine()) != null) { 
     sb.append(line); 
    } 
    rd.close(); 
    return sb.toString(); 
1

यह फ़ंक्शन यूटीएल से डेटा को HttpResponse ऑब्जेक्ट के रूप में प्राप्त किया जाएगा।

public HttpResponse getRespose(String url, String your_auth_code){ 
HttpClient client = new DefaultHttpClient(); 
HttpPost postForGetMethod = new HttpPost(url); 
postForGetMethod.addHeader("Content-type", "Application/JSON"); 
postForGetMethod.addHeader("Authorization", your_auth_code); 
return client.execute(postForGetMethod); 
} 

समारोह से ऊपर यहाँ कहा जाता है और हम json बयान हम json हमें प्राप्त हुआ है से बाहर सरल POJO बनाने की कोशिश निम्नलिखित में अपाचे पुस्तकालय Class.And उपयोग करने का एक स्ट्रिंग प्रपत्र प्राप्त करते हैं।

String jsonString  =  
EntityUtils.toString(getResponse("http://echo.jsontest.com/title/ipsum/content/ blah","Your_auth_if_you_need_one").getEntity(), "UTF-8"); 
final GsonBuilder gsonBuilder = new GsonBuilder(); 
gsonBuilder.registerTypeAdapter(JsonJavaModel .class, new CustomJsonDeserialiser()); 
final Gson gson = gsonBuilder.create(); 
JsonElement json = new JsonParser().parse(jsonString); 
JsonJavaModel pojoModel = gson.fromJson(
        jsonElementForJavaObject, JsonJavaModel.class); 

यह इनकमिंग जेसन के लिए एक साधारण जावा मॉडल क्लास है। सार्वजनिक वर्ग जेसनजवामोडेल { स्ट्रिंग सामग्री; स्ट्रिंग शीर्षक; } यह एक कस्टम deserialiser है:

public class CustomJsonDeserialiserimplements JsonDeserializer<JsonJavaModel>   { 

@Override 
public JsonJavaModel deserialize(JsonElement json, Type type, 
           JsonDeserializationContext arg2) throws JsonParseException { 
    final JsonJavaModel jsonJavaModel= new JsonJavaModel(); 
    JsonObject object = json.getAsJsonObject(); 

    try { 
    jsonJavaModel.content = object.get("Content").getAsString() 
    jsonJavaModel.title = object.get("Title").getAsString() 

    } catch (Exception e) { 

     e.printStackTrace(); 
    } 
    return jsonJavaModel; 
} 

Gson पुस्तकालय और org.apache.http.util.EntityUtils शामिल करें;

संबंधित मुद्दे