在PaaS上开发Web、移动应用(2)
PaaS学习笔记目录
PaaS基础学习(1)
在PaaS上开发Web、移动应用(2)
PaaS优点与限制(3)
6. 巨型代码,是指持续不断地向一个应用程序添加功能,不停地增加新的特性如搜索功能、账户管理、博客发布等。
在开发速度以及在适应扩展需求的总体架构之间进行权衡。
- 新技术的面向服务架构(SOA)在Web应用的复兴
- 标准技术(例如REST)也让服务更统一和易维护。
7. JSON
JSON(JavaScript Object Notation)是作为在API服务内部传输数据的标准出现的,它可作为替换XML的备选方案之一。 
 如: 
 { 
 “id”:1, 
 “name”:”Programming for PaaS”, 
 “price”:123, 
 “tags”:[“PaaS”,”Programming”] 
 }
8. REST(表述性状态转移)
REST(Representational State Transfer)是诸如Web应用之类的分布式系统的一种架构模式。 
 - 通过复用HTTP的基础操作,如GET、POST、PUT以及DELETE,REST已经成为了一种主流服务设计模型。 
 - REST背后的原则的基本原则就是通过提供一个共享的网络词汇,以一种标准的、可预测的格式来传输资源。 
 如:一个基于REST的用于管理用户数据的JSON服务:
GET
列出资源(可以被缓存)
- http://example.com/users
Header:
  none
Response:
[
  {'id':123,
  'name':'a'},
  {'id':124,
  'name':'b'}
]
- http://example.com/users/123
Header:
  none
Response:
{'id':123,
'name':'a'}
- http://example.com/users?name=b
Header:
  none
Response:
[
{'id':124,
'name':'b'}
]PUT 
 更新资源(不可缓存)
- http://example.com/users
Header:
[
{'id':123,
'name':'x'},
{'id':124,
'name':'y'}
]
Response:
  200 OK
- http://example.com/users/123
Header:
  {'id':123,
  'name':'x'}
Response:
  200 OK
- http://example.com/users?name=b
Header:
[
{'id':124,
'name':'y'}
]
Response:
  200 OKPOST 
 创建新资源(不可缓存)
- http://example.com/users
Header:
{'id':125,
'name':'c'}
Response:
  200 OK
-http://example.com/users/123
  Not used
-http://example.com/users?name=b
  创建新资源的时候不需要查询字符串
DELETE
  删除资源(不可缓存)
- http://example.com/users
Header:
  None
Response:
  200 OK
Note:
  Deleted all users
-http://example.com/users/123
Header:
  None
Response:
  200 OK
Note:
  Deleted only user 123
- http://example.com/users?nmae=b
Header:
  None
Response:
  200 OK
Note:
  Deleted all users named b9. 元服务
元服务是一种基于REST的应用程序,用于为数据的集合提供服务。
10. 瘦Web客户端
元服务可以直接在浏览器中调用。
11. 胖Web客户端
诸如SproutCore(http://SproutCore.com)和Cappucino(http://www.Cappucinoproject.org)可以作为数据绑定的构建模块。 
 SproutCore和Cappucino为我们提供了构建模块,通过一种非常标准的方法将这些基础元素组合在一起,就可以构建现代应用程序。 
 这些应用无论在Web还是移动客户端都让人感觉到类似桌面应用的效果。
12. 移动客户端的PaaS
iOS
REST的框架:RestKit
Android
采用Java语言的Android本地应用也可以简单快速地访问元服务以及获取数据。 
 - 自己动手构建,采用Android的异步网络操作 
 1. 将AsyncTask类扩展为异步任务类 
 2. 创建一个URLConnection并且将数据转换为字符串 
 3. 将结果处理为Java对象 
 Java实例代码:
//通过新的GetRESTData().excute()在一个服务中执行;
private class GetRESTData extends AsyncTask <Void,Void,String>{
  @Override
  protected String doInBackground(Void... params){
    URL url = new URL("http://example.com/users");
    URLConnection urlConnection = url.openConnection();
    InputStream in = new
      BufferedInputStream(urlConnection.getInputStream());
    BufferedReader reader = new
      BufferedReader(new InputStreamReader(in));
    String result,line = reader.readLine();
    result = line;
    while((line = reader.readLine())!=null){
      result += line;
    }
    in.close();
    return result;
  }
  protected void onPostExecute(String restResult){
    //process the JSON string into Java object
    //and persist it into a SQLite database
  }
}- 使用开源或者专有的框架
Android上的REST框架:Restlet 
 Restlet可以从基于REST的源获取数据时,极大地节省开发者的时间和精力。 
 RestLet的简单实例:
public interface UserResource{
  @Get
  public User retrieve();
  @Put
  public void store(User user)
  @Delete
  public void remove();
}
ClientResource cr = new ClientResource("http://example.com/users/123");
//获取用户对象
UserResource resource = cr.wrap(UserResource.class);
User user = resource.retrieve(); 
                            