iOS 通過(guò) soap 請(qǐng)求調(diào)用地址為 asmx 或 wsdl 服務(wù)器上的接口

平時(shí)調(diào)接口都是直接用 AFN 把接口地址放到 post 方法中就可以獲取到需要的數(shù)據(jù),但如何調(diào)用 java或.net 的 webservice 接口,以登錄方法為例:

地址是asmx的:

22.png

這時(shí)候需要通過(guò) AFN 發(fā)送 soap 請(qǐng)求。

  1. 構(gòu)建 soap 請(qǐng)求體
NSString *soapbody = [[NSString alloc] init];
    for(NSString *str in pratams.allKeys)
    {
        soapbody = [soapbody stringByAppendingString:[NSString stringWithFormat:@"<%@>%@</%@>\\",str,[pratams objectForKey:str],str]];
    }

2.根據(jù)后臺(tái)soap格式,拼接 soap 字符串(命名空間可能需要修改 )

    //使用命名空間: http://tempuri.org/
    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>\
                         <%@ xmlns=\"http://tempuri.org/\">\
                         %@\
                         </%@>\
                         </soap:Body>\
                         </soap:Envelope>",soapMethod,soapbody,soapMethod];
  1. 對(duì) AFN 相關(guān)參數(shù)進(jìn)行設(shè)置
AFHTTPSessionManager *manager = [ AppDelegate shareManager];
    manager.responseSerializer = [AFXMLParserResponseSerializer serializer];
    // 設(shè)置請(qǐng)求超時(shí)時(shí)間
    manager.requestSerializer.timeoutInterval = 10;
    // 返回NSData
    manager.responseSerializer = [AFHTTPResponseSerializer serializer];
    // 設(shè)置請(qǐng)求頭,也可以不設(shè)置
    [manager.requestSerializer setValue:@"text/xml; charset=utf-8" forHTTPHeaderField:@"Content-Type"];
    [manager.requestSerializer setValue:[NSString stringWithFormat:@"%zd", soapStr.length] forHTTPHeaderField:@"Content-Length"];
    // 設(shè)置HTTPBody
    [manager.requestSerializer setQueryStringSerializationWithBlock:^NSString *(NSURLRequest *request, NSDictionary *parameters, NSError *__autoreleasing *error) {
        return soapStr;
    }];
  1. post 方法
 [manager POST:@"地址" parameters:soapStr progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
        // 把返回的二進(jìn)制數(shù)據(jù)轉(zhuǎn)為字符串
        NSString *result = [[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding];
        // 利用正則表達(dá)式取出<return></return>之間的字符串
        NSString *regularStr = [NSString stringWithFormat:@"(?<=%@Result\\>).*(?=</%@Result)",soapMethod,soapMethod];
        NSRegularExpression *regular = [[NSRegularExpression alloc] initWithPattern:regularStr 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];
        }
       
        // 請(qǐng)求成功并且結(jié)果有值把結(jié)果傳出去
        if (success && dict) {
            success(dict);
        }
    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
        if (failure) {
            failure(error);

            //請(qǐng)求失敗
        }
    }];

完整代碼如下:

+ (void)SOAPData:(NSDictionary *)pratams soapMethod:(NSString *)soapMethod success:(void (^)(id))success failure:(void (^)(NSError *))failure
{

    NSString *soapbody = [[NSString alloc] init];
    for(NSString *str in pratams.allKeys)
    {
        soapbody = [soapbody stringByAppendingString:[NSString stringWithFormat:@"<%@>%@</%@>\\",str,[pratams objectForKey:str],str]];
    }
    //使用命名空間: http://tempuri.org/
    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>\
                         <%@ xmlns=\"http://tempuri.org/\">\
                         %@\
                         </%@>\
                         </soap:Body>\
                         </soap:Envelope>",soapMethod,soapbody,soapMethod];
    
    

    AFHTTPSessionManager *manager = [ AppDelegate shareManager];
    manager.responseSerializer = [AFXMLParserResponseSerializer serializer];
    // 設(shè)置請(qǐng)求超時(shí)時(shí)間
    manager.requestSerializer.timeoutInterval = 10;
    // 返回NSData
    manager.responseSerializer = [AFHTTPResponseSerializer serializer];
    // 設(shè)置請(qǐng)求頭,也可以不設(shè)置
    [manager.requestSerializer setValue:@"text/xml; charset=utf-8" forHTTPHeaderField:@"Content-Type"];
    [manager.requestSerializer setValue:[NSString stringWithFormat:@"%zd", soapStr.length] forHTTPHeaderField:@"Content-Length"];
    // 設(shè)置HTTPBody
    [manager.requestSerializer setQueryStringSerializationWithBlock:^NSString *(NSURLRequest *request, NSDictionary *parameters, NSError *__autoreleasing *error) {
        return soapStr;
    }];
    

    [manager POST:@"地址" parameters:soapStr progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
        // 把返回的二進(jìn)制數(shù)據(jù)轉(zhuǎn)為字符串
        NSString *result = [[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding];
        // 利用正則表達(dá)式取出<return></return>之間的字符串
        NSString *regularStr = [NSString stringWithFormat:@"(?<=%@Result\\>).*(?=</%@Result)",soapMethod,soapMethod];
        NSRegularExpression *regular = [[NSRegularExpression alloc] initWithPattern:regularStr 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];
        }
       
        // 請(qǐng)求成功并且結(jié)果有值把結(jié)果傳出去
        if (success && dict) {
            success(dict);
        }
    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
        if (failure) {
            failure(error);

            [[FunctionManager sharedHandel] showAlert:@"網(wǎng)絡(luò)連接失敗" duration:1.0];
        }
    }];
}

調(diào)用(比如登錄):

 NSDictionary * paramDict = @{@"userName":_nameTextField.text,@"passWord":_passwordTextField.text};
        
        [AFNwebManager SOAPData:paramDict soapMethod:@"getUserList" success:^(id responseObject) {
            
            NSLog(@"%@",responseObject);
            //獲取到數(shù)據(jù),進(jìn)行操作
        } failure:^(NSError *error) {
            
            //獲取失敗
        }];

如果地址是wsdl的:

33.png

注意 soap 請(qǐng)求體的標(biāo)簽可能會(huì)不一樣,可以下載并借助 soapUI (下載后將接口網(wǎng)址放上去,會(huì)生成對(duì)應(yīng)的 soap 格式)

完整代碼:

- (void)SOAPData:(NSDictionary *)pratams soapMethod:(NSString *)soapMethod success:(void (^)(id))success failure:(void (^)(void))failure
{
    NSString *soapbody = [[NSString alloc] init];
    for(NSString *str in pratams.allKeys)
    {
        soapbody = [soapbody stringByAppendingString:[NSString stringWithFormat:@"<%@>%@</%@>\\",str,[pratams objectForKey:str],str]];
    }
    ////.net http://tempuri.org/
  //java 與。net的標(biāo)簽不一樣,需要借助soapUI查看
    NSString *soapStr = [NSString stringWithFormat:
                                                  @"<?xml version=\"1.0\" encoding=\"utf-8\"?>\
                                                      <soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:ser=\"http://service.zhwy.com/\">\
                                                  <soapenv:Header>\
                                                  </soapenv:Header>\
                                                  <soapenv:Body>\
                                                  <ser:%@>\
                                                  %@\
                                                  </ser:%@>\
                                                  </soapenv:Body>\
                                                  </soapenv:Envelope>",soapMethod,soapbody,soapMethod];

    self.manager.responseSerializer = [AFXMLParserResponseSerializer serializer];
    // 設(shè)置請(qǐng)求超時(shí)時(shí)間
    self.manager.requestSerializer.timeoutInterval = 10;
    
    // 返回NSData
    self.manager.responseSerializer = [AFHTTPResponseSerializer serializer];
    
    // 設(shè)置請(qǐng)求頭,也可以不設(shè)置
    [self.manager.requestSerializer setValue:@"text/xml; charset=utf-8" forHTTPHeaderField:@"Content-Type"];
    [self.manager.requestSerializer setValue:[NSString stringWithFormat:@"%zd", soapStr.length] forHTTPHeaderField:@"Content-Length"];
//   self.manager.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"application/json",@"text/xml",@"text/json", @"text/plain", @"text/html", nil];
    // 設(shè)置HTTPBody
    [self.manager.requestSerializer setQueryStringSerializationWithBlock:^NSString *(NSURLRequest *request, NSDictionary *parameters, NSError *__autoreleasing *error) {
        return soapStr;
    }];


    self.task = [self.manager POST:HTTP_STR1 parameters:soapStr progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
        // 把返回的二進(jìn)制數(shù)據(jù)轉(zhuǎn)為字符串
        NSString *result = [[NSString alloc] initWithData:(NSData *)responseObject encoding:NSUTF8StringEncoding];
        // 利用正則表達(dá)式取出<return></return>之間的字符串
        NSString *regularStr = [NSString stringWithFormat:@"(?<=return\\>).*(?=</return)"];
        NSRegularExpression *regular = [[NSRegularExpression alloc] initWithPattern:regularStr options:NSRegularExpressionCaseInsensitive error:nil];
        NSDictionary *dict = [NSDictionary dictionary];

//        NSString *str;
        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];
            NSString *jsonStr = [result substringWithRange:checkingResult.range];
            //注意接口傳過(guò)來(lái)的數(shù)據(jù)帶有&quot字樣,需要替換成“ " ”(引號(hào))
            jsonStr = [jsonStr stringByReplacingOccurrencesOfString:@""" withString:@"\""];//替換字符
            NSData *jsonData = [jsonStr dataUsingEncoding:NSUTF8StringEncoding];
            dict = [NSJSONSerialization JSONObjectWithData:jsonData options:NSJSONReadingMutableLeaves error:nil];
//            str = [result substringWithRange:checkingResult.range];
        }
        // 請(qǐng)求成功并且結(jié)果有值把結(jié)果傳出去
        if (success && dict) {
            success(dict);
        }

    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
        
        if(failure)
        {
            failure();
        }
        NSString *errorStr ;
        if(error.code == -1001)
        {
            errorStr = @"網(wǎng)絡(luò)請(qǐng)求超時(shí)";
        }
        else if (error.code == -999){
            return ;
        }
        else if (error.code == -1009)
        {
            errorStr = @"網(wǎng)絡(luò)未連接";
        }
        else
        {
            errorStr = @"服務(wù)器連接異常";
        }
        for (UIView *view in [UIApplication sharedApplication].keyWindow.subviews) {
            if ([view isKindOfClass:[MBProgressHUD class]]) {
                [view removeFromSuperview];
            }
        }
        MBProgressHUD *hud = [MBProgressHUD showHUDAddedTo:[UIApplication sharedApplication].keyWindow animated:YES];
        hud.mode = MBProgressHUDModeText;
        hud.label.text = errorStr;
        hud.backgroundColor = [UIColor colorWithWhite:0.f alpha:0.5f];
        hud.offset = CGPointMake(0.f, 200);
        dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.f * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
            [MBProgressHUD hideHUDForView:[UIApplication sharedApplication].keyWindow animated:YES];
        });
        //HLog(@"error-----------%@",error);
    }];
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • AFHTTPRequestOperationManager 網(wǎng)絡(luò)傳輸協(xié)議UDP、TCP、Http、Socket、X...
    Carden閱讀 4,403評(píng)論 0 12
  • 一、Java基礎(chǔ) 1.寫(xiě)出下面代碼的執(zhí)行結(jié)果 2.寫(xiě)出下面代碼的執(zhí)行結(jié)果 3.寫(xiě)出下面代碼的執(zhí)行結(jié)果 (此題需寫(xiě)出...
    joshul閱讀 544評(píng)論 0 1
  • 概覽 CXF frontends 是一組編程的API,被用來(lái)開(kāi)發(fā)和發(fā)布webservice。CXF支持兩種類(lèi)型的f...
    JohnShen閱讀 1,351評(píng)論 2 2
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語(yǔ)法,類(lèi)相關(guān)的語(yǔ)法,內(nèi)部類(lèi)的語(yǔ)法,繼承相關(guān)的語(yǔ)法,異常的語(yǔ)法,線程的語(yǔ)...
    子非魚(yú)_t_閱讀 31,778評(píng)論 18 399
  • 因?yàn)楣ぷ髦惺褂昧薙OAP進(jìn)行兩個(gè)系統(tǒng)的接口調(diào)用,所以私下學(xué)習(xí)一下兩種實(shí)現(xiàn),粗略記錄于此。本文側(cè)重于實(shí)際實(shí)現(xiàn)操作,而...
    峽客閱讀 4,471評(píng)論 0 4