Webservice 封装为 NSOperation 进行接口访问--IOS

iOS中对于 Webservice 的使用很频繁,在我的项目中我使用继承NSOperation的方式在ViewController 里直接使用进行接口访问,感觉使用起来比较方便,特别总结出来进行分享和讨论。

1.首先要导入ASIHTTPRequest 的全部文件,地址:http://code4app.com/ios/ASIHTTPRequest%E8%B0%83%E7%94%A8WebService/515111226803fa2a10000000

2.创建继承NSOperation的文件

1)MXNWebService.h

#import <Foundation/Foundation.h>


@protocol MXNWebServiceDelegate <NSObject>


-(void)MXNWebServiceNote;


@end


@interface MXNWebService : NSOperation

{

    NSMutableData *xmlData;

}


@property(nonatomic,strong)id<MXNWebServiceDelegate> delegate;


@property(nonatomic,strong,readonly)NSString *mark;

@property(strong,nonatomic)NSMutableData *xmlData;

@property(strong,nonatomic)NSString *result;


-(instancetype)initWithMark:(NSString *)mark;


-(void)setMobileCode:(NSString *)mobileCode;

-(void)setUserID:(NSString *)userID;


-(NSString *)getResultJson;



//block

typedef void (^MXNWebServiceBlock)();

@property(nonatomic,copy) MXNWebServiceBlock mxnWebServiceBlock;


@end


2)MXNWebService.m

#import <Foundation/Foundation.h>

#import "MXNWebService.h"

#import "NetWebServiceRequest.h"


@interface MXNWebService()<NetWebServiceRequestDelegate>

@property(nonatomic,strong,readwrite)NSString *mark;

@property(nonatomic,retain)NetWebServiceRequest *runningRequest;


@property(nonatomic,retain)NSString *_smethodName;


@property(nonatomic,retain)NSString *_smobileCode;

@property(nonatomic,retain)NSString *_suserID;




@property(nonatomic,retain)NSString *_resultJson;




@end

@implementation MXNWebService

@synthesize runningRequest=_runningRequest;

@synthesize xmlData;


@synthesize _smethodName;

@synthesize _smobileCode;

@synthesize _suserID;



@synthesize _resultJson;


-(instancetype)initWithMark:(NSString *)mark

{

    self=[superinit];

    if(self)

    {

        self.mark=mark;

    }

    returnself;

}


-(void)setmethodName:(NSString *)methodName  //设置方法名

{

    self._smethodName=methodName;

}


-(void)setMobileCode:(NSString *)mobileCode    //根据不同的方法设置不同的参数,通过这一个类基本可以实现整个项目的WebService访问

{

    self._smobileCode=mobileCode;

}


-(void)setUserID:(NSString *)userID

{

    self._suserID=userID;

}


-(NSString *)getParamList//此处可以设置对不同的方法设置不同的参数列表

{

    NSString *list;

    if ([_smethodNameisEqualToString:@"getMobileCodeInfo"]) {

        list=[NSStringstringWithFormat:

              @"<mobileCode>%@</mobileCode>\n"

              "<userID>%@</userID>\n"

              ,_smobileCode,_suserID];

    }

    

    return list;

}


-(void)main

{

    

    NSString *soapMessage_start=[NSStringstringWithFormat:

                                 @"<?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"

                                 "<%@ xmlns=\"http://WebXml.com.cn/\">\n"

                                 ,_smethodName];

    

    NSString *soapMessage_param=[selfgetParamList];

    

    NSString *soapMessage_end=[NSStringstringWithFormat:

                               @"</%@>\n"

                               "</soap:Body>\n"

                               "</soap:Envelope>\n",_smethodName];

    NSString *soapMessage=[[soapMessage_startstringByAppendingString:soapMessage_param]stringByAppendingString:soapMessage_end];


    //NSLog(@"%@",soapMessage);

    

    //请求发送到的路径

    NSString *url =@"http://webservice.webxml.com.cn/WebServices/MobileCodeWS.asmx";

    NSString *soapActionURL = [@"http://WebXml.com.cn/"stringByAppendingString:_smethodName];

    NSLog(@"soapActionURL:%@",soapActionURL);

    NetWebServiceRequest *request = [NetWebServiceRequestserviceRequestUrl:urlSOAPActionURL:soapActionURLServiceMethodName:_smethodNameSoapMessage:soapMessage];

    

    [request startAsynchronous];

    [request setDelegate:self];

    self.runningRequest = request;

}

#pragma mark NetWebServiceRequestDelegate Methods

- (void)netRequestStarted:(NetWebServiceRequest *)request

{

    NSLog(@"Start");

}

- (void)netRequestFinished:(NetWebServiceRequest *)request

      finishedInfoToResult:(NSString *)result

              responseData:(NSData *)requestData{

    NSLog(@"%@:返回结果%@",_smethodName,result);

    self._resultJson=result;

    

    

    if (self.mxnWebServiceBlock) {     //通过设置block实现异步加载后对调用它的视图控制器里进行界面的更新或其它操作

        

        self.mxnWebServiceBlock();

    }

}


- (void)netRequestFailed:(NetWebServiceRequest *)request didRequestError:(NSError *)error{

    CLog(@"%@:%@",_smethodName,error);

    self._resultJson=@"MXNError";

    

    

    if (self.mxnWebServiceBlock) {

        

        self.mxnWebServiceBlock();

    }

    

}

-(NSString *)getResultJson

{

    

    return_resultJson;

}


@end



3.调用这个NSOperation

#import "AppDelegate.h"

#import "MXNWebService.h"

#import "NetWebServiceRequest.h"



    NSOperationQueue *mxnQueue;

    mxnQueue=[[NSOperationQueuealloc]init];

    mxnQueue.name=@"mxn";

    mxnQueue.maxConcurrentOperationCount=2;

    

    MXNWebService *mxnWeb=[[MXNWebServicealloc]initWithMark:@"mxnweb"]; 

    [mxnWeb setmethodName:@"getMobileCodeInfo"];

    [mxnWeb setMobileCode:@"15022512043"];

    [mxnWeb setUserID:@""];

    

    [mxnQueue addOperation:mxnWeb];

    mxnWeb.delegate=self;

    mxnWeb.mxnWebServiceBlock=^(){

        NSString *result=[mxnWebgetResultJson];

        //此处根据异步返回的结果进行操作

    };


这样使用起来感觉比较方便,有更简便的方法欢迎讨论交流。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在HTTP请求中启用WS-Addressing属性,您需要做以下几个步骤: 1. 导相关的命名空间 ```python from zeep import Client from zeep.wsse.username import UsernameToken from zeep.wsse import Signature, BinarySignature from zeep.wsse.signature import SignatureVerificationFailed from zeep.transports import Transport from zeep.ws.addressing import Address ``` 2. 创建一个Transport对象并设置相关的属性,包括WS-Addressing属性 ```python transport = Transport() transport.session.headers['Content-Type'] = 'application/soap+xml; charset=utf-8' transport.session.headers['SOAPAction'] = '' transport.session.headers['Accept-Encoding'] = 'gzip,deflate' transport.session.headers['Accept'] = 'application/soap+xml' transport.session.headers['Connection'] = 'Keep-Alive' transport.session.headers['User-Agent'] = 'Mozilla/4.0 (compatible; MSIE 6.0; MS Web Services Client Protocol 4.0.30319.42000)' transport.session.headers['Host'] = 'example.com' client = Client('http://example.com/path/to/wsdl', transport=transport) header = Address() header.set('To', 'http://example.com/path/to/service') header.set('Action', 'http://example.com/path/to/action') header.set('MessageID', 'urn:uuid:6d0ee4b0-92e9-11e9-bc42-526af7764f64') header.set('ReplyTo', 'http://www.w3.org/2005/08/addressing/anonymous') header.set('From', {'Address': 'http://example.com/path/to/from', 'ReferenceParameters': {'Token': '1234'}}) client.set_default_soapheaders([header]) ``` 3. 调用webservice接口 ```python result = client.service.your_service_method(your_params) ``` 这些代码中的WS-Addressing属性是用Address类创建的,其中包括To、Action、MessageID、ReplyTo和From属性。这些属性中的值应该是根据您的webservice接口的要求设置的。 希望这可以帮助您启用WS-Addressing属性并调用webservice接口

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值