您的位置:首页 > 编程语言

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

2011-12-31 08:42 411 查看
首先, 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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: