写这个笔记之前,我也参考了一些文章,主要是在http://www.cocoachina.com/这个网站上搜索资料。
webService大家可以看一个教程:
http://www.cnblogs.com/hoojo/archive/2011/03/16/1985160.html谢谢这位博主对我提供的帮助。
下面是我的webService代码:
package com.xiva.service; import org.apache.axis2.context.MessageContext; import org.apache.axis2.context.ServiceContext; public class LoginService { public boolean login(String userName, String password) { MessageContext context = MessageContext.getCurrentMessageContext(); ServiceContext ctx = context.getServiceContext(); if ("admin".equals(userName) && "123456".equals(password)) { ctx.setProperty("userName", userName); ctx.setProperty("password", password); ctx.setProperty("msg", "登陆成功"); return true; } ctx.setProperty("msg", "登陆失败"); return false; } public String getLoginMessage() { MessageContext context = MessageContext.getCurrentMessageContext(); ServiceContext ctx = context.getServiceContext(); return ctx.getProperty("userName") + "#" + ctx.getProperty("msg"); } }
安装前面提到的博客文章,发布好这个Service.
下面就是在iPhone上的调用了。
先把代码给出,我们再一个一个分析。
// // SOAPDemoViewController.h // SOAPDemo // // Created by xiang xiva on 11-4-4. // Copyright 2011 __MyCompanyName__. All rights reserved. // #import <UIKit/UIKit.h> @interface SOAPDemoViewController : UIViewController <NSXMLParserDelegate>{ IBOutlet UITextField *nameInput; IBOutlet UILabel *greeting; NSMutableData *webData; NSMutableString *soapResults; NSXMLParser *xmlParser; BOOL recordResults; } @property(nonatomic, retain) IBOutlet UITextField *nameInput; @property(nonatomic, retain) IBOutlet UILabel *greeting; @property(nonatomic, retain) NSMutableData *webData; @property(nonatomic, retain) NSMutableString *soapResults; @property(nonatomic, retain) NSXMLParser *xmlParser; -(IBAction)buttonClick: (id) sender; - (void)loginSOAP; @end
// // SOAPDemoViewController.m // SOAPDemo // // Created by xiang xiva on 11-4-4. // Copyright 2011 __MyCompanyName__. All rights reserved. // #import "SOAPDemoViewController.h" @implementation SOAPDemoViewController @synthesize greeting, nameInput, webData, soapResults, xmlParser; /* // The designated initializer. Override to perform setup that is required before the view is loaded. - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; if (self) { // Custom initialization } return self; } */ /* // Implement loadView to create a view hierarchy programmatically, without using a nib. - (void)loadView { } */ /* - (void)viewDidLoad { [super viewDidLoad]; } */ /* // Override to allow orientations other than the default portrait orientation. - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { // Return YES for supported orientations return (interfaceOrientation == UIInterfaceOrientationPortrait); } */ - (void)didReceiveMemoryWarning { // Releases the view if it doesn't have a superview. [super didReceiveMemoryWarning]; // Release any cached data, images, etc that aren't in use. } - (void)viewDidUnload { // Release any retained subviews of the main view. // e.g. self.myOutlet = nil; } -(IBAction)buttonClick:(id)sender { greeting.text = @"Getting time …"; [nameInput resignFirstResponder]; [self loginSOAP]; } #pragma mark - #pragma mark webService Data -(void)loginSOAP{ recordResults = NO; //封装soap请求消息 NSString *soapMessage = [NSString stringWithFormat: @"<?xml version=\"1.0\" encoding=\"utf-8\"?>\n" "<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:encodingStyle=\"http://www.w3.org/2001/12/soap-encoding\">\n" "<soap:Body>\n" "<login xmlns=\"http://service.xiva.com\">\n" "<userName>admin" "</userName>" "<password>123456" "</password>" "</login>\n" "</soap:Body>\n" "</soap:Envelope>\n" ]; NSLog(@"%a",soapMessage); //请求发送到的路径 NSURL *url = [NSURL URLWithString:@"http://192.168.0.64:8080/axis2/services/LoginService"]; NSMutableURLRequest *theRequest = [NSMutableURLRequest requestWithURL:url]; NSString *msgLength = [NSString stringWithFormat:@"%d", [soapMessage length]]; //以下对请求信息添加属性前四句是必有的,第五句是soap信息。 [theRequest addValue: @"text/xml; charset=utf-8" forHTTPHeaderField:@"Content-Type"]; [theRequest addValue: @"http://service.xiva.com/login" forHTTPHeaderField:@"SOAPAction"]; [theRequest addValue: msgLength forHTTPHeaderField:@"Content-Length"]; [theRequest setHTTPMethod:@"POST"]; [theRequest setHTTPBody: [soapMessage dataUsingEncoding:NSUTF8StringEncoding]]; //请求 NSURLConnection *theConnection = [[NSURLConnection alloc] initWithRequest:theRequest delegate:self]; //如果连接已经建好,则初始化data if( theConnection ) { webData = [[NSMutableData data] retain]; } else { NSLog(@"theConnection is NULL"); } } -(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response { [webData setLength: 0]; NSLog(@"connection: didReceiveResponse:1"); } -(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data { [webData appendData:data]; NSLog(@"connection: didReceiveData:%a", [webData length]); } //如果电脑没有连接网络,则出现此信息(不是网络服务器不通) -(void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error { NSLog(@"ERROR with theConenction"); [connection release]; [webData release]; } -(void)connectionDidFinishLoading:(NSURLConnection *)connection { NSLog(@"3 DONE. Received Bytes: %d", [webData length]); NSString *theXML = [[NSString alloc] initWithBytes: [webData mutableBytes] length:[webData length] encoding:NSUTF8StringEncoding]; NSLog(@"%a",theXML); [theXML release]; //重新加載xmlParser if( xmlParser ) { [xmlParser release]; } xmlParser = [[NSXMLParser alloc] initWithData: webData]; [xmlParser setDelegate: self]; [xmlParser setShouldResolveExternalEntities: YES]; [xmlParser parse]; [connection release]; //[webData release]; } -(void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *) namespaceURI qualifiedName:(NSString *)qName attributes: (NSDictionary *)attributeDict { NSLog(@"4 parser didStarElemen: namespaceURI: attributes:"); if( [elementName isEqualToString:@"soap:Fault"]) { if(!soapResults) { soapResults = [[NSMutableString alloc] init]; } recordResults = YES; } } -(void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string { NSLog(@"5 parser: foundCharacters:"); NSLog(@"recordResults:%@",string); if( recordResults ) { [soapResults appendString: string]; } } -(void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName { NSLog(@"6 parser: didEndElement:"); if( [elementName isEqualToString:@"ns:return"]) { NSLog(@"MSG"); } if( [elementName isEqualToString:@"getOffesetUTCTimeResult"]) { recordResults = FALSE; greeting.text = [[[NSString init]stringWithFormat:@"第%@时区的时间是: ",nameInput.text] stringByAppendingString:soapResults]; [soapResults release]; soapResults = nil; NSLog(@"hoursOffset result"); } } - (void)parserDidStartDocument:(NSXMLParser *)parser{ NSLog(@"-------------------start--------------"); } - (void)parserDidEndDocument:(NSXMLParser *)parser{ NSLog(@"-------------------end--------------"); } - (void)dealloc { [super dealloc]; } @end
在iPhone你直接创建一个视图应用即可。
既然集成了NSXMLParserDelegate的协议,那么我们便可使用这个协议上的方法。
关于connection的方法和xml的方法在此不用多说了;看看方法名大家就知道用途了。
第一个难点:
[theRequest setHTTPBody: [soapMessage dataUsingEncoding:NSUTF8StringEncoding]];
这句话中的soapMessage的拼接。
NSString *soapMessage = [NSString stringWithFormat: @"<?xml version=\"1.0\" encoding=\"utf-8\"?>\n" "<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:encodingStyle=\"http://www.w3.org/2001/12/soap-encoding\">\n" "<soap:Body>\n" "<login xmlns=\"http://service.xiva.com\">\n" "<userName>admin" "</userName>" "<password>123456" "</password>" "</login>\n" "</soap:Body>\n" "</soap:Envelope>\n" ];
除了下面这段代码,其他都是一些系统设置,
"<login xmlns=\"http://service.xiva.com\">\n"
"<userName>admin"
"</userName>"
"<password>123456"
"</password>"
"</login>\n"
上面代码中第一行的login,代表我们要调用的方法;xmlns中存放的是命名空间,http://service.xiva.com
service.xiva.com就是java中我们包位置的颠倒。
第二,三行代码我们给login传递一个叫userName的参数,值为admin
第四,五行代码我们给login传递一个叫password的参数,值为123456
第二个难点:
NSURL *url = [NSURL URLWithString:@"http://192.168.0.64:8080/axis2/services/LoginService"]; NSMutableURLRequest *theRequest = [NSMutableURLRequest requestWithURL:url]; NSString *msgLength = [NSString stringWithFormat:@"%d", [soapMessage length]]; //以下对请求信息添加属性前四句是必有的,第五句是soap信息。 [theRequest addValue: @"text/xml; charset=utf-8" forHTTPHeaderField:@"Content-Type"]; [theRequest addValue: @"http://service.xiva.com/login" forHTTPHeaderField:@"SOAPAction"]; [theRequest addValue: msgLength forHTTPHeaderField:@"Content-Length"]; [theRequest setHTTPMethod:@"POST"]; [theRequest setHTTPBody: [soapMessage dataUsingEncoding:NSUTF8StringEncoding]];
首先url,是指我们调用该方法的地址,
第二行初始化一个request给我们的connection调用,
第三行和第七行我们在设置内容的长度
第四行,是注释
第五行,设置http内容的type
第六行,是设置我们soapAction;也就是我们webService调用的方法,命名空间/方法名
第八行设置http的发送方式,为post。(不知道用get会怎么样?)
第九行设置整个Body的内容,也就是我们之前拼接的那个soapMessage。
相关推荐
调用WebService,最简单的办法当然是直接添加WEB引用,然后自动产生代理类,但是在调用JAVA的WebService时并没有这么简单,特别是对于SoapHeader的处理,通过C#添加Web引用方式访问JavaWebService的方法,除了string...
此文档是DotNet调用Java WebService的含代码的讲解与应用,对.Net开发者有很好的启发作用。
asp.net调用java webservice实例
java调用webservicejava调用webservice.zipjava调用webservice.zipjava调用webservice.zipjava调用webservice.zipjava调用webservice.zipjava调用webservice.zipjava调用webservice.zipjava调用webservice.zipjava...
Android调用Java WebService的实现方法.pdf
C++调用Javawebservice.pdf
调用 java webservice 的问题
JAVA WEBSERVICE 建的实例工程,给PB调用, 因VS建的 WEBSERVICE PB很难调用,所以用JAVA的axis做了个小实例 共大家参考
c#调用java带身份验证webservice
java调用json参数的webservice 涉及技术: JAVA JSON WEBSERVICE
文档详细介绍了用myeclipse生成webservice的方法步骤,以及abap调用webservice 第一步:myeclipse生成webservice 第二部:发布webservice 第三步:在sap系统生成webservice代理 第四步:生成port 第五步:用实例调用...
java 调用https发布的webservice接口实例及axis包及详细说明
C++ 调用Java webservice接口的函数,内有个使用说明文档,很详细的
NULL 博文链接:https://longwenbin2008.iteye.com/blog/299543
NULL 博文链接:https://liyuandong.iteye.com/blog/782246
powerbuilder 调用webservice 实现步骤,有图有真相 看不懂在联系我
JAVA调用WEBSERVICE接口
客户端C#调用服务端Java的WebService
java调用webservice接口案例,精简,service调用webservice接口案例;不用生成一堆代码,逻辑清晰
.net winForm 程序调用 Java WebService