本次介紹一下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 {