写这个笔记之前,我也参考了一些文章,主要是在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。
相关推荐
标题“iPhone访问Java后台WebService”意味着我们要探讨的是如何使用iPhone应用调用Java服务器提供的Web服务接口。这些接口通常是RESTful API或SOAP协议,用于传递和接收数据。 1. **iPhone客户端与Java后台通信**...
在这个例子中,`lajp_call`函数用于调用Java方法`hello.HelloClass::hello`。 **Java代码**: ```java package hello; public class HelloClass { public static final String hello(String userName) { return ...
标题中提到的“IOS Client Call Web Service_asix2”暗示了本文档将涉及在iOS环境下通过客户端发起对WebService的调用。这意味着我们将探讨iOS应用如何与远程的网络服务进行交互。WebService是一种基于网络的分布式...
学习WebService的实战案例可以帮助开发者了解如何设计和调用Web服务接口。 ### 6. 移动应用开发 - **iPhone**: 针对iPhone的教程可能包括使用Objective-C或Swift进行iOS应用开发的基础知识和最佳实践。 - **...
给定内容中提到了iPhone OS、Android游戏开发和Windows Phone平台的相关资源,覆盖了从UI/UX设计到原生应用开发,再到跨平台框架使用(如Flex4)的整个流程。 5. **Web前端技术**:Web前端技术包括HTML、CSS、...
- **移动应用开发**:JavaME 主要用于移动设备应用开发,尽管随着 iPhone 和 Android 平台的发展,JavaME 的市场逐渐被侵蚀,但在早期的移动通信中,如 3G 通讯时代,JavaME 仍占据了一席之地。 #### 二、Java 类型...