Reputation: 9662
In the early versions of AFNetworking if I had to make my own custom client then I would simply inherit from AFHTTPClient and create my methods. In AFNetworking 2.0 I believe I need to inherit from AFHTTPSessionManager.
@interface MyCustomClient : AFHTTPSessionManager
{
}
In my situation I need to send in request as soap. This means that HTTP Body will be soap and HTTP HEADERS will be text/xml.
Let's say I have a variable which contains the entire soap body I need to send to the server.
NSString *soapBody = @"Soap body";
Using my custom class defined above which inherits from AFHTTPSessionManager how will I set the soap body to the Request HTTPBody.
If there is anyway to access NSURLRequest from inside the AFHTTPSessionManager then I can simply do setHTTPBody but it seems there is not?
I hope I am making sense now!
Upvotes: 0
Views: 5361
Reputation: 5148
Init a NSMutableURLRequest *request; and set httpBody to request by:
[request setHTTPBody:[soapMessage dataUsingEncoding:NSUTF8StringEncoding]];
You can try this code.
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:requestURL]];
request.HTTPMethod = @"POST";
[request setValue:@"application/soap+xml;charset = utf-8" forHTTPHeaderField:@"Content-Type"];
request.HTTPBody = [soapMessage dataUsingEncoding:NSUTF8StringEncoding];
NSURLSession *session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration] delegate:self delegateQueue:nil];
NSURLSessionDataTask *sessionTask = [session dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
if (!error) {
// parse response here
} else {
// error
}
}];
[sessionTask resume];
hope it help You.
Upvotes: 3
Reputation: 402
You should create a subclass of AFHTTPRequestSerializer, then implement the protocol AFURLRequestSerialization, this class is going to care about adding the body and headers to the request
- (NSURLRequest *)requestBySerializingRequest:(NSURLRequest *)request
withParameters:(id)parameters
error:(NSError * __autoreleasing *)error
{
NSParameterAssert(request);
if ([self.HTTPMethodsEncodingParametersInURI containsObject:[[request HTTPMethod] uppercaseString]]) {
return [super requestBySerializingRequest:request withParameters:parameters error:error];
}
NSMutableURLRequest *mutableRequest = [request mutableCopy];
[self.HTTPRequestHeaders enumerateKeysAndObjectsUsingBlock:^(id field, id value, BOOL * __unused stop) {
if (![request valueForHTTPHeaderField:field]) {
[mutableRequest setValue:value forHTTPHeaderField:field];
}
}];
[mutableRequest setValue:@"application/soap+xml; charset=utf-8" forHTTPHeaderField:@"Content-Type"];
[mutableRequest setHTTPBody:@"This is the soap Body!!"];
return mutableRequest;
}
You can read the implementation or other AFHTTPRequestSerializer subclasses https://github.com/AFNetworking/AFNetworking/blob/master/AFNetworking/AFURLRequestSerialization.m#L1094
Upvotes: 6