Objective-C通过AFN使用Soap来请求webServ

2017-08-25  本文已影响229人  达菲栀子

公共方法

/**
 *  请求SOAP,返回NSData
 *
 *  @param url      请求地址
 *  @param soapBody soap的XML中方法和参数段
 *  @param success  成功block
 *  @param failure  失败block
 */
+ (void)SOAPData:(NSString *)url soapBody:(NSString *)soapBody success:(void (^)(id responseObject))success failure:(void(^)(NSError *error))failure {
    
    NSString *soapStr = [NSString stringWithFormat:
                         @"<?xml version=\"1.0\" encoding=\"utf-8\"?>\
                         <soap:Envelope xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\"\
                         xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\">\
                         <soap:Header>\
                         </soap:Header>\
                         <soap:Body>%@</soap:Body>\
                         </soap:Envelope>",soapBody];
    
    AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
    manager.responseSerializer = [AFXMLParserResponseSerializer serializer];
    // 设置请求超时时间
    manager.requestSerializer.timeoutInterval = 30;
    // 返回NSData
    manager.responseSerializer = [AFHTTPResponseSerializer serializer];
    // 设置请求头,也可以不设置---这里注意服务器数据类型
    [manager.requestSerializer setValue:@"text/xml; charset=utf-8" forHTTPHeaderField:@"Content-Type"];
    // 设置HTTPBody
    [manager.requestSerializer setQueryStringSerializationWithBlock:^NSString *(NSURLRequest *request, NSDictionary *parameters, NSError *__autoreleasing *error) {
        return soapStr;
    }];
    
    [manager POST:url parameters:soapStr success:^(NSURLSessionDataTask * _Nonnull task, id  _Nonnull responseObject) {
        // 把返回的二进制数据转为字符串
        NSString *result = [[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding];
        // 利用正则表达式取出<GetInventoryListResult></GetInventoryListResult>之间的字符串
        NSRegularExpression *regular = [[NSRegularExpression alloc] initWithPattern:@"(?<=GetInventoryListResult\\>).*(?=</GetInventoryListResult>)" options:NSRegularExpressionCaseInsensitive error:nil];
        NSDictionary *dict = [NSDictionary dictionary];
        for (NSTextCheckingResult *checkingResult in [regular matchesInString:result options:0 range:NSMakeRange(0, result.length)]) {
            // 得到字典
            dict = [NSJSONSerialization JSONObjectWithData:[[result substringWithRange:checkingResult.range] dataUsingEncoding:NSUTF8StringEncoding] options:NSJSONReadingMutableLeaves error:nil];
        }
        // 请求成功并且结果有值把结果传出去
        if (success && dict) {
            success(dict);
        }
    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
        if (failure) {
            failure(error);
        }
    }];
}

调用传参

 NSString *bodyString =  [NSString stringWithFormat:
                                 @"<GetInventoryList xmlns=\"http://WmsService/\">\
                                 <materialRequisitionNum>%@</materialRequisitionNum>\
                                 </GetInventoryList>",self.beforeSelectedMaterialNum];
        
        [LSHttpTool SOAPData:PiKingKB_getSLDetail soapBody:bodyString success:^(id responseObject) {
            NSLog(@"%@", responseObject);
        } failure:^(NSError *error) {
            NSLog(@"%@", error);
        }];

通过正则表达式取出XML节点数据,正则表达式:(?<=GetInventoryListResult\>).*(?=</GetInventoryListResult>)

NSString *result = [[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding];
        // 利用正则表达式取出<GetInventoryListResult></GetInventoryListResult>之间的字符串
        NSRegularExpression *regular = [[NSRegularExpression alloc] initWithPattern:@"(?<=GetInventoryListResult\\>).*(?=</GetInventoryListResult>)" options:NSRegularExpressionCaseInsensitive error:nil];
        NSDictionary *dict = [NSDictionary dictionary];
        for (NSTextCheckingResult *checkingResult in [regular matchesInString:result options:0 range:NSMakeRange(0, result.length)]) {
            // 得到字典
            dict = [NSJSONSerialization JSONObjectWithData:[[result substringWithRange:checkingResult.range] dataUsingEncoding:NSUTF8StringEncoding] options:NSJSONReadingMutableLeaves error:nil];
        }
将要被取出的XML数据
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<soap:Body>
<GetInventoryListResponse xmlns="http://WmsService/">
<GetInventoryListResult>
[
{"Guid":"AD6BE916-D7A6-47D9-A54B-30D99FAEA84D","FManuOrder":"SDCM170718003","ImaterialRequisitionNum":"REO17071700022","IquantityRequired":2.71,"Iunit":"PCS","MaterieId":"582-A210172","OweMaterialQty":2.71,"StorageId":"3955","StorageName":"LS_HD-WIP-A-1-03","StoreaeQty":100.0000},
{"Guid":"82778F24-5071-4521-9BD0-A3218E799154","FManuOrder":"SDCM170718003","ImaterialRequisitionNum":"REO17071700022","IquantityRequired":8.13,"Iunit":"PCS","MaterieId":"582-A210140","OweMaterialQty":8.13,"StorageId":"3957","StorageName":"LS_HD-WIP-A-1-05","StoreaeQty":100.0000},
{"Guid":"BE98835F-F1A7-4B6C-B8C8-6827AAFD2DF7","FManuOrder":"SDCM170718003","ImaterialRequisitionNum":"REO17071700022","IquantityRequired":10.16,"Iunit":"PCS","MaterieId":"581-A130112","OweMaterialQty":10.16,"StorageId":"3959","StorageName":"LS_HD-WIP-A-1-07","StoreaeQty":100.0000}
]
</GetInventoryListResult>
</GetInventoryListResponse>
</soap:Body>
</soap:Envelope>
上一篇 下一篇

猜你喜欢

热点阅读