consuming restful web service in iOS 5

2019-08-23 10:15发布

In my first ViewController (MonitorViewController) this is in the interface file MonitorViewController.h:

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

In MonitorViewController.m ViewDidLoad method, I have this at the end:

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];

The implementation of delegate methods in 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");
}

My AppDelegate method DidFinishLaunchingWithOptions method only returns YES and nothing else.

1条回答
ゆ 、 Hurt°
2楼-- · 2019-08-23 10:31

I recommend using RestKit framework. With restkit, you simply do:

// 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"];

And then, in the delegate method:

- (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
}

So you will never need to send the parameters that are not used on the server side, just to distinguish your requests. Additionally, the RKRequest class has lots of other properties that you can use to check which request corresponds to the given response. But if you send a bunch of identical requests, I think the userData is the best solution.

RestKit will also help you with other common rest interface tasks.

查看更多
登录 后发表回答