Picture of Brian Love wearing black against a dark wall in Portland, OR.

Brian Love

Setting custom HTTP request headers with RestKit

RestKit is a great REST framework for Objective-C whose goal is to simplify consuming and modeling of RESTful APIs.

I am using RestKit in an application that is synchronizing data between the client application and a remote server. I want to specify a custom HTTP header when sending the request to the remote server. With RestKit, it’s actually really easy, but I wanted to document it here.

This assumes that you have already performed the initialization of the RestKit client, which is an instance of the RKObject class. In my project, I am using the object manager for mapping between the data payloads and Objective-C objects, so I will get access to the client instance through the shared object manager singleton. The first step is to get access to this client:

RKObjectManager *objectManager = [RKObjectManager sharedManager];
RKClient *client = objectManager.client;

Then, it’s as simple as calling the client’s setValue:forHTTPHeaderField: method:

[client setValue:[NSString stringWithFormat:@"%d", [lastUpdated intValue]] forHTTPHeaderField:@"X-RESTKIT-LASTUPDATED"];

Here, I am using the lastUpdated NSNumber, which I am creating a string from the integer value. This is a unix timestamp that I am going to send to my REST service for determining the last time the client was updated, so I can just send the records that have been updated since then. I am setting the value for the HTTP header called “X-RESTKIT-LASTUPDATED”. Pretty easy, thanks to RestKit.

Setting HTTP Request header without using RestKit

RestKit does a nice job ofabstracting the details of using the native NSURLRequest and NSURLConnection classes. But, what if we were doing the request manually without using RestKit. Well, it’s actually still fairly easy to set a custom HTTP request header. First, we will create a new NSURLRequest, which we will use for creating the NSURLConnection.

NSString *myServerUrl = @"http://brianflove.com";
NSMutableURLRequest *request =[NSMutableURLRequest requestWithURL:[NSURL URLWithString:[myServerUrl stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]] cachePolicy:NSURLRequestReloadIgnoringLocalCacheData timeoutInterval:60.0];
[request setValue:[NSString stringWithFormat:@"%d", [lastUpdated intValue]] forHTTPHeaderField:@"X-LASTUPDATED"];

We then use the request object to create the NSURLConnection and fire off the request:

NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:request delegate:self];