- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
好的,所以,我正在为 Android 制作一个 Tumblr 客户端,我一直在尝试让 OAuth 工作大约一个星期,但一直未能成功。事情是这样的:
用户启动应用程序。主 Activity 的 onCreate 执行此操作:
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);
}
这会启动一个包含 WebView 的身份验证 Activity 。该 Activity 成功获取请求 token ,并将 WebView 发送到 Tumblr 登录屏幕。用户被要求允许应用程序访问他们的数据,他们按下允许,我的 WebViewClient 捕获回调 Url,并使用它执行此操作:
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()
};
}
然后我终于回到主应用程序屏幕并尝试进行我的第一个 API 调用,以获取用户仪表板上的最新十篇帖子:
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);
}
但是,我得到的不是像我应该的那样好的 JSON 响应,而是:
10-20 16:36:18.110: D/Result(22817): {"meta":{"status":401,"msg":"Not Authorized"},"response":[]}
那我错在哪里了?谢谢
最佳答案
我已经成功地将路标库与 Appache HttpCommons GET/POST/PUT 一起使用。
首先,我使用以下代码 (ActivityLogin.java
) 启动了用于登录的 WebView:
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)));
}
然后,我使用 onNewIntent(Intent)
从之前启动的 Activity
接收 OAuth 回调:
AppConfig.java
代码 fragment :
/** 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
代码 fragment :
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
关于Android Tumblr Oauth 路标 401,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7841936/
好的,所以,我正在为 Android 制作一个 Tumblr 客户端,我一直在尝试让 OAuth 工作大约一个星期,但一直未能成功。事情是这样的: 用户启动应用程序。主 Activity 的 onCr
过去一天我一直在努力为我的 Android 应用程序实现 OAuth。我遇到了一个又一个的问题。我只想签署一个请求,将其发送到网络服务并获得响应(我相信这是两条腿的方法)。 我已经下载了路标: -si
我是一名优秀的程序员,十分优秀!