如何使用AFNetworking为请求设置HTTP正文?

在AFNetworking的早期版本中,如果我不得不自己定制客户端,那么我只需从AFHTTPClientinheritance并创build我的方法。 在AFNetworking 2.0中,我相信我需要从AFHTTPSessionManagerinheritance。

@interface MyCustomClient : AFHTTPSessionManager { } 

在我的情况下,我需要发送请求作为肥皂。 这意味着HTTP Body将是soap和HTTP HEADERS将是text / xml。

比方说,我有一个variables,其中包含我需要发送到服务器的整个肥皂身体。

 NSString *soapBody = @"Soap body"; 

使用上面定义的自定义类inheritance自AFHTTPSessionManager,我将如何设置肥皂主体为Request HTTPBody。

如果无论如何要从AFHTTPSessionManager中访问NSURLRequest,那么我可以简单地做setHTTPBody,但似乎没有?

我希望我现在有道理!

您应该创build一个AFHTTPRequestSerializer的子类,然后实现协议AFURLRequestSerialization,这个类将关心添加正文和头到请求

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

您可以阅读实现或其他AFHTTPRequestSerializer子类https://github.com/AFNetworking/AFNetworking/blob/master/AFNetworking/AFURLRequestSerialization.m#L1094

初始化一个NSMutableURLRequest *请求; 并通过设置httpBody来请求: [request setHTTPBody:[soapMessage dataUsingEncoding:NSUTF8StringEncoding]];

你可以试试这个代码。

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

希望它能帮助你。