【iOS SOAP】基于第三方开源项目:wsdl2objc
wsdl2objc
地址:http://code.google.com/p/wsdl2objc/
服务器端,参考:【Web Service】Apache Tuscany发布Web Service
准备工作:
svn checkout http://wsdl2objc.googlecode.com/svn/trunk/
<生成代码
运行WSDLParser项目
WSDL栏输入wsdl的地址
Output Location栏输入输出代码的目录
点击Parse WSDL按钮生成代码:
<添加到项目
<支持libxml2
TARGETS -> Build Settings -> Linking -> Other Linker Flags,设置“-lxml2”
TARGETS -> Building Settings -> Apple LLVM compiler 4.1 - Language -> Other C Flags,设置“-I/usr/include/libxml2”
<添加framework
TARGETS -> Build Phases -> Link Binary With Libraries,添加CFNetwork.framework
代码示例
#import <UIKit/UIKit.h> #import "IHelloWorldService.h" @interface ViewController : UIViewController <IHelloWorldServiceBindingResponseDelegate> { UITextField *mNameTextField; UITextView *mMessageTextView; } @property (retain, nonatomic) IBOutlet UITextField *nameTextField; @property (retain, nonatomic) IBOutlet UITextView *messageTextView; - (IBAction)sendButtonPressed:(id)sender; @end
#import "ViewController.h" @interface ViewController () @end @implementation ViewController @synthesize nameTextField = mNameTextField, messageTextView = mMessageTextView; - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. } - (IBAction)sendButtonPressed:(id)sender { IHelloWorldServiceBinding *binding = [IHelloWorldService IHelloWorldServiceBinding]; IHelloWorldService_say *say = [[IHelloWorldService_say new] autorelease]; say.arg0 = [mNameTextField text]; [binding sayAsyncUsingSay:say delegate:self]; } - (void)operation:(IHelloWorldServiceBindingOperation *)operation completedWithResponse:(IHelloWorldServiceBindingResponse *)response { NSArray *responseHeaders = response.headers; NSArray *responseBodyParts = response.bodyParts; for(id header in responseHeaders) { // here do what you want with the headers, if there's anything of value in them } for(id bodyPart in responseBodyParts) { if ([bodyPart isKindOfClass:[SOAPFault class]]) { // continue; } if([bodyPart isKindOfClass:[IHelloWorldService_sayResponse class]]) { IHelloWorldService_sayResponse *body = (IHelloWorldService_sayResponse*)bodyPart; NSString *text = body.return_; mMessageTextView.text = [NSString stringWithFormat:@"%@\n%@", mMessageTextView.text, text]; continue; } } } @end
Build,报错:"libxml/tree.h" file not found
解决方法:
PROJECT -> Build Settings -> Search Paths -> Header Search Paths,设置“${SDK_DIR}/usr/include/libxml2”
TARGETS -> Build Settings -> Search Paths -> Header Search Paths,设置“${SDK_DIR}/usr/include/libxml2”
参考:http://mmz06.blog.163.com/blog/static/121416962012913202818/
Build,Run
请求,参数为“Anthony”
相应,内容为“Hello null”
wsdl2objc Bug!!!
解决方法:修改文件IHelloWorldService.m中,类“IHelloWorldService_say”的“- (void)addElementsToNode:(xmlNodePtr)node”方法。
设置元素命名空间前缀为“nil”
xmlAddChild(node, [self.arg0xmlNodeForDoc:node->docelementName:@"arg0"elementNSPrefix:nil]);
Build,Run
成功!!!
iOS 开发讨论群:82873648
![知识共享许可协议](http://i.creativecommons.org/l/by-nc/3.0/88x31.png)
本作品采用知识共享署名-非商业性使用 3.0 许可协议进行许可。
转载请署名李震(博客地址:http://www.cnblogs.com/dyingbleed/),且不得用于商业目的。
博客园博客已停止更新,博客地址:dyingbleed.com