Vital extensions to NSURLRequest that Apple left out for some reason.
NSMutableURLRequest *rq = [OMGHTTPURLRQ GET:@"http://api.com":@{@"key": @"value"}]; // application/x-www-form-urlencoded NSMutableURLRequest *rq = [OMGHTTPURLRQ POST:@"http://api.com":@{@"key": @"value"}]; // application/json NSMutableURLRequest *rq = [OMGHTTPURLRQ POST:@"http://api.com" JSON:@{@"key": @"value"}]; // PUT NSMutableURLRequest *rq = [OMGHTTPURLRQ PUT:@"http://api.com":@{@"key": @"value"}]; // DELETE NSMutableURLRequest *rq = [OMGHTTPURLRQ DELETE:@"http://api.com":@{@"key": @"value"}];You can then pass these to an NSURLConnection or NSURLSession.
OMG! Constructing multipart/form-data for POST requests is complicated, let us do it for you:
OMGMultipartFormData *multipartFormData = [OMGMultipartFormData new]; NSData *data1 = [NSData dataWithContentsOfFile:@"myimage1.png"]; [multipartFormData addFile:data1 parameterName:@"file1" filename:@"myimage1.png" contentType:@"image/png"]; // Ideally you would not want to re-encode the PNG, but often it is // tricky to avoid it. UIImage *image2 = [UIImage imageNamed:@"image2"]; NSData *data2 = UIImagePNGRepresentation(image2); [multipartFormData addFile:data2 parameterName:@"file2" filename:@"myimage2.png" contentType:@"image/png"]; // SUPER Ideally you would not want to re-encode the JPEG as the process // is lossy. If your image comes from the AssetLibrary you *CAN* get the // original `NSData`. See stackoverflow.com. UIImage *image3 = [UIImage imageNamed:@"image3"]; NSData *data3 = UIImageJPEGRepresentation(image3); [multipartFormData addFile:data3 parameterName:@"file2" filename:@"myimage3.jpeg" contentType:@"image/jpeg"]; NSMutableURLRequest *rq = [OMGHTTPURLRQ POST:url:multipartFormData];Now feed rq to [NSURLConnection sendSynchronousRequest:returningResponse:error:.
If you need to use NSURLSession’s uploadTask: but you have become frustrated because your endpoint expects a multipart/form-data POST request and NSURLSession sends the data raw, use this:
id config = [NSURLSessionConfiguration backgroundSessionConfigurationWithIdentifier:someID]; id session = [NSURLSession sessionWithConfiguration:config delegate:someObject delegateQueue:[NSOperationQueue new]]; OMGMultipartFormData *multipartFormData = [OMGMultipartFormData new]; [multipartFormData addFile:data parameterName:@"file" filename:nil contentType:nil]; NSURLRequest *rq = [OMGHTTPURLRQ POST:urlString:multipartFormData]; id path = [[NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject] stringByAppendingPathComponent:@"upload.NSData"]; [rq.HTTPBody writeToFile:path atomically:YES]; [[session uploadTaskWithRequest:rq fromFile:[NSURL fileURLWithPath:path]] resume];If you just need a sensible UserAgent string for your application you can pod OMGHTTPURLRQ/UserAgent and then:
#import <OMGHTTPURLRQ/OMGUserAgent.h> NSString *userAgent = OMGUserAgent();OMGHTTPURLRQ adds this User-Agent to all requests it generates automatically.
So for URLRequests generated other than by OMGHTTPURLRQ you would do:
[someURLRequest addValue:OMGUserAgent() forHTTPHeaderField:@"User-Agent"];You need an OAuth library, here we use the TDOAuth pod. You also need your API keys that registering at https://dev.twitter.com will provide you.
NSMutableURLRequest *rq = [TDOAuth URLRequestForPath:@"/oauth/request_token" POSTParameters:@{@"x_auth_mode" : @"reverse_auth"} host:@"api.twitter.com" consumerKey:APIKey consumerSecret:APISecret accessToken:nil tokenSecret:nil]; [rq addValue:OMGUserAgent() forHTTPHeaderField:@"User-Agent"]; [NSURLConnection sendAsynchronousRequest:rq queue:nil completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) { id oauth = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; SLRequest *reverseAuth = [SLRequest requestForServiceType:SLServiceTypeTwitter requestMethod:SLRequestMethodPOST URL:[NSURL URLWithString:@"https://api.twitter.com/oauth/access_token"] parameters:@{ @"x_reverse_auth_target": APIKey, @"x_reverse_auth_parameters": oauth }]; reverseAuth.account = account; [reverseAuth performRequestWithHandler:^(NSData *data, NSHTTPURLResponse *urlResponse, NSError *error) { id creds = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; id credsDict = [NSMutableDictionary new]; for (__strong id pair in [creds componentsSeparatedByString:@"&"]) { pair = [pair componentsSeparatedByString:@"="]; credsDict[pair[0]] = pair[1]; } NSLog(@"%@", credsDict); }]; }];