2011-10-20 14 views
5

ठीक है, इसलिए, मैं एंड्रॉइड के लिए टंबलर क्लाइंट बना रहा हूं, मैं ओएथ को लगभग एक हफ्ते तक काम करने की कोशिश कर रहा हूं और विफल रहा हूं। यहां बताया गया है कि यह कैसे चल रहा है:एंड्रॉइड टंबलर ओथ-साइनपोस्ट 401

उपयोगकर्ता ऐप को सक्रिय करता है। मुख्य गतिविधि की ऑनक्रेट यह करता है:

settings = getSharedPreferences(PREFS_NAME, 0); 
authToken=settings.getString("OauthToken", "none"); 
authTokenSecret=settings.getString("OauthSecret", "none"); 
if(authToken=="none" || authTokenSecret=="none"){ 
    Intent i = new Intent(getApplicationContext(),Authentication.class); 
    startActivity(i); 
} 

यह एक प्रमाणीकरण गतिविधि लॉन्च करता है जिसमें वेबव्यू शामिल है। उस गतिविधि को अनुरोध टोकन सफलतापूर्वक प्राप्त हो जाता है, और वेबव्यू को टंबलर लॉगिन स्क्रीन पर भेजता है। उपयोगकर्ता अनुप्रयोग, वे अनुमति दें दबाते हैं, के द्वारा अपने डेटा एक्सेस करने के लिए कहा जाता है और मेरे WebViewClient कॉलबैक यूआरएल पकड़ता, और इसके साथ यह करता है:

String[] token = helper.getVerifier(url); 
      if (token != null) { 
       try { 
        String accessToken[] = helper.getAccessToken(token[1]); 
        editor.putString("OauthToken", accessToken[0]); 
        editor.putString("OauthSecret", accessToken[1]); 
        editor.commit(); 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
      } 
      finish(); 

सहायक वर्ग के getAccessToken और getVerifier इस तरह दिखेगा:

public String[] getVerifier(String myUrl) { 
    // extract the token if it exists 
    Uri uri = Uri.parse(myUrl); 
    if (uri == null) { 
     return null; 
    } 

    String token = uri.getQueryParameter("oauth_token"); 
    String verifier = uri.getQueryParameter("oauth_verifier"); 
    return new String[] { token, verifier }; 
} 

public String[] getAccessToken(final String verifier) 
     throws OAuthMessageSignerException, OAuthNotAuthorizedException, 
     OAuthExpectationFailedException, OAuthCommunicationException { 
    new Thread(new Runnable() { 
     public void run() { 
       try { 
        mProvider.retrieveAccessToken(mConsumer, verifier); 
       } catch (OAuthMessageSignerException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } catch (OAuthNotAuthorizedException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } catch (OAuthExpectationFailedException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } catch (OAuthCommunicationException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 
     } 
    }).start(); 
    return new String[] { 
      mConsumer.getToken(), mConsumer.getTokenSecret() 
    }; 
} 

तो मैं अंत में मुख्य आवेदन स्क्रीन पर वापस जाने के लिए और मेरी पहली एपीआई कॉल करने के लिए, उपयोगकर्ता के डैशबोर्ड पर हाल ही में दस पदों प्राप्त करने की कोशिश:

OAuthConsumer myConsumer = new CommonsHttpOAuthConsumer(MainView.authToken, MainView.authTokenSecret); 
      HttpGet request = new HttpGet("http://api.tumblr.com/v2/user/dashboard?limit=10"); 
      myConsumer.sign(request); 
      HttpClient httpClient = new DefaultHttpClient(); 
      HttpResponse response = httpClient.execute(request); 
      HttpEntity entity = response.getEntity(); 
      BufferedReader reader = new BufferedReader(new InputStreamReader(entity.getContent())); 
      String line; 
      while ((line = reader.readLine()) != null) { 
       builder.append(line); 
      } 
10-20 16:36:18.110: D/Result(22817): {"meta":{"status":401,"msg":"Not Authorized"},"response":[]} 

तो मैं कहाँ गलती कर दी: 10,403,210 हालांकि, बजाय की तरह एक अच्छा JSON उत्तर मैं होना चाहिए होने का, मैं इस मिल रहा है? धन्यवाद

+1

मुझे यह वही समस्या मिल रही है, जिसमें मैं उन API विधियों का उपयोग करने का प्रयास करता हूं जिनके लिए POST अनुरोधों की आवश्यकता होती है, हालांकि अनुरोधों को ठीक काम करने के लिए प्रतीत होता है। मैं आश्चर्यचकित होना शुरू कर रहा हूं कि क्या उनकी एपीआई थोड़ा फ्लेकी है। –

+0

एंड्रॉइड का कौन सा संस्करण आप विकसित कर रहे हैं? – NotACleverMan

+0

केवल हनीकॉम्ब। – Nick

उत्तर

2

मैंने सफलतापूर्वक साइनपॉस्ट लाइब्रेरी का उपयोग Appache HttpCommons GET/POST/PUTs के साथ किया है।

सबसे पहले, मैं लॉगिन प्रयोजन के लिए WebView शुरू की है, निम्नलिखित कोड (ActivityLogin.java) का उपयोग:

private static CommonsHttpOAuthConsumer consumer = new CommonsHttpOAuthConsumer(AppConfig.CONSUMER_KEY, AppConfig.CONSUMER_SECRET); 
private static OAuthProvider provider = new DefaultOAuthProvider (AppConfig.requestURL, AppConfig.accessURL, AppConfig.authURL); 

private void logMeIn() throws ...{ 
    String authUrl = provider.retrieveRequestToken(consumer,AppConfig.CALLBACK_URL); 
    startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(authUrl))); 
} 

फिर, मैं से पहले Activity का शुभारंभ किया OAuth कॉलबैक प्राप्त करने के लिए onNewIntent(Intent) उपयोग किया है:

AppConfig.java कोड snipet:

/** OAuth Authorization URL */ 
public static final String authURL = mainOAuthUrl+"/authorize/?theme=android"; 

/** OAuth Request URL */ 
public static final String requestURL = mainOAuthUrl+"/request/token/"; 

/** OAuth Access URL  */ 
public static final String accessURL = mainOAuthUrl+"/access/token/"; 

/** OAuth CALLback URL*/ 
public static final String CALLBACK_URL = "yourapp://twitt"; 

ActivityLogin.java कोड snipet:

protected void onNewIntent(Intent intent) { 
    Uri uri = intent.getData(); 
    if (uri != null && uri.toString().startsWith(AppConfig.CALLBACK_URL)) { 
     String verifier = uri.getQueryParameter(OAuth.OAUTH_VERIFIER); 

     provider.retrieveAccessToken(consumer, verifier); 
     Data.OAuthAccessKey = consumer.getToken(); 
     Data.OAuthAccessSecret = consumer.getTokenSecret(); 
    } 

} 

और उस तरह तो, मेरे कनेक्शन कोड दिखता है:

public HttpResponse sampleOauthConnect(String url) throws ...{ 

    /** setup some connection params */ 
    HttpContext context = new BasicHttpContext(); 

    HttpRequestBase request = new HttpGet(url); 

    if (Data.OAuthConsumer == null) 
     Data.OAuthConsumer = new CommonsHttpOAuthConsumer(AppConfig.CONSUMER_KEY, AppConfig.CONSUMER_SECRET); 

    if (Data.OAuthAccessKey == null || Data.OAuthAccessSecret == null) 
     throw new LoginErrorException(LoginErrorException.NOT_LOGGED_IN); 

    Data.OAuthConsumer.setTokenWithSecret(Data.OAuthAccessKey, Data.OAuthAccessSecret); 

    try { 
     Data.OAuthConsumer.sign(request); 
    } catch (OAuthMessageSignerException e) { 
     throw new LoginErrorException(LoginErrorException.OAUTH_EXCEPTION, e); 
    } catch (OAuthExpectationFailedException e) { 
     throw new LoginErrorException(LoginErrorException.OAUTH_EXCEPTION, e); 
    } catch (OAuthCommunicationException e) { 
     throw new LoginErrorException(LoginErrorException.OAUTH_EXCEPTION, e); 
    } 

    HttpClient client = new DefaultHttpClient(); 

    /** finally execute this request */ 
    return client.execute(request, context); 
} 

मैं कॉपी-पेस्ट दौरान कुछ छूट गया हो सकता है, बस मुझे बताओ अगर यह समाधान आप के लिए काम करेंगे। मैं singpost 1.2.1.1

+0

मेरे पास अभी आपके कोड का परीक्षण करने का समय नहीं है, या यहां तक ​​कि अगले कुछ दिनों के भीतर। लेकिन चूंकि इनाम निकलता जा रहा था और यह एक सुपर उपयोगी पूरी तरह से पोस्ट की तरह लग रहा है, तो आप जीतने के लिए! धन्यवाद, मुझे पता चल जाएगा कि उसे वास्तव में मन में बाद में – Nick

+0

लें कि मैं चाबियों का दो जोड़ी का उपयोग काम करता है वहीं: 'AppConfig.CONSUMER_KEY, AppConfig.CONSUMER_SECRET' (जो ऐप में संग्रहीत हैं), और 'Data.OAuthAccessKey, Data.OAuthAccessSecret' जो सर्वर द्वारा उत्पन्न होते हैं। – Kocus

+0

समान प्रतिक्रिया प्राप्त करना अनधिकृत: {" मेटा ": { "स्थिति": 401, "संदेश": "अधिकृत नहीं"}, "प्रतिक्रिया": []} – DcodeChef

1

वर्तमान में, टंबलर MultipartEntity का समर्थन नहीं करता है, इसलिए आपको पैराम जोड़ने के लिए NameValuePairs का उपयोग करना होगा।

अगर आप एक फोटो पोस्ट करना चाहते हैं, तो आपको उस तस्वीर को एक ARRAY में परिवर्तित करना होगा और यूआरएल इसे एन्कोड करना होगा!

+0

तस्वीर पोस्टिंग का सामना करना पड़ समस्या। आप कह "... एक सरणी और यूआरएल एनकोड यह है कि तस्वीर बदल" से क्या मतलब है? आप कुछ कोड का टुकड़ा प्रदान कर सकता है। –

+0

गिलास के अपने पुस्तकालय (Jumblr) बहुखण्डीय रूपों का उपयोग करता है: https://github.com/tumblr/jumblr/blob/master/src/main/java/com/tumblr/jumblr/request/MultipartConverter.java – Jabari

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