ios webservice+soap编程

ios 调用webservice已封装soap变量,直接调用就好。

完整项目:点击下载

//
//  SoapConn.m
//  WebServcieBySoap
//
//  Created by fengs on 14-11-17.
//  Copyright (c) 2014年 fengs. All rights reserved.
//

#import "SoapConn.h"
#import "GDataXMLNode.h"
#import "ASIHTTPRequest.h"
#import "NSString+XMLExtensions.h"

static SoapConn *sharedInstance = nil;
@implementation SoapConn
@synthesize printLog = _printLog;

#define WS_TIMEOUT 20.0

- (id)init{
    self = [super init];
    if (self) {
        _printLog = NO;
    }
    return self;
}

-(void)dealloc{
    if (sharedInstance) {
        [sharedInstance release];
        sharedInstance = nil;
    }
    [super dealloc];
}

+ (SoapConn *)sharedInstance {
    if (sharedInstance == nil) {
        sharedInstance = [[super alloc] init];
    }
    return sharedInstance;
}

+ (void)finish {
    if (sharedInstance) {
        [sharedInstance release];
        sharedInstance = nil;
    }
}

+(NSArray *)sortArray:(NSArray *)dataArray withKey:(NSString *)key ascending:(BOOL)ascending {
    if (!dataArray || !key) { return nil; }
    NSSortDescriptor *sortDescriptor = [[[NSSortDescriptor alloc] initWithKey:key ascending:ascending] autorelease];
    NSMutableArray *array = [[[NSMutableArray alloc] initWithArray:dataArray] autorelease];
    return [array sortedArrayUsingDescriptors:[NSArray arrayWithObject:sortDescriptor]];
}

/**
 * webservice 调用
 * @param soapURL:
    webservice 地址
 * @param NameSpace:
    webservice NameSpace
 * @param MethodName:
    webservice 方法名
 * @param Parameter:
    webservice 该方法下具体参数
 * @return NSString
 */
- (NSString*)WSCoreWithURL:(NSURL*)soapURL NameSpace:(NSString*)soapNameSpace MethodName:(NSString *)soapMethodName Parameter:(SoapConnParameter*)soapParameter
{
    if (!soapMethodName) {
        NSException *ex = [NSException exceptionWithName:@"Error" reason:@"Function WSCoreWithMethodName Parameter Invaild!"
                                                userInfo:nil];
        @throw ex;
    }
    NSString *soapAction;
    if ([soapNameSpace hasSuffix:@"/"]) {
        soapAction = [NSString stringWithFormat:@"%@%@",soapNameSpace,soapMethodName];
    } else {
        soapAction = [NSString stringWithFormat:@"%@/%@",soapNameSpace,soapMethodName];
    }
    NSString *soapMessage = @"<?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/\">\n"
    "<soap:Body>\n"
    "<!$methodName$! xmlns=\"!$nameSpace$!\">\n"
    "!$soapBody$!"
    "</!$methodName$!>\n"
    "</soap:Body>\n"
    "</soap:Envelope>";
    NSString *soapParamBody = @"";
    if (soapParameter) {
        NSArray *keys = [soapParameter getKeys];
        for (int i = 0; i< keys.count; i++) {
            NSString *paramKey = [keys objectAtIndex:i];
            NSObject *obj = [soapParameter getValueAtKeyIndex:i];
            if ([obj isKindOfClass:[NSNumber class]]) {
                soapParamBody = [soapParamBody stringByAppendingFormat:@"<%@>%@</%@>\n",
                                 paramKey,((NSNumber*)obj).stringValue,paramKey];
            } else if ([obj isKindOfClass:[NSData class]]) {
                NSString *encodingBytes = [ASIHTTPRequest base64forData:(NSData*)obj];
                soapParamBody = [soapParamBody stringByAppendingFormat:@"<%@>%@</%@>\n",
                                 paramKey,encodingBytes,paramKey];
            } else if ([obj isKindOfClass:[NSString class]]) {
                soapParamBody = [soapParamBody stringByAppendingFormat:@"<%@>%@</%@>\n",
                                 paramKey,[NSString encodeXMLCharactersIn:(NSString*)obj],paramKey];
            } else {
                soapParamBody = [soapParamBody stringByAppendingFormat:@"<%@>%@</%@>\n",
                                 paramKey,obj,paramKey];
            }
        }
    }
    soapMessage = [soapMessage stringByReplacingOccurrencesOfString:@"!$nameSpace$!" withString:soapNameSpace];
    soapMessage = [soapMessage stringByReplacingOccurrencesOfString:@"!$methodName$!" withString:soapMethodName];
    soapMessage = [soapMessage stringByReplacingOccurrencesOfString:@"!$soapBody$!" withString:soapParamBody];

    if (_printLog) {
        NSLog(@"Post:%@",soapMessage);
    }

    ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:soapURL];
    [request addRequestHeader:@"Content-Type" value:@"text/xml; charset=utf-8"];
    [request addRequestHeader:@"SOAPAction" value:soapAction];
    [request addRequestHeader:@"Content-Length" value:[NSString stringWithFormat:@"%d", [soapMessage length]]];
    [request appendPostData:[soapMessage dataUsingEncoding:NSUTF8StringEncoding]];
    [request setRequestMethod:@"POST"];
    [request setTimeOutSeconds:WS_TIMEOUT];
    [request startSynchronous];
    NSError *error = [request error];
    if (!error && [request responseStatusCode] == 200) {
        if (_printLog) {
            NSLog(@"Response String:%@",[request responseString]);
            NSLog(@"Get HTTP Response:%d Encoding:%d Length:%d",[request responseStatusCode],[request responseEncoding],
                  [request responseData].length);
        }
        NSString *content = [[[NSString alloc] initWithData:[request responseData] encoding:[request responseEncoding]] autorelease];
        NSString *returnContent = [self getXMLResultWithMethodName:soapMethodName soapXMLString:content];
        return returnContent;
    } else {
        if (_printLog) {
            if (error) {
                NSLog(@"%s Error:%@ ",__func__, error );
            } else {
                NSLog(@"%sCode:%d Encoding:%d Desc:%@",__func__, [request responseStatusCode],
                      [request responseEncoding],[request responseString]);
            }
        }
    }
    return nil;
}

/**
 * webservice 返回
 * @param methodName:
    webservice 方法名
 * @param soapXMLString:
    soap 返回信息
 * @return NSString
 */
-(NSString*)getXMLResultWithMethodName:(NSString*)methodName soapXMLString:(NSString*)soapXMLString{
    NSError *err = nil;
    GDataXMLDocument *soapXML = [[GDataXMLDocument alloc] initWithXMLString:soapXMLString
                                                                    options:0 error:&err];
    if (!soapXML) {
        return nil;
    }

    if (err) {
        [soapXML release];
        NSLog(@"%s %@",__func__, err);
        return nil;
    }

    NSString *retVal = @"";
    GDataXMLElement *rootElement = [soapXML rootElement];

    NSArray *result= [rootElement children];
    while ([result count]>0) {
        NSString *nodeName = [[result objectAtIndex:0] name];
        if ([nodeName isEqualToString: [NSString stringWithFormat:@"%@Result",methodName]]) {
            GDataXMLNode *resultNode = [result objectAtIndex:0];
            if ([resultNode childCount] > 0) {
                NSString *contentStr = [NSString decodeXMLCharactersIn:[resultNode XMLString]];
                contentStr = [contentStr stringByReplacingOccurrencesOfString:[NSString stringWithFormat:@"<%@>",nodeName] withString:@"" options:NSCaseInsensitiveSearch range:NSMakeRange(0, nodeName.length+2)];
                contentStr = [contentStr stringByReplacingOccurrencesOfString:[NSString stringWithFormat:@"</%@>",nodeName] withString:@"" options:NSCaseInsensitiveSearch range:NSMakeRange(contentStr.length - nodeName.length-3, nodeName.length+3)];
                retVal = contentStr;
            }
            break;
        }
        result = [[result objectAtIndex:0] children];
    }
    [soapXML release];
    return retVal;
}

@end
时间: 2024-11-18 19:40:28

ios webservice+soap编程的相关文章

iOS WebService Soap 请求遇到服务器400错误

由于参数过多,服务器采用url参数的方式传递数据(a=x&b=x),但是遇到服务器400错误,后来发现了原因,是由于url中包含了如:&这些特殊字符. 因为Soap是xml数据请求方式,&是xml的非法字符,所以就报400错误了,这时需要转义&,将&换成&就可以可以了. 字符转义参见篇文章:http://blog.csdn.net/assholeu/article/details/41649615

ios webservice编程:soap封装调用,返回xml,json解析

一.简介 webservice调用,包括soap请求与响应,返回(xml,json)解析. soap请求与响应:ios webservice+soap编程 xml,json解析:ios XML,JSON,数组解析并转换成NSMutableArray(List<class>) 二.项目 完整项目:点击下载 三.效果 soap请求与响应: xml,json解析:    

IOS开发——多线程编程

1."省电,流畅,优质应用,响应速度快,用户体验好--"也许是众多用户眼中的苹果系统. 2.在众手机商拼CPU主频,拼4核,8核的年代,苹果依然坚持双核,iphone用户体验仍然坚挺. 以上两点IOS是如何优化,在续航,流畅度和响应速度上完胜安卓,答案就是多线程&RunLoop... RunLoop是IOS事件响应与任务处理最核心机制,它贯穿IOS整个系统运作. RunLoop不像一般的线程循环等待任务,传统的线程循环等待任务会导致CPU时间被占用,虽然你设置了睡眠时间,但很多

iOS定位服务编程详解

现在的移动设备很多都提供定位服务,使用iOS系统的iPhone.iPod Touch和iPad都可以提供位置服务,iOS设备能提供3种不同途径进行定位:Wifi, 蜂窝式移动电话基站, GPS卫星 iOS 不像Android系统在定位服务编程时,可以指定采用哪种途径进行定位.iOS的API把底层这些细节屏蔽掉了,开发人员和用户并不知道现在设备是采用 哪种方式进行定位的,iOS系统会根据设备的情况和周围的环境,采用一套最佳的解决方案.这个方案是这样的,如果能够接收GPS信息,那么设备优先采用 GP

ios开发 网络编程浅析(一)

iphone包含了很多框架和库,从底层的套接字到不同层次的封装,可以方便地给程序添加网络功能. (1)BSD套接字.最底层的套接字,这是Unix网络开发常用的API.如果从其他系统移植程序,而程序用的是BSD套接字,那么网络部分可以继续使用这些API. (2)CFNetwork framework .CFNetwork 也是比较底层的, 是对BSD套接字的一个扩展 .它是一个C语言的库,它是基于BSD套接字,提供了对网络协议的抽象.这些抽象使得用户更容易地操作套接字.处理网络的各种连接..它集成

iOS之UI编程--霓虹灯的实现

学习UI编程已经有三四天了,这几天学习了一些初级的视图和控件,比如UIView,UIlabel以及UIButton.,学习UI编程,有一点乐趣就是自己写的代码可以看到效果了.这一点和C语言以及OC区别很大.于是我就尝试做了一个简单视图颜色变换的应用,也就是霓虹灯.实现的功能可以由里而外,也可以由外到里,还可以暂停.由于水平有限,再加上还没有学习NSTimer,只是从网上了解到了简单地应用,所以代码实现上可能会有些问题,算法不是最优的,还望大神们批评指点.贴上一张截图: 下面附上代码实现: #im

iOS网络高级编程:iPhone和iPad的企业应用开发之错误处理

本章内容 ●    iOS应用中的网络错误源 ●    检测网络的可达性 ●    错误处理的经验法则 ●    处理网络错误的设计模式 到目前为止,我们所介绍的iPhone与其他系统的网络交互都是基于一切正常这个假设.本章将会放弃这个假设,并深入探究网络的真实世界.在真实世界中,事情是会出错的,有时可能是非常严重的错误:手机进入与离开网络.包丢掉或是延迟:网络基础设施出错:偶尔用户还会出错.如果一切正常,那么编写iOS应用就会简单不少,不过遗憾的是现实并非如此.本章将会探讨导致网络操作失败的几

Webservice soap wsdl的区别

Web Service完结业务诉求:Web Service是真实“就事”的那个,供给一种就事接口的总称.WSDL供给“能办的事的文档阐明”:对要供给的效劳的一种描绘格局.我想帮你的忙,但是我要通知你我都能干啥,以及干这些工作需求的参数类型.SOAP供给“恳求”的规范:向效劳接口传递恳求的格局,包括办法和参数等.你想让人家就事,总得通知人家你想干啥吧,SOAP即是界说这个“恳求”的格局的,按照SOAP界说的“恳求”格局“书写”恳求就能够确保Web Service能够正确的解读你想让它干啥以及你为它

(转)iOS 各种网络编程总结--进程、线程、Socket、HTTP、TCP/IP、TCP和UDP

######################################################### 进程与线程 进程和线程都是由操作系统分配和调度的程序运行的基本单元,系统利用该基本单元实现系统对应用的并发性. 进程是一块包含了某些资源的内存区域.操作系统利用进程把它的工作划分为一些功能单元.进程中所包含的一个或多个执行单元称为线程(thread).进程还拥有一个私有的虚拟地址空间,该空间仅能被它所包含的线程访问. 线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更