前言

记录一下自己的学习练习记录,利用一些时间写了这个仿微博,其实一开始是要写一个仿网易音乐的,结果找不到一个音乐接口啊,只好选择了微博来练手,戏剧性的是写了一半的时候,我就找到了音乐接口,笑cry,这里也推荐给大家这个API集合,很多你想用的接口里边都有,音乐,视频,数学,机器学习,购物健身娱乐什么的,有兴趣可以收藏下来慢慢玩。
有兴趣和我一试的friends。。
* 从这个项目里可以复习Android几乎所有基础知识,也可以作部分控件和库使用方法的一个小简介。
* 代码不是结构很严谨的那种,但是很容易看懂实现过程,我会继续努力的,大神们务必留下指点
* 未使用官方SDK开发,想自己把所有套路摸一遍再去看官方的,能更好的知道怎样更好的去实现

开篇

开发前的准备

这里整理了一张开发流程图

第一步,当然是跑去微博开放平台申请开发者账号,新浪这个网页有个坑,就是你很可能点登录登不上(它会没有任何反应的。。),这时候你就需要先去微博首页登录你的微博账号,然后再回到开放平台首页刷新一下页面就登录成功了。登陆成功以后,微链接–>立即创建–>移动应用,填好信息后点击创建,网页反应可能有些慢,稍等就会显示创建成功。此时会跳到应用信息界面,在这个页面我们要获得到App Key和App Secret两个参数的信息,接下来我们要做微博的授权,所以顺带把相关信息填写好,高级信息–>授权回调页,两项我们都填成一样的即可,在这里我填的是百度的首页,这里有第二个坑万万别踩。。。就是回调地址千万不要填写新浪网,其他都可以,否则后续你将得不到你要的信息,其他我们可以暂时不填,到之后用的时候再去填写。

OAuth2 授权

在文档–>API文档中,可以找到关于OAuth2授权的文档。这里微博也为我们提供了一个很好的API测试工具,但是在授权之前我们还用不着。之后可以使用。从文档我们需要看的信息有,首先是请求的URL。其次,很重要的就是请求的方式。再有就是请求参数,在表格里,属性为true的是必选属性,在这里我们要传递两个参数,可以从说明中看到是刚刚获取到的APPKEY和填写的授权回调地址,授权回调地址在这里,就是在授权完成返回结果的时候,可以从中获取到返回的参数所使用的。示例里使用了Get请求方法。

//请求
https://api.weibo.com/oauth2/authorize?client_id=123050457758183&redirect_uri=http://www.example.com/response&response_type=code

//同意授权后会重定向
http://www.example.com/response&code=CODE

这里我网络请求使用了OkHttp,get请求直接访问URL,将参数直接加在URL后边(多个参数用&连接),直接访问即可。 POST方法后续介绍使用方法。
这里我们可以开始 请求OAuth授权 ,我使用了一个WebView来加载授权页面,

 final WebView webView = (WebView) findViewById(R.id.webView);
        //管理WebView
        WebSettings webSettings = webView.getSettings();
        //启用JavaScript调用功能
        webSettings.setJavaScriptEnabled(true);
        //启用缩放网页功能
        webSettings.setSupportZoom(true);
        //获取焦点
        webView.requestFocus();
        RequestParams params = new RequestParams();
        String url1 = params.put(Constants.APP_KEY, Constants.REDIRECT_URL);
        webView.loadUrl(url1);
        //WebViewClient主要帮助WebView处理各种通知、请求事件
        webView.setWebViewClient(
                new WebViewClient() {
                    @Override
                    public void onPageStarted(WebView view, String url, Bitmap favicon) {
                        super.onPageStarted(view, url, favicon);
                        System.out.println("kaishi");
                        if (url.startsWith(Constants.REDIRECT_URL)) {
                            String code = url.split("=")[1];
                            System.out.println("code is " + code);
                            requestmsg(code);
                        }
                    }
                });

这样当回调页面时候,就可以从其网页URL中截取出code的值,以供下一步获取其他值使用。
接下来我们就要拿着code去 获取授权 以得到access_token了。打开相关文档,依旧是首先查看重点三项,URL,请求方式,请求参数,这次用到了POST请求。

OkHttp使用方法(包含maven使用)

Okhttp的post请求。这里我们来简介一下okhttp的用法。首先要添加它的依赖,在这里,我们可以去maven仓库去寻找我们需要使用的第三方库。百度maven repository即可。搜索到结果以后,在下方众多版本里,选择使用人数最多的办版本,一般都不会出错。这里我们选择3.4.1版本。并复制他的依赖

compile group: 'com.squareup.okhttp3', name: 'okhttp', version: '3.4.1

我们需要删去group,name,version等标签和引号等,保留冒号,见如下格式

compile  'com.squareup.okhttp3:okhttp: 3.4.1'

在app.gradle里添加,然后同步。 无论何种请求方式,我们都要先创建一个OkhttpClient实例。

OkHttpClient client = new OkHttpClient();

然后,如果是get请求,我们只需要将处理准备好的URL直接进行访问和获取数据即可。

Request request = new Request.Builder().url(准备好的URL).build();
Call call = client.newCall(request);
call.enqueue(new Callback() {···});

如果是post请求方式,那么我们则会多使用一个FormBody来放置参数。

FormBody formBody = new FormBody.Builder().add("client_id", Constants.APP_KEY)
                    .add("client_secret", Constants.APP_SECRET)
                    .add("grant_type", "authorization_code")
                    .add("code", code)
                    .add("redirect_uri", Constants.REDIRECT_URL)
                    .build();

将post请求需要的参数都以键值对的形式通过add方法添进formBody中。然后再使用Request发起请求传递

FormBody formBody = new FormBody.Builder().add("client_id", Constants.APP_KEY)
                    .add("client_secret", Constants.APP_SECRET)
                    .add("grant_type", "authorization_code")
                    .add("code", code)
                    .add("redirect_uri", Constants.REDIRECT_URL)
                    .build();
            OkHttpClient client = new OkHttpClient();
            Request request = new Request.Builder().url("https://api.weibo.com/oauth2/access_token").post(formBody).build();
            Call call = client.newCall(request);
            call.enqueue(new Callback() {···});

然后我们需要将返回的json数据封装成简单的实体类,返回的数据在new Callback() {···}的onresponse方法中获得和处理,这里说明,无论返回的数据是否正确,只要有返回,都会在onResponse中处理,onFailure中不用于返回数据不正确的情况。
这里我们可以将返回的数据封装成一个Token类。可以自己手动写,但是现今有工具就要学会使用嘛,往上很多json自动转换POJO的。我使用的是这个,正确格式的json串复制进去生成实体类就好。 获取json返回数据,首先

String responseData = response.body().string();

获取工作到这里就结束了,接下来我们就该开始做解析数据工作。这里我使用的是GSON
依旧去maven仓库找到它的依赖,添加到gradle中,我们就可以使用它解析数据了 接下来你要做的就是,使用Gson将它封装成实体类,代码如下

Token token = new Token();
Gson gson = new Gson();
token = gson.fromJson(responseData, Token.class);

这样我们就完成了封装。

final String access_token=token.getAccess_token();
final String uid=token.getUid();

这些操作应该就很简单了很容易理解了。
其他的数据处理也是一样的操作。 下一篇中我们将获取解析好友微博。 源码地址,写练手项目博客不带完整源码的都是流氓(逃~