访问Web服务器时 使用的协议是,使用SOAP协议访问Web服务
SOAP是簡單對象訪問協(xié)議,它可看成是HTTP與XML的結(jié)合,其中XML部分是作為HTTP報文的實體主體部分。
SOAP:簡單對象訪問協(xié)議,是一種輕量的、簡單的、基于 XML 的協(xié)議,它被設(shè)計成在 WEB 上交換結(jié)構(gòu)化的和固化的信息。 SOAP 可以和現(xiàn)存的許多因特網(wǎng)協(xié)議和格式結(jié)合使用,包括超文本傳輸協(xié)議( HTTP),簡單郵件傳輸協(xié)議(SMTP),多用途網(wǎng)際郵件擴充協(xié)議(MIME)。它還支持從消息系統(tǒng)到遠程過程調(diào)用(RPC)等大量的應用程序。
下面重點說下:
在iOS中使用SOAP,需要我們自己組裝XML格式的字符串,當XML字符串比較長的時候會變得很麻煩。另外,我們在寫XML格式的字符串時也要經(jīng)常使用轉(zhuǎn)義字符“\”。
若在mobileCode輸入手機號碼,userID不輸入,點擊調(diào)用,則結(jié)果如下:
看看剛才那個網(wǎng)頁的內(nèi)容,注意到SOAP 1.2標簽下的內(nèi)容:
上面的這段文本就是使用SOAP 1.2的請求報文格式,就是一個HTTP請求報文,注意空行上面的那些內(nèi)容中的請求行與各首部行的每個字段名,在下面的示例中會用到。這個HTTP請求報文的實體主體部分是XML格式的一段文本,注意Body標簽之間的內(nèi)容。
服務器的響應報文格式如下:
我們要用到的只有g(shù)etMobileCodeInfoResult這個標簽。
這次的例子是實現(xiàn)通過SOAP服務查詢手機號碼歸屬地、運行商等信息。PS:用的Xcode 4.4.1。
1、運行Xcode 4.4.1,新建一個Single View Application,名稱為SOAP Test:
2、界面設(shè)計:打開ViewController.xib,設(shè)計界面如下所示:
在文本輸入框的Attribute Inspector中設(shè)置其Keyboard屬性為Number Pad。
3、之后向ViewController.h中,為文本輸入框創(chuàng)建OutLet映射,名稱為:phoneNumber;為“查詢”按鈕創(chuàng)建Action映射,事件類型為Touch Up Inside,名稱為:doQuery。建立映射的方法就是打開Assistant Editor,選中某一控件,按住Ctrl,拖向ViewController.h。
4、在ViewController.h中添加代碼:
4.1 在@interface那行最后添加代碼
使ViewController遵守這兩個協(xié)議。前者用來解析XML,后者用于網(wǎng)絡連接。
4.2 在@end之前添加代碼@property(strong,nonatomic)NSMutableData*webData;@property(strong,nonatomic)NSMutableString*soapResults;@property(strong,nonatomic)NSXMLParser*xmlParser;@property(nonatomic)BOOL elementFound;@property(strong,nonatomic)NSString*matchingElement;@property(strong,nonatomic)NSURLConnection*conn;
5、在ViewController.m中添加代碼:
5.1 在@implementation之后添加代碼@synthesizewebData;@synthesizesoapResults;@synthesizexmlParser;@synthesizeelementFound;@synthesizematchingElement;@synthesizeconn;
5.2 實現(xiàn)doQuery方法
5.3 在@end之前添加代碼#pragmamark-#pragmamark URLConnectionDataDelegateMethods// 剛開始接受響應時調(diào)用-(void)connection:(NSURLConnection*)connection didReceiveResponse:(NSURLResponse*)response{[webData setLength:0];}// 每接收到一部分數(shù)據(jù)就追加到webData中-(void)connection:(NSURLConnection*)connection didReceiveData:(NSData*)data{[webData appendData:data];}// 出現(xiàn)錯誤時-(void)connection:(NSURLConnection*)connection didFailWithError:(NSError*)error{conn=nil;webData=nil;}// 完成接收數(shù)據(jù)時調(diào)用-(void)connectionDidFinishLoading:(NSURLConnection*)connection{NSString*theXML=[[NSStringalloc]initWithBytes:[webData mutableBytes]length:[webData length]encoding:NSUTF8StringEncoding];// 打印出得到的XMLNSLog(@"%@",theXML);// 使用NSXMLParser解析出我們想要的結(jié)果xmlParser=[[NSXMLParseralloc]initWithData:webData];[xmlParser setDelegate:self];[xmlParser setShouldResolveExternalEntities:YES];[xmlParser parse];}
5.4 在@end之前添加代碼#pragmamark-#pragmamark XMLParserDelegateMethods// 開始解析一個元素名-(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){[soapResults appendString:string];}}// 結(jié)束解析這個元素名-(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:selfcancelButtonTitle:@"確定"otherButtonTitles:nil];[alert show];elementFound=FALSE;// 強制放棄解析[xmlParser abortParsing];}}// 解析整個文件結(jié)束后-(void)parserDidEndDocument:(NSXMLParser*)parser{if(soapResults){soapResults=nil;}}// 出錯時,例如強制結(jié)束解析-(void)parser:(NSXMLParser*)parser parseErrorOccurred:(NSError*)parseError{if(soapResults){soapResults=nil;}}
6、運行
其中,輸入號碼時單擊查詢,打印出的響應XML如下:
總結(jié)
以上是生活随笔為你收集整理的访问Web服务器时 使用的协议是,使用SOAP协议访问Web服务的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 黎巴嫩2700余吨硝酸铵爆炸:为什么惹祸
- 下一篇: 贵阳检察机关逮捕冒充"老干妈"员工行骗两