在iOS 5中使用宁静的Web服务

时间:2012-02-20 10:55:43

标签: ios json asynchronous

在我的第一个ViewController(MonitorViewController)中,这是在接口文件MonitorViewController.h中:

#import <RestKit/RestKit.h>
@interface MonitorViewController : UIViewController <RKRequestDelegate>

在MonitorViewController.m ViewDidLoad方法中,我最后有这个:

RKClient* client = [RKClient clientWithBaseURL:@"http://192.168.2.3:8000/DataRecorder/ExternalControl"]; 
NSLog(@"I am your RKClient singleton : %@", [RKClient sharedClient]);
[client get:@"/json/get_Signals" delegate:self];

MonitorViewController.m中委托方法的实现:

- (void) request: (RKRequest *) request didLoadResponse: (RKResponse *) response {
    if ([request isGET]) {        
        NSLog (@"Retrieved : %@", [response bodyAsString]);
    }
}

- (void) request:(RKRequest *)request didFailLoadWithError:(NSError *)error
{
    NSLog (@"Retrieved an error");  
}

- (void) requestDidTimeout:(RKRequest *)request
{
    NSLog(@"Did receive timeout");
}

- (void) request:(RKRequest *)request didReceivedData:(NSInteger)bytesReceived totalBytesReceived:(NSInteger)totalBytesReceived totalBytesExectedToReceive:(NSInteger)totalBytesExpectedToReceive
{
    NSLog(@"Did receive data");
}

我的AppDelegate方法DidFinishLaunchingWithOptions方法只返回YES而没有别的。

1 个答案:

答案 0 :(得分:0)

我建议使用RestKit framework。使用restkit,您只需执行以下操作:

// create the parameters dictionary for the params that you want to send with the request
NSDictionary* paramsDictionary = [NSDictionary dictionaryWithObjectsAndKeys: @"00003",@"SignalId", nil];
// send your request
RKRequest* req = [client post:@"your/resource/path" params:paramsDictionary delegate:self];
// set the userData property, it can be any object
[req setUserData:@"SignalId = 00003"];

然后,在委托方法中:

- (void)request:(RKRequest *)request didLoadResponse:(RKResponse *)response {
    // check which request is responsible for the response
    // to achieve this, you can do two things
    // check the parameters of the request like this
    NSLog(@"%@", [request URL]); // this will print your request url with the parameters
    // something like http://myamazingrestservice.org/resource/path?SignalId=00003
    // the second option will work if your request is not a GET request
    NSLog(@"%@", request.params); // this will print paramsDictionary
    // or you can get it from userData if you decide to go this way
    NSString* myData = [request userData];
    NSLog(@"%@", myData); // this will log "SignalId = 00003" in the debugger console
}

因此,您永远不需要发送服务器端未使用的参数,只是为了区分您的请求。此外,RKRequest类还有许多其他属性可用于检查哪个请求对应于给定的响应。但是如果你发送了大量相同的请求,我认为 userData 是最好的解决方案。

RestKit还将帮助您完成其他常见的休息接口任务。