繁体   English   中英

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

[英]How to set the HTTP body for a request using AFNetworking?

在AFNetworking的早期版本中,如果必须创建自己的自定义客户端,那么我将简单地从AFHTTPClient继承并创建我的方法。 相信在AFNetworking 2.0中,我需要继承自AFHTTPSessionManager。

@interface MyCustomClient : AFHTTPSessionManager
    {

    }

在我的情况下,我需要以肥皂的形式发送请求。 这意味着HTTP正文将为soap,而HTTP HEADERS将为text / xml。

假设我有一个变量,其中包含需要发送到服务器的整个肥皂主体。

NSString *soapBody = @"Soap body";

使用上面定义的自定义类继承自AFHTTPSessionManager,我将如何将soap主体设置为Request HTTPBody。

如果仍然可以从AFHTTPSessionManager内部访问NSURLRequest,那么我可以简单地执行setHTTPBody,但似乎没有?

我希望我现在明白了!

您应该创建一个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];

希望对您有帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM