IOS之 soap協議 webservice篇

來源:互聯網
上載者:User

本次介紹一下ios使用soap協議和webservice進行通訊。

本人也是近期做了一個小項目,使用到了這中方式。當然現在ios使用的webservice多以restful的居多。想這種複雜的協議soap的,比較少了。

廢話少說,開始講解:

一,先說說原理

 soap是一個協議,規範。只要用戶端發送特定的xml格式的文本,用post的方式,發送到server端,server端就相應,返回相應的xml格式的回應。

所以知道soap的原理之後,咱們就好做了。

二,ios方面怎麼做

 來一個可以發送post的方式即可,然後是找到soap的發送協議報文xml格式的,最後是接收,非同步接收,收完了再解析返回報文就行啦。很簡單。

三,具體程式

在viewcontrol.m中

 


#import "ViewController.h"


@interface ViewController ()

@property (strong,nonatomic) IBOutletUITextField *search;


@end


@implementation ViewController


@synthesize webData;

@synthesize soapResults;

@synthesize xmlParser;

@synthesize elementFound;

@synthesize matchingElement;

@synthesize conn;



- (IBAction)search:(id)sender

{

//    NSString *path=[[NSString alloc] initWithFormat:@"/webservice/query/getresultbyname2"];

//    NSMutableDictionary *param = [[NSMutableDictionary alloc] init];

//    [param setValue:@"name" forKey:self.search.text];

//    [param setValue:@"pageNumber" forKey:@"1"];

//    MKNetworkEngine *engine = [[MKNetworkEngine alloc] initWithHostName:@"search.chinajob.com" customHeaderFields:nil];

//    MKNetworkOperation *op = [engine operationWithPath:path params:param httpMethod:@"POST"];

//    [op addCompletionHandler:^(MKNetworkOperation *completedOperation) {

//        NSLog(@"responseData : %@", [completedOperation responseString]);

//        NSData *data = [completedOperation responseData];

//        NSDictionary *resDict = [NSJSONSerialization JSONObjectWithData:data options:(NSJSONReadingAllowFragments) error:nil];

//        [self reloadInputViews];

//    } errorHandler:^(MKNetworkOperation *errorOp, NSError *err)

//     {

//         NSLog(@"error wy : %@", [err localizedDescription]);

//     }];

//    [engine enqueueOperation:op];

    

   NSString *name = self.search.text;

    

    // 設定我們之後解析XML時用的關鍵字,與響應報文中Body標籤之間的getMobileCodeInfoResult標籤對應

    matchingElement =@"name";

    //建立SOAP訊息,內容格式就是網站上提示的請求報文的實體主體部分

   NSString *soapMsg = [NSStringstringWithFormat:

                         @"<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:web=\"http://webservice.kbhn/\">"

                        "<soapenv:Header/>"

                        "<soapenv:Body>"

                        "<web:getresultbyname2>"

                        "<!--Optional:-->"

                        "<name>%@</name>"

                        "<!--Optional:-->"

                         "<pageNumber>1</pageNumber>"

                        "</web:getresultbyname2>"

                        "</soapenv:Body>"

                        "</soapenv:Envelope>", name, @""];

    

    // 將這個XML字串列印出來

   NSLog(@"%@", soapMsg);

    //建立URL,內容是前面的請求報文報文中第二行主機地址加上第一行URL欄位

    NSURL *url = [NSURLURLWithString:@"http://search.chinajob.com/webservice/query"];

    //根據上面的URL建立一個請求

    NSMutableURLRequest *req = [NSMutableURLRequestrequestWithURL:url];

   NSString *msgLength = [NSStringstringWithFormat:@"%d", [soapMsglength]];

    //添加請求的詳細資料,與請求報文前半部分的各欄位對應

    [req addValue:@"text/xml;charset=UTF-8"forHTTPHeaderField:@"Content-Type"];

    [req addValue:msgLengthforHTTPHeaderField:@"Content-Length"];

    //佈建要求行方法為POST,與請求報文第一行對應

    [req setHTTPMethod:@"POST"];

    // 將SOAP訊息加到請求中

    [req setHTTPBody: [soapMsgdataUsingEncoding:NSUTF8StringEncoding]];

    // 建立串連

    conn = [[NSURLConnectionalloc] initWithRequest:reqdelegate:self];

   if (conn) {

       webData = [NSMutableDatadata];

    }

    

}


// 剛開始接受響應時調用

-(void) connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *) response{

    [webDatasetLength: 0];

}


// 每接收到一部分資料就追加到webData中

-(void) connection:(NSURLConnection *)connection didReceiveData:(NSData *) data {

    [webDataappendData:data];

}


// 出現錯誤時

-(void) connection:(NSURLConnection *)connection didFailWithError:(NSError *) error {

   conn = nil;

   webData = nil;

}


// 完成接收資料時調用

-(void) connectionDidFinishLoading:(NSURLConnection *) connection {

    NSString *theXML = [[NSStringalloc] initWithBytes:[webDatamutableBytes]

                                               length:[webDatalength]

                                             encoding:NSUTF8StringEncoding];

    

    // 列印出得到的XML

   NSLog(@"%@", theXML);

    // 使用NSXMLParser解析出我們想要的結果

    xmlParser = [[NSXMLParseralloc] initWithData:webData];

    [xmlParsersetDelegate: self];

    [xmlParsersetShouldResolveExternalEntities: YES];

    [xmlParser parse];

}


// 開始解析一個元素名

-(void) parser:(NSXMLParser *) parser didStartElement:(NSString *) elementName namespaceURI:(NSString *) namespaceURI qualifiedName:(NSString *) qName attributes:(NSDictionary *) attributeDict {

   if ([elementName isEqualToString:matchingElement]) {

       if (!soapResults) {

           soapResults = [[NSMutableStringalloc] init];

        }

       elementFound = YES;

    }

}


// 追加找到的元素值,一個元素值可能要分幾次追加

-(void)parser:(NSXMLParser *) parser foundCharacters:(NSString *)string {

    if (elementFound) {

        [soapResultsappendString: string];

    }

}


// 結束解析這個元素名

-(void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName {

   if ([elementName isEqualToString:matchingElement]) {

       UIAlertView *alert = [[UIAlertViewalloc] initWithTitle:@"手機號碼資訊"

                                                       message:[NSStringstringWithFormat:@"%@",soapResults]

                                                      delegate:self

                                             cancelButtonTitle:@"確定"

                                             otherButtonTitles:nil];

        [alertshow];

       elementFound = FALSE;

        // 強制放棄解析

        [xmlParserabortParsing];

    }

}


// 解析整個檔案結束後

- (void)parserDidEndDocument:(NSXMLParser *)parser {

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.