4-7 HTTP操作(一)
1 什么是HTTP协议
超文本传输协议
客户端和服务器端请求应答的标准
客户端浏览器或其他程序与Web服务器之间的应用层通信协议
无状态协议
2 HTTP工作原理
建立连接
客户端发送请求
服务器端响应请求
断开连接
3 HTTP运行流程
请求报文格式:
请求行-通用信息头-请求头-实体头-报文主体
响应报文格式:
响应行-通用信息头-响应头-实体头-报文主体
4-8 HTTP操作(二)
1 Apache HTTP API 介绍
2 发送请求和接受响应的流程
//生成一个请求对象 HttpGet httpGet = new HttpGet("http://www.baidu.com"); //生成一个Http客户端对象 HttpClient httpClient = new DefaultHttpClient(); //使用Http客户端发送请求对象 HttpResponse httpResponse = httpClient.execute(httpGet); //该方法会返回一个HttpResponse对象 //取出内容 代表一个Http消息 HttpEntity httpEntity = httpResponse.getEntity(); InputStream inputStream = httpEntity.getContent(); //进行一些IO流的操作 BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream)); String result = ""; String line = ""; while((line = reader.readLine()) = null){ result = result + line; } System.out.println(result); //... inputStream.close();
4-9 HTTP操作(三)
1 HTTP请求的方法
2 使用GET方法发送请求
get URL xxxxx?key=value&key=value...
剩下的操作和HTTP2中一样
url为拼上?key=value..之后的url
3 使用POST方法发送请求
NameValuePair nameValuePair1 = new BasicNameValuePair("name",name); //name为读取的值 NameValuePair nameValuePair2 = new BasicNameValuePair("age",age); //age为读取的值 List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(); nameValuePairs.add(nameValuePair1); nameValuePairs.add(nameValuePair2); //生成Entity对象 HttpEntity requestHttpEntity = new UrlEncodedFormEntity(nameValuePairs); HttpPost httpPost = new HttpPost(url); //这里的url是baseUrl 不用拼上?key=value... httpPost.setEntity(requestEntity); //之后的操作一样
有了上面Oauth原理,HTTP操作,AsyncTask的基础 就可以在Android中进行认证的操作了
1 对Request Token进行授权
在retrieveRequestToken中有一个参数(第二个)是回调URL
该方法首先申请到一个未授权的requestToken 然后将appkey和secret存到comsumer 并返回用于授权的地址
通过uri 隐式启动Activity(打开了授权网页)
在完成了Oauth认证第二第二步以后(网页上点授权后),会访问callback的url(即第二个参数)
回调会启动manifest中配置了<data>匹配callback成功的Activity
例如<data android:scheme="x-oauthflow" android:host="callback" />
这里是一个比较特别的地方
2 获取Access Token
在启动新的Activity后
public void onNewIntent(Intent intent){ SharedPreferences prefs=PreferenceManager.getDefaultSharedPreferences(this); final Uri uri=intent.getData(); if(uri!=null && uri.getScheme().equals(Constants.OAUTH_CALLBACK_SCHEME)){ new RetrieveAccessTokenTask(this,consumer,provider,prefs).execute(uri); } finish(); }
在Task中
通过uri.getQueryParameter(KEY); 得到键值对的值
通过provider.retrieveAccessToken(consumer,verifle)请求accessToken和accessTokenSecret 被放到了consumer对象中
将Token和TokenSecret记录到prefs中
想看一下AsyncTack的使用方法 记得写过什么 但是找了半天没找到 才发现原来一直没整理上来 关于Mars老师Android开发视频教程第四季的一些东西(关于腾讯微博项目)
4-2 OAuth认证原理
1 什么是OAuth
一种安全认证的协议
为用户资源的授权提供了一个安全、开放而又简易的标准
不会使第三方触及到用户的账号信息
http://www.oauth.net
2 OAuth当中的角色
ServiceProvider 服务提供者 通常是网站
User 用户
Consumer 客户 比如应用程序
Protected Resources 被保护的资源
3 OAuth验证流程
以下是一个三角形的关系图 因为排版关系 自行想象一下两两之间的箭头指向
Service Provider
3 可以访问你的资源 2 请求访问用户的资源
4 User授权访问 5 获得授权
User 1 请求服务 Consumer
6 服务该用户
补上了一张图:
注意到用户提交密码是在第四步 而第三方Consumer从头至尾没有获得账号信息
1 Consumer ----request_token----> Service Provider
2 Service Provider ----grant request_token----> Consumer
3 Consumer ----redirect to auth page----> User
4 User ----authorize request_token----> Service Provider
5 Service Provider ----acknowledge authorization----> User
6 User ----redirect to consumer---->Consumer
7 Consumer ----access_token---->Service Provider
8 Service Provider ----grant access_token----> Service Provider
以上是Oauth的流程 官方的说明图如下
在视频讲义中 又分了两集介绍认证的过程
其中Oauth认证一中提到了Oauth认证需要用到的几个关键URL
以腾讯微博为例:(其他也类似)
Request Token URL 获取未授权的Request Token的服务地址
https://open.t.qq.com/cgi-bin/request_token
User Authorization URL 获取用户授权的Request Token服务地址
https://open.t.qq.com/cgi-bin/authorize
Access Token URL 使用用户授权后的Request Token换取Access Token的服务地址
https://open.t.qq.com/cgi-bin/access_token