android MVVM架构实践之新浪微博API调用

移动开发 waitig 518℃ 百度已收录 0评论

android MVVM架构实践之新浪微博API调用

任务描述
利用android MVVM架构模式搭建一个软件实现类似微博首页列表显示的功能,不能使用SDK,通过Oauth协议,调用微博的API。


功能实现:
1 OAuth授权方式获得第三方授权登录 这里有SDK集成方式和非SDK集成方式
2 新浪微博API调用


一、创建新浪微博移动应用

登陆:http://open.weibo.com/development/mobile

1 填写个人开发者信息
说明:这里的网站可以填写你的博客地址 后面可以修改。
2 身份认证
不进行身份认证也行,但是权限会有约束
3 创建应用
说明:
android下载地址:先填着你的博客地址
android签名:一定要确保手机上已安装将要提交审核并且已经加了数字签名的apk
再通过新浪微博提供了的可以用来获取Android签名的工具,安装到手机上输入包名就可以生成签名


二、获取签名

点击android-studio的run就是使用的是debug模式,debug模式下签名是为了开发调试,Android SDK提供了一个不需要密码的证书用于在debug模式下进行签名调试,默认存储在$HOME/.android/debug.keystore,但是release版本必须使用自己的数字签名证书,release模式下进行签名则是为了正式发布。
因此将软件run到手机上,再通过新浪微博提供了的可以用来获取Android签名的工具,安装到手机上输入包名就可以生成签名了,将签名写入新浪微博的应用中。


获取新浪微博的授权认证
微博开放接口的调用,如发微博、获取用户基本信息、获取热门微博内容等,都是需要获取用户身份认证的。目前微博开放平台用户身份鉴权主要采用的是OAuth2.0。


OAuth(Open Authorization)授权认证协议

  • OAuth协议为用户资源的授权提供了一个安全的、开放而又简易的标准。不会使第三方触及到用户的帐号信息(如用户名与密码),是安全的。

  • 服务提供者可以通过OAuth提供接口

  • 软件开发商也可以通过OAUTH去调用接口 如微博API调用中可以通过接口获得用户的关注信息,而不需要用户登录的账号密码信息

授权机制:

  • SSO 授权:在有客户端的情况下,使用 SSO 授权登陆;无客户端的情况下,自动唤起 Web 授权
  • Web 授权:在没有客户端的情况下,可直接使用该授权 虽然第一次要输入账号密码,但是也是通过微博的平台去输入,第三方软件是得不到的,所以仍是安全的
  • SSO 授权+Web 授权 混合授权,(推荐使用) ( 如果手机安装了微博客户端则使用客户端授权,没有则进行网页授权 )

填写授权回调页
通常Mobile Native App没有服务器回调地址,您可以在应用控制台授权回调页处填写平台提供的默认回调页,该页面用户不可见,会传回一个“code”参数,开发者可以用code换取Access Token值。 OAuth2.0客户端默认回调页:https://api.weibo.com/oauth2/default.html

引导用户授权

引导需要授权的用户到如下页面:

https://api.weibo.com/oauth2/authorize?client_id=YOUR_CLIENT_ID&response_type=code&redirect_uri=YOUR_REGISTERED_REDIRECT_URI

YOUR_CLIENT_ID:即应用的AppKey,可以在应用基本信息里查看到。

YOUR_REGISTERED_REDIRECT_URI:即之前填写的授权回调页,注意一定要完全相同。

如果用户授权成功后,会跳转到回调页,开发者此时可以得到url参数中的code值,注意code只能使用一次

换取Access Token
开发者可以访问如下页面得到Access Token:

https://api.weibo.com/oauth2/access_token?client_id=
YOUR_CLIENT_ID&client_secret=YOUR_CLIENT_SECRET&grant_type=authorization_code&redirect_uri=
YOUR_REGISTERED_REDIRECT_URI&code=CODE

得到的返回是一个JSON格式的数据
可以用JSONFormat解析
我的Bean为

package com.scnu.sihao.sinaweibodemo;

public class AccessTokenBean {

    private String access_token;
    private String remind_in;
    private int expires_in;
    private String uid;
    private String isRealName;

    public String getAccess_token() {
        return access_token;
    }

    public void setAccess_token(String access_token) {
        this.access_token = access_token;
    }

    public String getRemind_in() {
        return remind_in;
    }

    public void setRemind_in(String remind_in) {
        this.remind_in = remind_in;
    }

    public int getExpires_in() {
        return expires_in;
    }

    public void setExpires_in(int expires_in) {
        this.expires_in = expires_in;
    }

    public String getUid() {
        return uid;
    }

    public void setUid(String uid) {
        this.uid = uid;
    }

    public String getIsRealName() {
        return isRealName;
    }

    public void setIsRealName(String isRealName) {
        this.isRealName = isRealName;
    }
}

若出现这个错误

{"error":"HTTP METHOD is not suported for this request!","error_code":10021,"request":"/oauth2/access_token"}

问题原因是:请求方式不对,应该是通过post方式请求,上面这样属于get方式
错误代码参考下面的附录


接着就可以调用API啦~

1 获取当前登录用户及其所关注(授权)用户的最新微博
https://api.weibo.com/2/statuses/home_timeline.json?access_token=你得到的access_token
请求方式为GET
相关请求参数见官方API:http://open.weibo.com/wiki/2/statuses/home_timeline
并且可以多次利用该网址调用 access_token有效期为:


利用微博SDK进行Oauth授权获得AccessToken
参考另一篇博客:http://blog.csdn.net/weixin_37577039/article/details/78632075


不需要审核
审核是APP上架了才去提交给微博审核的


界面UI参考另一篇博客:http://blog.csdn.net/weixin_37577039/article/details/78581423


利用Retrofit2+Okhttp+rxjava调用api参考另一边博客:


附录

错误代码参考:http://open.weibo.com/wiki/Error_code
还有一个官网没给的错误码

"error":"invalid_grant","error_code":21325

这个原因是CODE过期了!因为code只能使用一次,一次就过期了


本文由【waitig】发表在等英博客
本文固定链接:android MVVM架构实践之新浪微博API调用
欢迎关注本站官方公众号,每日都有干货分享!
等英博客官方公众号
点赞 (0)分享 (0)