2011-11-18 8 views
11

मेरा गैलेक्सी नेक्सस आज पहुंचा, और मैंने पहली चीजों में से एक को अपने ऐप को लोड करना था ताकि मैं इसे अपने दोस्तों को प्रदर्शित कर सकूं। इसकी कार्यक्षमता के भाग में Google रीडर से आरएसएस फ़ीड आयात करना शामिल है। हालांकि, इस कोशिश करने पर, मुझे 405 विधि अनुमत त्रुटियों की अनुमति नहीं मिली थी।एंड्रॉइड 4.0 आईसीएस बदलते हुए HttpURLConnection POST अनुरोधों में अनुरोध प्राप्त करें

यह समस्या आइस क्रीम सैंडविच-विशिष्ट है। कोड जो मैंने संलग्न किया है वह जिंजरब्रेड और हनीकॉम पर ठीक काम करता है। जब कनेक्शन अनुरोध किया जाता है तो मुझे त्रुटि अनुरोध में बदल जाता है, जब कनेक्शन कनेक्शन बनने के बाद त्रुटि को पता चला है।

/** 
* Get the authentication token from Google 
* @param auth The Auth Key generated in getAuth() 
* @return The authentication token 
*/ 
private String getToken(String auth) { 
    final String tokenAddress = "https://www.google.com/reader/api/0/token"; 
    String response = ""; 
    URL tokenUrl; 

    try { 
     tokenUrl = new URL(tokenAddress); 
     HttpURLConnection connection = (HttpURLConnection) tokenUrl.openConnection(); 

     connection.setRequestMethod("GET"); 
     connection.addRequestProperty("Authorization", "GoogleLogin auth=" + auth); 
     connection.setRequestProperty("Content-Type","application/x-www-form-urlendcoded"); 
     connection.setUseCaches(false); 
     connection.setDoOutput(true); 
     Log.d(TAG, "Initial method: " + connection.getRequestMethod()); // Still GET at this point 

     try { 
      connection.connect(); 
      Log.d(TAG, "Connected. Method is: " + connection.getRequestMethod()); // Has now turned into POST, causing the 405 error 
      InputStream in = new BufferedInputStream(connection.getInputStream()); 
      response = convertStreamToString(in); 
      connection.disconnect(); 
      return response; 

     } 
     catch (Exception e) { 
      Log.d(TAG, "Something bad happened, response code was " + connection.getResponseCode()); // Error 405 
      Log.d(TAG, "Method was " + connection.getRequestMethod()); // POST again 
      Log.d(TAG, "Auth string was " + auth); 
      e.printStackTrace(); 
      connection.disconnect(); 
      return null; 
     } 
    } 
    catch(Exception e) { 
     // Stuff 
     Log.d(TAG, "Something bad happened."); 
     e.printStackTrace(); 
     return null; 
    } 
} 

क्या कोई समस्या है जो इस समस्या का कारण बन सकती है? क्या इस समस्या से बचने के लिए यह कार्य बेहतर कोडित किया जा सकता है?

अग्रिम में बहुत धन्यवाद।

उत्तर

20

यह व्यवहार Android Developers: HttpURLConnection

HttpURLConnection में वर्णन किया गया डिफ़ॉल्ट रूप से GET विधि का उपयोग करता है। यदि setDoOutput (true) कहा जाता है तो यह POST का उपयोग करेगा।

क्या अजीब बात यह है कि यह वास्तव में 4.0 तक व्यवहार नहीं रहा है, इसलिए मुझे लगता है कि यह कई मौजूदा प्रकाशित ऐप्स को तोड़ने जा रहा है।

Android 4.0 turns GET into POST पर इस पर और भी कुछ है।

8

इस से छुटकारा:

connection.setRequestProperty("Content-Type","application/x-www-form-urlendcoded"); 

यह API यह बताता है एक पोस्ट है। यह कैसे HttpClient के माध्यम से किया जा सकता है पर

अद्यतन:

String response = null; 
HttpClient httpclient = null; 
try { 
    HttpGet httpget = new HttpGet(yourUrl); 
    httpget.setHeader("Authorization", "GoogleLogin auth=" + auth); 
    httpclient = new DefaultHttpClient(); 
    HttpResponse httpResponse = httpclient.execute(httpget); 

    final int statusCode = httpResponse.getStatusLine().getStatusCode(); 
    if (statusCode != HttpStatus.SC_OK) { 
     throw new Exception("Got HTTP " + statusCode 
      + " (" + httpResponse.getStatusLine().getReasonPhrase() + ')'); 
    } 

    response = EntityUtils.toString(httpResponse.getEntity(), HTTP.UTF_8); 

} catch (Exception e) { 
    e.printStackTrace(); 
    // do some error processing here 
} finally { 
    if (httpclient != null) { 
     httpclient.getConnectionManager().shutdown(); 
    } 
} 
+0

नहीं HTTP के तरीके के लिए जाना। उस रेखा को हटाने से कोई फर्क नहीं पड़ता। –

+1

ठीक है, तो आप HttpClient के साथ जाने का भी प्रयास कर सकते हैं। –

+0

@ माइकल डोड: अद्यतन अनुभाग –

10

निकाला जा रहा है इस लाइन मेरे लिए काम किया:

connection.setDoOutput(true); 

4,0 इस लाइन यह निश्चित रूप से पोस्ट किया जाना चाहिए से सोचता है।

+2

धन्यवाद फेडरर, यह मेरे लिए भी काम करता है। मुझे जीईटी विधि के साथ एक ही समस्या है। जब मैंने setDoOutPut (true) के साथ GET विधि कहा, तो मुझे Http 405 मिला: विधि अनुमत संदेश वापस नहीं आया था। एक बार फिर धन्यवाद। – PrashantAdesara

2

मैंने पाया है कि पूर्व आईसीएस एक एक सामग्री-लंबाई मूल्य प्रदान किए बिना एक शरीर कम पोस्ट बनाने के साथ दूर हो सकता है, हालांकि बाद आईसीएस आप सामग्री-लंबाई सेट करना होगा: 0.

3

यह वह जगह है

HttpURLConnection डिफ़ॉल्ट रूप से GET विधि का उपयोग करता है: - एक है कि मुझे मिल गया मूल रूप से स्थापित करने setDoOutput (सही) द्वारा जब आप कनेक्शन बनाने यह एक पोस्ट अनुरोध बलों, आप इस निर्दिष्ट भले ही setRequestMethod में मिलता है । यदि setDoOutput (true) कहा जाता है तो यह POST का उपयोग करेगा। अन्य HTTP विधियां (विकल्प, HEAD, पुट, डिलीट और ट्रेस) setRequestMethod (स्ट्रिंग) के साथ उपयोग किया जा सकता है।

यह मुझे थोड़ी देर पहले पकड़ा - बहुत निराशाजनक ...

http://developer.android.com/reference/java/net/HttpURLConnection.html देखें और शीर्षक

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