Navigation Menu

Skip to content

Instantly share code, notes, and snippets.

@jpmhouston
Created June 19, 2015 16:18
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save jpmhouston/daa75345f6a017ce1681 to your computer and use it in GitHub Desktop.
Save jpmhouston/daa75345f6a017ce1681 to your computer and use it in GitHub Desktop.
POST with both URL parameters & JSON body in AFNetworking
@interface MixedPOSTHTTPSessionManager : AFHTTPSessionManager
- (NSURLSessionDataTask *)POST:(NSString *)URLString
parameters:(id)parameters
JSONParameters:(NSDictionary *)jsonParameters
success:(void (^)(NSURLSessionDataTask *task, id responseObject))success
failure:(void (^)(NSURLSessionDataTask *task, NSError *error))failure;
@end
@implementation MixedPOSTHTTPSessionManager
- (instancetype)initWithBaseURL:(NSURL *)url sessionConfiguration:(NSURLSessionConfiguration *)configuration
{
self = [super initWithBaseURL:url sessionConfiguration:configuration];
if (self) {
// make request serializer able to put parameters into the URL query of POST requests
self.requestSerializer.HTTPMethodsEncodingParametersInURI = [self.requestSerializer.HTTPMethodsEncodingParametersInURI setByAddingObject:@"POST"];
}
return self;
}
- (NSURLSessionDataTask *)POST:(NSString *)URLString parameters:(id)parameters JSONParameters:(NSDictionary *)JSONParameters
success:(void (^)(NSURLSessionDataTask *task, id responseObject))success
failure:(void (^)(NSURLSessionDataTask *task, NSError *error))failure
{
NSError *serializationError = nil;
NSMutableURLRequest *request = [self.requestSerializer requestWithMethod:@"POST" URLString:[[NSURL URLWithString:URLString relativeToURL:self.baseURL] absoluteString] parameters:parameters error:&serializationError];
if (!request) {
if (failure) {
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wgnu"
dispatch_async(self.completionQueue ?: dispatch_get_main_queue(), ^{
failure(nil, serializationError);
});
#pragma clang diagnostic pop
}
return nil;
}
// maybe support passing in array as well as dict?
//if (JSONParameters && ([JSONParameters isKindOfClass:[NSDictionary class]] || [JSONParameters isKindOfClass:[NSArray class]]) && [JSONParameters count] > 0)
if (JSONParameters && JSONParameters.count > 0) {
NSData *bodyData = [NSJSONSerialization dataWithJSONObject:JSONParameters options:0 error:&serializationError];
if (!bodyData) {
if (failure) {
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wgnu"
dispatch_async(self.completionQueue ?: dispatch_get_main_queue(), ^{
failure(nil, serializationError);
});
#pragma clang diagnostic pop
}
return nil;
}
[request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
request.HTTPBody = bodyData;
}
__block NSURLSessionDataTask *dataTask = nil;
dataTask = [self dataTaskWithRequest:request completionHandler:^(NSURLResponse * __unused response, id responseObject, NSError *error) {
if (error) {
if (failure) {
failure(dataTask, error);
}
} else {
if (success) {
success(dataTask, responseObject);
}
}
}];
[dataTask resume];
return dataTask;
}
@end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment