WSDL2OBJC直接生成的代码是无法正确发送CXF能解析的数据包

首先, WSDL2OBJC直接生成的代码是无法正确发送CXF能解析的数据包的

我懒得去看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




 

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值