WSDL2OBJC直接生成的代码是无法正确发送CXF能解析的数据包
2011-12-31 08:42
411 查看
首先, WSDL2OBJC直接生成的代码是无法正确发送CXF能解析的数据包的
我懒得去看WSDL2OBJC的源码,
但是由其生成的源码看看倒是ok的
我wsdl的服务名是HotelPortService
生成的文件中有个HotelPortServiceSvc.m,
要修改的地方全部集中在这个文件
首先, 找到如下代码的位置, 替换掉
然后再编译运行. 如果没有意外, 就能获得正确的结果了.
文档如有错漏, 欢迎指正补全
测试环境
Mac OS 10.6.8, xcode 4.0.1, WSDL2ObjC 0.7 pre1
可以通过抓包工具,来对比java和ios请求的soap body的不同,来组装ios的soap body
我懒得去看WSDL2OBJC的源码,
但是由其生成的源码看看倒是ok的
我wsdl的服务名是HotelPortService
生成的文件中有个HotelPortServiceSvc.m,
要修改的地方全部集中在这个文件
首先, 找到如下代码的位置, 替换掉
- (NSString *)serializedFormUsingHeaderElements:(NSDictionary *)headerElements bodyElements:(NSDictionary *)bodyElements { xmlDocPtr doc; doc = xmlNewDoc((constxmlChar*)XML_DEFAULT_VERSION); if (doc == NULL) { NSLog(@"Error creating the xml document tree"); return@""; } xmlNodePtr root = xmlNewDocNode(doc, NULL, (constxmlChar*)"Envelope", NULL); xmlDocSetRootElement(doc, root); xmlNsPtr soapEnvelopeNs =xmlNewNs(root, (constxmlChar*)"http://schemas.xmlsoap.org/soap/envelope/", (constxmlChar*)"soap"); xmlSetNs(root, soapEnvelopeNs); xmlNsPtr xslNs =xmlNewNs(root, (constxmlChar*)"http://www.w3.org/1999/XSL/Transform", (constxmlChar*)"xsl"); xmlNewNs(root, (constxmlChar*)"http://www.w3.org/2001/XMLSchema-instance", (constxmlChar*)"xsi"); xmlNewNsProp(root, xslNs, (constxmlChar*)"version", (constxmlChar*)"1.0"); xmlNewNs(root, (constxmlChar*)"http://www.w3.org/2001/XMLSchema", (constxmlChar*)"xs"); xmlNewNs(root, (constxmlChar*)"http://port.ekezhan.com/", (constxmlChar*)"HotelPortServiceSvc");//字符串部分根据服务名不同而不同 if((headerElements != nil) && ([headerElements count] > 0)) { xmlNodePtr headerNode =xmlNewDocNode(doc, soapEnvelopeNs, (constxmlChar*)"Header", NULL); xmlAddChild(root, headerNode); for(NSString *keyin [headerElements allKeys]) { id header = [headerElementsobjectForKey:key]; xmlAddChild(headerNode, [headerxmlNodeForDoc:doc elementName:keyelementNSPrefix:nil]); } } if((bodyElements != nil) && ([bodyElements count] > 0)) { xmlNodePtr bodyNode =xmlNewDocNode(doc, soapEnvelopeNs, (constxmlChar*)"Body", NULL); xmlAddChild(root, bodyNode); for(NSString *keyin [bodyElements allKeys]) { id body = [bodyElementsobjectForKey:key]; xmlAddChild(bodyNode, [bodyxmlNodeForDoc:doc elementName:keyelementNSPrefix:nil]); } } xmlChar *buf; int size; xmlDocDumpFormatMemory(doc, &buf, &size,1); NSString *serializedForm = [NSStringstringWithCString:(constchar*)buf encoding:NSUTF8StringEncoding]; xmlFree(buf); xmlFreeDoc(doc); return serializedForm; } 替换成: - (NSString *)serializedFormUsingHeaderElements:(NSDictionary *)headerElements bodyElements:(NSDictionary *)bodyElements { xmlDocPtr doc; doc = xmlNewDoc((constxmlChar*)XML_DEFAULT_VERSION); if (doc == NULL) { NSLog(@"Error creating the xml document tree"); return@""; } xmlNodePtr root = xmlNewDocNode(doc, NULL, (constxmlChar*)"Envelope", NULL); xmlDocSetRootElement(doc, root); xmlNsPtr soapEnvelopeNs =xmlNewNs(root, (constxmlChar*)"http://schemas.xmlsoap.org/soap/envelope/", (constxmlChar*)"soapenv");//此处修改 xmlSetNs(root, soapEnvelopeNs); //xmlNsPtr xslNs = xmlNewNs(root, (const xmlChar*)"http://www.w3.org/1999/XSL/Transform", (const xmlChar*)"xsl"); //xmlNewNs(root, (const xmlChar*)"http://www.w3.org/2001/XMLSchema-instance", (const xmlChar*)"xsi"); //xmlNewNsProp(root, xslNs, (const xmlChar*)"version", (const xmlChar*)"1.0"); //xmlNewNs(root, (const xmlChar*)"http://www.w3.org/2001/XMLSchema", (const xmlChar*)"xs"); xmlNewNs(root, (constxmlChar*)"http://port.ekezhan.com/", (constxmlChar*)"port"); if((headerElements != nil) && ([headerElements count] > 0)) { xmlNodePtr headerNode =xmlNewDocNode(doc, soapEnvelopeNs, (constxmlChar*)"Header", NULL); xmlAddChild(root, headerNode); for(NSString *keyin [headerElements allKeys]) { id header = [headerElementsobjectForKey:key]; xmlAddChild(headerNode, [headerxmlNodeForDoc:doc elementName:keyelementNSPrefix:nil]); } } //此处修改 else { xmlNodePtr headerNode =xmlNewDocNode(doc, soapEnvelopeNs, (constxmlChar*)"Header", NULL); xmlAddChild(root, headerNode); } if((bodyElements != nil) && ([bodyElements count] > 0)) { xmlNodePtr bodyNode =xmlNewDocNode(doc, soapEnvelopeNs, (constxmlChar*)"Body", NULL); xmlAddChild(root, bodyNode); for(NSString *keyin [bodyElements allKeys]) { id body = [bodyElementsobjectForKey:key]; xmlAddChild(bodyNode, [bodyxmlNodeForDoc:doc elementName:keyelementNSPrefix:@"port"]);//此处修改 } } xmlChar *buf; int size; xmlDocDumpFormatMemory(doc, &buf, &size,1); NSString *serializedForm = [NSStringstringWithCString:(constchar*)buf encoding:NSUTF8StringEncoding]; xmlFree(buf); xmlFreeDoc(doc); return serializedForm; } 替换全部 elementNSPrefix:@"HotelPortServiceSvc" 为elementNSPrefix:nil //字符串部分根据服务名不同而不同 替换全部 nodeName = [NSString stringWithFormat:@"%@:%@",@"HotelPortServiceSvc", elName];//字符串部分根据服务名不同而不同 为nodeName = [NSString stringWithFormat:@"%@", elName];
然后再编译运行. 如果没有意外, 就能获得正确的结果了.
文档如有错漏, 欢迎指正补全
测试环境
Mac OS 10.6.8, xcode 4.0.1, WSDL2ObjC 0.7 pre1
可以通过抓包工具,来对比java和ios请求的soap body的不同,来组装ios的soap body
相关文章推荐
- Web Service学习笔记(webservice、soap、wsdl、jws详细分析) Webservice的wsdl文件解析与Soap消息的发送、接收(不生成java客户端代码)
- Webservice的wsdl文件解析与Soap消息的发送、接收(不生成java客户端代码)
- Smarty模板Windows下写代码 放到CentOS6.5无法正确解析
- CXF全接触(七) --- 通过WSDL自动生成WS代码
- 使用CXF将wsdl文件生成客户端代码命令
- 使用axis2解析wsdl生成Webservice客户端代码
- CXF中wsdl2java命令生成webService客户端代码
- wsdl2java无法生成客户端代码报错无法访问file
- wsdl文件用SoapUI快速创建WebService,CXF生成客户端代码
- [置顶] WSDL文件复杂类型的解析及其实例化代码生成
- java wsdl反向生成源码,并使用CXF实现客户端调用代码
- JAVA环境变量配置与cxf的wsdl2java命令生成客户端代码
- 为何由WSDL.exe生成的Web服务代理类无法正确的序列化枚举类型?因为……
- 利用CXF wsdl2java生成java代码以及使用Apache Axis 1.4 wsdl2java生成java代码
- 根据werservice代码用CXF生成WSDL
- CXF学习之旅(三) - 使用Maven根据WSDL生成生成Java代码
- 利用CXF和服务端代码生成WSDL文件
- 使用axis2解析wsdl反向生成webservice客户端代码