基于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

原创粉丝点击