使用AFHTTPSessionManager的原始XML Post

时间:2017-01-18 10:45:57

标签: objective-c cordova afnetworking afhttpsessionmanager

如何使用extension String { func isInt() -> Bool { if let intValue = Int(self) { if intValue >= 0 { return true } } return false } func numberOfCharacters() -> Int { return self.characters.count } } 将原始XML帖子发送到SOAP接口?以下代码是来自https://github.com/wymsee/cordova-HTTP/blob/master/src/ios/CordovaHttpPlugin.m#L69的分支:

AFHTTPSessionManager

这会将AFHTTPSessionManager *manager = [AFHTTPSessionManager manager]; manager.securityPolicy = securityPolicy; NSString *url = [command.arguments objectAtIndex:0]; NSDictionary *parameters = [command.arguments objectAtIndex:1]; NSDictionary *headers = [command.arguments objectAtIndex:2]; [self setRequestHeaders: headers forManager: manager]; CordovaHttpPlugin* __weak weakSelf = self; manager.responseSerializer = [TextResponseSerializer serializer]; [manager POST:url parameters:parameters progress:nil success:^(NSURLSessionTask *task, id responseObject) { NSMutableDictionary *dictionary = [NSMutableDictionary dictionary]; [self setResults: dictionary withTask: task]; [dictionary setObject:responseObject forKey:@"data"]; CDVPluginResult *pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsDictionary:dictionary]; [weakSelf.commandDelegate sendPluginResult:pluginResult callbackId:command.callbackId]; } failure:^(NSURLSessionTask *task, NSError *error) { NSMutableDictionary *dictionary = [NSMutableDictionary dictionary]; [self setResults: dictionary withTask: task]; NSString* errResponse = [[NSString alloc] initWithData:(NSData *)error.userInfo[AFNetworkingOperationFailingURLResponseDataErrorKey] encoding:NSUTF8StringEncoding]; [dictionary setObject:errResponse forKey:@"error"]; CDVPluginResult *pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_ERROR messageAsDictionary:dictionary]; [weakSelf.commandDelegate sendPluginResult:pluginResult callbackId:command.callbackId]; }]; 发布到给定(肥皂)网址。是否可以更改请求以便将multipart/form-data发送给原始主体?

谢谢!

1 个答案:

答案 0 :(得分:1)

我想出了以下问题的解决方案:

NSString * url = [command.arguments objectAtIndex:0];     NSData * body = [[command.arguments objectAtIndex:2] dataUsingEncoding:NSUTF8StringEncoding];     NSDictionary * headers = [command.arguments objectAtIndex:3];

CordovaHttpPlugin* __weak weakSelf = self;
AFURLSessionManager *manager = [[AFURLSessionManager alloc] initWithSessionConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]];

NSMutableURLRequest *req = [[AFHTTPRequestSerializer serializer] requestWithMethod:@"POST" URLString:url parameters:nil error:nil];
[req setValue:@"text/xml" forHTTPHeaderField:@"Content-Type"];
[req setValue:@"text/xml" forHTTPHeaderField:@"Accept"];
[req setHTTPBody:body];

manager.responseSerializer = [AFHTTPResponseSerializer serializer];

// Append headers
for (NSString* key in headers) {
    NSString *value = [headers objectForKey:key];
    [req setValue:value forHTTPHeaderField:key];
}

[[manager dataTaskWithRequest:req completionHandler:^(NSURLResponse * _Nonnull response, id  _Nullable responseObject, NSError * _Nullable error) {

    NSDictionary *responseHeaders = [(NSHTTPURLResponse *)response allHeaderFields];
    long status = (long) [(NSHTTPURLResponse *) response statusCode];
    NSLog(@"Status: %ld", status);

    NSMutableDictionary *dictionary = [NSMutableDictionary dictionary];
    [dictionary setObject:[NSNumber numberWithInteger:status] forKey:@"status"];
    [dictionary setObject:responseHeaders forKey:@"headers"];

    if (!error) {
        NSString *responseString = [[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding];
        NSLog(@"POST SUCCESS: %@", responseString);
        //[self setResults: dictionary withTask: task];

        [dictionary setObject:responseString forKey:@"data"];

        CDVPluginResult *pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsDictionary:dictionary];
        [weakSelf.commandDelegate sendPluginResult:pluginResult callbackId:command.callbackId];
    } else {
        //[self setResults: dictionary withTask: task];
        NSString* errResponse = [[NSString alloc] initWithData:(NSData *)error.userInfo[AFNetworkingOperationFailingURLResponseDataErrorKey] encoding:NSUTF8StringEncoding];

        [dictionary setObject:errResponse forKey:@"error"];

        CDVPluginResult *pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_ERROR messageAsDictionary:dictionary];
        [weakSelf.commandDelegate sendPluginResult:pluginResult callbackId:command.callbackId];
    }
}] resume];