IOS:SOAP(Webservice)请求基于AFN2.6之后

在网上找了很久关于SOAP的请求,然而发现网上全是基于2.0之后封装的。只好自己去做个基于2.6以后 也就是基于AFHTTPSessionManager 请求,2.6以前自行百度好多

//首先创建个自己的类,继承NSObject
//导入
#import <AFNetworking.h>
#import <commoncrypto/CommonCrypto.h>
/**
 *  SOAP请求 接口 并不是完整封装需要自己去改
 *
 */
+ (void)getSOAPUrl:(NSMutableDictionary *)paraDic success:(void (^)(id responseObject))success failure:(void(^)(NSError *error))failure{
      //请求接口
    NSString *url = [NSString stringWithFormat:@"%@%@",NEWS_List,Path_WebService_CmsWs];
    // 得到发送数据长度
    NSString * postData = [self getSOAPXML:Soap_MethodName soapAction:Soap_NameSpace paraDic:paraDic];

    NSString *msgLength = [NSString stringWithFormat:@"%ld", (unsigned long)[postData length]];
     AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
    manager.responseSerializer = [[AFHTTPResponseSerializer alloc] init];
    NSLog(@"manager.responseSerializer = %@", manager.responseSerializer);

    [manager.requestSerializer setValue:@"application/soap+xml; charset=utf-8" forHTTPHeaderField:@"Content-Type"];
    //这么写应该几乎全都支持了,遇到的坑,刚开始返回失败,返回信息会提示text/xml,网上会说text/html,并没效果,然而官方提示少text/xml,添加上以后可以请求了
     [manager.responseSerializer setAcceptableContentTypes:[NSSet setWithObjects:@"text/html", @"application/json", @"text/json", @"text/javascript",@"text/css", @"text/plain", @"application/x-javascript", @"application/javascript",@"application/soap+xml",@"text/xml",nil]];
    [manager.requestSerializer setValue:msgLength forHTTPHeaderField:@"Content-Length"];
    // 设置HTTPBody AFN3.0后唯一方法
    [manager.requestSerializer setQueryStringSerializationWithBlock:^NSString *(NSURLRequest *request, NSDictionary *parameters, NSError *__autoreleasing *error) {
        return postData;
    }];

    [manager POST:url parameters:paraDic progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
        //把返回的二进制数据转为字符串
        NSString *result = [[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding];
        // 利用正则表达式取出<return></return>之间的字符串
        NSRegularExpression *regular = [[NSRegularExpression alloc] initWithPattern:@"(?<=return\\>).*(?=</return)" 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) {
        failure(error);
    }];
}
+ (NSString *)getSOAPXML:(NSString *)soapNameSpace soapAction:(NSString *)soapAction paraDic:(NSDictionary *)paraDic {

    NSMutableString *soapXml = [NSMutableString string];

    [soapXml appendString:@"<?xml version=\"1.0\" encoding=\"utf-8\"?>\n"];

    // Sopa Header
    //有的时候可能是2001根据需要吧
    [soapXml appendString:@"<soap:Envelope xmlns:xsi=\"http://www.w3.org/1999/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/1999/XMLSchema\" xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\">\n"];
       // Soap Body
    [soapXml appendString:@"<soap:Body>\n"];

    // Soap Function
    [soapXml appendString:[NSString stringWithFormat:@"<n0:%@ xmlns:n0=\"%@\">\n", soapAction,soapNameSpace]];

    // Data-根据自己需要去添加
    if (paraDic != nil && [paraDic count] > 0) {
        // Add Data
        NSArray *keys = [paraDic allKeys];

        NSString * key;
        NSString * value;

        for (int i = 0; i < [keys count]; i++)
        {
            key = [keys objectAtIndex:i];
            value = [paraDic objectForKey:key];

            // Name
            [soapXml appendString:[NSString stringWithFormat:@"<%@>",key]];

            // Data
            //    &lt;
            //
            //    <
            //
            //    小于号
            value = [value stringByReplacingOccurrencesOfString:@"<" withString:@"&lt;"];

            //
            //    &gt;
            //
            //    >
            //
            //    大于号
            value = [value stringByReplacingOccurrencesOfString:@">" withString:@"&gt;"];

            [soapXml appendString:value];

            // Name End
            [soapXml appendString:[NSString stringWithFormat:@"</%@>\n",key]];
        }
    }

    // Soap Function End
    [soapXml appendString:[NSString stringWithFormat:@"</n0:%@>\n", soapAction]];

    // Soap Body End
    [soapXml appendString:@"</soap:Body>\n"];

    // Sopa Header End
    [soapXml appendString:@"</soap:Envelope>\n"];

//    NSData *resultData;
//    
//    resultData = [soapXml dataUsingEncoding:NSUTF8StringEncoding];

    return soapXml;
}

本人依然还在学习,不足之处请多多指教,共同交流学习
git:https://github.com/SpadeZach/SOAP.git

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值