基于REST协议实现iPhone和Google App Engine之间的通信
来源:互联网 发布:富士触摸屏软件 编辑:程序博客网 时间:2024/06/03 21:42
本文主要介绍如何基于REST协议实现在iPhone和Google App Engine之间进行的通信。REST协议是一个基于HTTP协议,能够简单的实现数据的追加,更新,删除和获取。通信的数据格式采用JSON一个轻量级的数据格式。iPhone作为客户端,其主要功能是提交和获取数据。Google App Engine作为服务端,主要功能接收,保存和返回数据。
iPhone端的实现
1、JSON格式的转换
首先是解决JSON格式的转换。经过一番调查选择了TouchJSON,TouchJSON是一个开源的开发包。
TouchJSON的使用方法比较简单,能够简单的在JSON格式和NSDictionary之间进行转换。
// 将JSON格式的NSData转换成NSDictionary
NSDictionary *dictionary = [[CJSONDeserializer deserializer]
deserialize:jsonData error:&error];
// 将NSDictionary转换成JSON格式的字符串
NSString *jsonData = [[CJSONSerializer serializer] serializeObject:dictionary];
2、数据类的定义
首先定义一个数据类,这个类主要定义了iPhone和Google App Engine之间通信时的数据。
鉴于Google App Engine对数据类的命名习惯,这里取名为MessageEntity。
MessageEntity中只定义了一个属性message,用来存放将要传送的文字内容。
另外为了方便JSON格式的转换,实现了格式化和反格式化的两个类方法。
@interface MessageEntity : NSObject {
// 这里可以最加其它的属性,本代码主要为了示范,所以简单为主,指定义了一个属性,
NSString *_message;
}
// 对外公开
@property (nonatomic, retain) NSString *message;
// JSON格式转换的类方法
+ (NSData *)serialize:(MessageEntity *)messageEntity;
+ (id)deserializeWithDictionary:(NSDictionary *)dictionary;
@end
@implementation MessageEntity
@synthesize message = _message;
// 将MessageEntity对象实例转换成JSON格式的数据
+ (NSData *)serialize:(MessageEntity *)messageEntity {
NSDictionary *dictionary = [NSDictionary dictionaryWithObject:
messageEntity.message forKey:@"message"];
NSString *jsonString = [[CJSONSerializer serializer] serializeObject:dictionary];
NSData *jsonData = [jsonString dataUsingEncoding:NSUTF8StringEncoding];
return jsonData;
}
// 将从JSON格式转换来的NSDictionary对象实例转换成MessageEntity对象实例
+ (id)deserializeWithDictionary:(NSDictionary *)dictionary {
MessageEntity *messageEntity = [[MessageEntity alloc] init];
messageEntity.message = [dictionary objectForKey:@"message"];
return messageEntity;
}
- (void)dealloc {
[_message release];
[super dealloc];
}
@end
3、向Google App Engine端提交数据
实现起来很简单,根据REST协议,提交数据时将HTTP的Method设置为POST,在HTTP的Body里设置提交的内容,
然后就是跟普通的HTTP协议一样提交Request到指定的URL。
提交的URL是Google App Engine的地址,后面将会介绍Google App Engine端的实现。
// 指定提交的URL地址
NSURL *url = [NSURL URLWithString:@"http://tiekrr.appspot.com/rest/message.json"];
// 创建NSMutableURLRequest
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:url];
// 设置HTTP头信息
NSString *boundary = [[NSProcessInfo processInfo] globallyUniqueString];
NSString *boundaryString = [NSString stringWithFormat:
@"multipart/form-data; boundary=%@", boundary];
[request addValue: boundaryString forHTTPHeaderField: @"Content-Type"];
// 根据REST协议指定HTTPMethod为POST
[request setHTTPMethod:@"POST"];
// 将要提交的数据转换成JSON格式后设置为HTTPBody
[request setHTTPBody:[MessageEntity serialize:messageEntity]];
// 定义HTTP将要返回的Response对象
NSURLResponse *response = nil;
NSError *error = nil;
// 发出同步请求
NSData *result = [NSURLConnection sendSynchronousRequest:request
returningResponse:&response error:&error];
[request release];
// 发生错误
if (error) {
UIAlertView *errorAlertView = [[UIAlertView alloc] initWithTitle:@"Error"
message:[error localizedDescription]
delegate:nil cancelButtonTitle:@"Close"
otherButtonTitles:nil];
[errorAlertView show];
[errorAlertView release];
}
// 返回的结果
NSString *resultString = [[NSString alloc] initWithData:result
encoding:NSUTF8StringEncoding];
NSLog(resultString);
[resultString release];
4、从Google App Engine端获取数据
和提交一样也是利用HTTP协议提交Request到指定的URL然后从返回的Response中获取数据。
首先根据REST协议,获取数据时将HTTP的Method设置为GET即可。
// 指定提交的URL地址
NSURL *url = [NSURL URLWithString:@"http://tiekrr.appspot.com/rest/message.json"];
// 创建NSMutableURLRequest
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:url];
// 设置HTTP头信息
NSString *boundary = [[NSProcessInfo processInfo] globallyUniqueString];
NSString *boundaryString = [NSString stringWithFormat:
@"multipart/form-data; boundary=%@", boundary];
[request addValue: boundaryString forHTTPHeaderField: @"Content-Type"];
// 根据REST协议指定HTTPMethod为POST
[request setHTTPMethod:@"GET"];
NSURLResponse *response = nil;
NSError *error = nil;
// 发出同步请求
NSData *result = [NSURLConnection sendSynchronousRequest:request
returningResponse:&response error:&error];
[request release];
// 发生错误
if (error) {
UIAlertView *errorAlertView = [[UIAlertView alloc] initWithTitle:@"Error"
message:[error localizedDescription]
delegate:nil
cancelButtonTitle:@"Close"
otherButtonTitles:nil];
[errorAlertView show];
[errorAlertView release];
}
// 返回的结果,其中包含JSON格式的所要获取的数据
NSString *resultString = [[NSString alloc] initWithData:result
encoding:NSUTF8StringEncoding];
NSLog(resultString);
NSData *resultData = [resultString dataUsingEncoding:NSUTF32BigEndianStringEncoding];
// 这里是获取多行数据,所以采用数组的格式
NSArray *resultArray = [[CJSONDeserializer deserializer]
deserializeAsArray:resultData error:&error];
// 逐个解析数组中的数据然后转换成MessageEntity对象。
for (NSDictionary *dictionary in resultArray) {
MessageEntity *messageEntity = [MessageEntity deserializeWithDictionary:dictionary];
[_messageArray addObject:messageEntity];
}
[resultString release];
转自:http://hi.baidu.com/%B0%B5%D2%B9%B6%BC%BE%F4/blog/item/e08c1835941a07bbd1a2d30b.html
- 基于REST协议实现iPhone和Google App Engine之间的通信
- 基于Google App Engine和Django的Hello World
- 使用 Google App Engine 实现基于云计算的小型 Java 数据服务应用
- 基于Google App Engine 的Adsense投放监控系统
- google app engine 实现的网络硬盘,支持外链、权限管理和批量上传
- Google App Engine的安装
- Google App Engine 碰到的
- 基于TCP协议实现服务器和客户端的通信程序
- Google App Engine 支持的语言列表和资源
- Google App Engine 学习和实践
- Google App Engine上传和显示图片
- Google App Engine 学习和实践
- Google App Engine 学习和实践
- 基于TCP协议的简单通信实现
- 基于http协议通信的APP安全策略的一点思考
- 基于服务端和客户端之间的通信
- 搜集的一些Google App Engine应用
- 搜集的一些Google App Engine应用
- http协议详解
- WIFI power save 模式下的数据收发
- 海量查询数据优化方案
- 手动搭建WAMP环境 php5 mysql5 apache2 for windows xp
- 插件19:GIF文本
- 基于REST协议实现iPhone和Google App Engine之间的通信
- 使用 Git 管理源代码
- javascript学习笔记
- perl的数据类型
- sqlplus连接远程Oracle
- 实时数据库简介
- 计算机常用端口
- 线程通信,wait()与notify()的运用
- WIFI参数Beacon Interval、DTIM、Fragment Length、RTS Length