加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

使用ASIHttpRequest调用WebService

发布时间:2020-12-16 23:44:29 所属栏目:安全 来源:网络整理
导读:转自 ?http://www.cocoachina.com/bbs/read.php?tid=98388 工作中,使用iPhone作为已有产品的移动终端,目前做能想到最理想的方式就是恳求产品提供WebService了,还是老习惯,坚决不要零散的代码,继续整理为通用的类,便于拉壮丁快速开发,虽然目前的壮丁就

转自 ?http://www.cocoachina.com/bbs/read.php?tid=98388


工作中,使用iPhone作为已有产品的移动终端,目前做能想到最理想的方式就是恳求产品提供WebService了,还是老习惯,坚决不要零散的代码,继续整理为通用的类,便于拉壮丁快速开发,虽然目前的壮丁就俺一个,hoho

再次利用现有的资源,使用了ASIHttpRequest v1.8.1,因为项目中使用了Windows集成验证,而这个东西正好提供了响应的验证方式,爽歪歪了。
还是那句话:只是单纯的希望,大家都能有共享学习的精神!
再一个,项目都是.Net相关的,在浏览器中访问.Net WebService的asmx文件时,会返回一系列帮助文件,让我们了解这个WebService有几个调用方法,每个方法的入口参数是什么,返回值是什么,这次使用了SOAP1.1的规范。
再再一个,这个类并不完善,WebService某个方法的参数,必须是简单的数据类型,如数值、字符等等,不支持数据集等对象,等以后需要了再完善吧,呵呵。
再再再一个,调用后的响应解析,是另一个课题,不在这里讲啦,预报下,如果响应中包含了.Net的数据集,也是自己写了通用类可以解析滴,嘎嘎。
再再再再一个,保证是最后一个再了,代码里面看到这个 [Constant sharedConstant].P_SYSTEM_URL ,就去看看前一篇文章吧,单例模式实现常量存储,哈哈。
1、先看看调用说明:
自定义WebService访问类,需要使用下面这个字符串作为SOAP请求,通过POST的方式,提交给WebService

[objc]? view plain copy

在CODE上查看代码片

派生到我的代码片

  1. POST?/iwscooperationws/todocenter.asmx?HTTP/1.1??
  2. Host:?192.168.1.11??
  3. Content-Type:?text/xml;?charset=utf-8??
  4. Content-Length:?length??
  5. SOAPAction:?"http://iws.CP.ws/GetWorkflowToDoCount"??
  6. ???
  7. <?xml?version="1.0"?encoding="utf-8"?>??
  8. <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/">??
  9. ??<soap:Body>??
  10. ????<GetWorkflowToDoCount?xmlns="http://iws.CP.ws/">??
  11. ??????<UserName>string</UserName>??
  12. ????</GetWorkflowToDoCount>??
  13. ??</soap:Body>??
  14. </soap:Envelope>??


?
在上述的XML中,可以看到这个asmx提供了一个GetWorkflowToDoCount的方法,其参数是UserName,其中的 http://iws.CP.ws/ 是WebService中自己定义的命名空间。经过对几个WebService的实验发现,除了这几个字符串之外,都是不变的东西,那么这个长长的串串,就复制粘贴留下来,等下一步利用之。

2、.h文件中的声明,注释都放到了.m文件中,这是个人习惯:

派生到我的代码片

    +?(ASIHTTPRequest?*)getASISOAP11Request:(NSString?*)?WebURL??
  1. ?????????????????????????webServiceFile:(NSString?*)?wsFile??
  2. ???????????????????????????xmlNameSpace:(NSString?*)?xmlNS??
  3. ?webServiceName:(NSString?*)?wsName??
  4. ?wsParameters:(NSMutableArray?*)?wsParas;??
  5. +?(NSString?*)getSOAP11WebServiceResponse:( ?????????????????????????? ????????????????????????????NSString?*)getSOAP11WebServiceResponseWithNTLM:( ?????????????????????????????????? ????????????????????????????????????NSMutableArray?*)?wsParas??
  6. ????????????????????????????????????????userName:(NSString?*)?userName??
  7. ?????????????????????????????????????????passWord:(NSString?*)?passWord;??
  8. NSString?*)checkResponseError:(NSString?*)?theResponse;??

?

3、.m文件的实现之一,生成ASIHttpRequest请求:

派生到我的代码片

    /*?
  1. //Mark:?生成SOAP1.1版本的ASIHttp请求?
  2. ?参数?webURL:????????????????远程WebService的地址,不含*.asmx?
  3. ?参数?webServiceFile:????????远程WebService的访问文件名,如service.asmx?
  4. ?参数?xmlNS:????????????????????远程WebService的命名空间?
  5. ?参数?webServiceName:????????远程WebService的名称?
  6. ?参数?wsParameters:????????????调用参数数组,形式为[参数1名称,参数1值,参数2名称,参数2值??],如果没有调用参数,此参数为nil?
  7. ?*/??
  8. {??
  9. ????//1、初始化SOAP消息体??
  10. ????NSString?*?soapMsgBody1?=?[[NSString?alloc]?initWithFormat:??
  11. ???????????????????????????????@"<?xml?version="1.0"?encoding="utf-8"?>n"??
  12. ???????????????????????????????"<soap:Envelope?xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"?n"??
  13. ???????????????????????????????"xmlns:xsd="http://www.w3.org/2001/XMLSchema"?n"??
  14. ???????????????????????????????"xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">n"??
  15. ???????????????????????????????"<soap:Body>n"??
  16. ???????????????????????????????"<%@?xmlns="%@">n",?wsName,?xmlNS];??
  17. ????NSString?*?soapMsgBody2?=?[[NSString?initWithFormat:??
  18. ???????????????????????????????@"</%@>n"??
  19. ???????????????????????????????"</soap:Body>n"??
  20. ???????????????????????????????"</soap:Envelope>",0); background-color:inherit">?wsName];??
  21. ???????
  22. ????//2、生成SOAP调用参数??
  23. NSString?*?soapParas?=?[[NSString?init];??
  24. ????soapParas?=?@"";??
  25. if?(![wsParas?isEqual:nil])?{??
  26. ????????int?i?=?0;??
  27. ????????for?(i?=?0;?i?<?[wsParas?count];?i?=?i?+?2)?{??
  28. ????????????soapParas?=?[soapParas?stringByAppendingFormat:@"<%@>%@</%@>n",??
  29. ?????????????????????????[wsParas?objectAtIndex:i],??
  30. ?????????????????????????[wsParas?objectAtIndex:i+1],0); background-color:inherit">?objectAtIndex:i]];??
  31. ????????}??
  32. ????}??
  33. ???????
  34. //3、生成SOAP消息??
  35. NSString?*?soapMsg?=?[soapMsgBody1?stringByAppendingFormat:@"%@%@",?soapParas,0); background-color:inherit">?soapMsgBody2];??
  36. //请求发送到的路径??
  37. NSURL?*?url?=?[NSURL?URLWithString:[NSString?stringWithFormat:@"%@%@",?WebURL,0); background-color:inherit">?wsFile]];??
  38. //NSMutableURLRequest?*theRequest?=?[NSMutableURLRequest?requestWithURL:url];??
  39. ASIHTTPRequest?*?theRequest?=?[ASIHTTPRequest?requestWithURL:url];??
  40. NSString?*msgLength?=?[NSString?stringWithFormat:@"%d",?[soapMsg?length]];??
  41. //以下对请求信息添加属性前四句是必有的,第五句是soap信息。??
  42. ????[theRequest?addRequestHeader:@"Content-Type"?value:@"text/xml;?charset=utf-8"];??
  43. ????[theRequest?addRequestHeader:@"SOAPAction"?value:[NSString?wsName]];??
  44. ?addRequestHeader:@"Content-Length"?value:msgLength];??
  45. ?setRequestMethod:@"POST"];??
  46. ?appendPostData:[soapMsg?dataUsingEncoding:NSUTF8StringEncoding]];??
  47. ?setDefaultResponseEncoding:NSUTF8StringEncoding];??
  48. return?theRequest;??
  49. }??

4、.m文件的实现之二,同步调用WebService请求,返回响应字符串

派生到我的代码片

    #pragma?mark?-??
  1. /*?
  2. ?//Mark:?使用SOAP1.1同步调用WebService请求?
  3. ?参数?webURL:????????????????远程WebService的地址,不含*.asmx?
  4. ?参数?webServiceFile:????????远程WebService的访问文件名,如service.asmx?
  5. ?参数?xmlNS:????????????????????远程WebService的命名空间?
  6. ?参数?webServiceName:????????远程WebService的名称?
  7. ?参数?wsParameters:????????????调用参数数组,形式为[参数1名称,参数1值,参数2名称,参数2值??],如果没有调用参数,此参数为nil?
  8. ?*/??
  9. +?(NSString?*)?WebURL??
  10. NSString?*)?wsFile??
  11. ????????????????????????????NSString?*)?xmlNS??
  12. NSString?*)?wsName??
  13. NSMutableArray?*)?wsParas??
  14. {??
  15. //创建请求??
  16. ASIHTTPRequest?*?theRequest?=?[self?getASISOAP11Request:WebURL??
  17. ?????????????????????????????????????????????webServiceFile:wsFile??
  18. ???????????????????????????????????????????????xmlNameSpace:xmlNS??
  19. ?webServiceName:wsName??
  20. ?wsParameters:wsParas];??
  21. //显示网络请求信息在status?bar上??
  22. ????[ASIHTTPRequest?setShouldUpdateNetworkActivityIndicator:YES];??
  23. //同步调用??
  24. ?startSynchronous];??
  25. NSError?*error?=?[theRequest?error];??
  26. if?(!error)?{??
  27. return?[theRequest?responseString];??
  28. else?{??
  29. ????????//出现调用错误,则使用错误前缀+错误描述??
  30. return?[NSString?sharedConstant].G_WEBSERVICE_ERROR,?[error?localizedDescription]];??
  31. 5、.m文件实现之三,同步调用需要Windows集成验证的WebService请求,返回响应字符串:

    派生到我的代码片

      ?//Mark:?使用SOAP1.1同步调用WebService请求,需提供Windows集成验证的用户名、密码和域?
    1. ?参数?userName????????????????用户名--目前来看,不需要输入域信息?
    2. ?参数?passWord????????????????密码?
    3. ?????????????????????????????????? ????????????????????????????????????NSString?*)?userName??
    4. ????????????????????????????????????????NSString?*)?passWord??
    5. //集成验证NTLM用户名,密码和域设置??
    6. ?setUsername:userName];??
    7. ?setPassword:passWord];??
    8. //[theRequest?setDomain:doMain];??
    9. //显示网络请求信息在status?bar上??
    10. ????[ASIHTTPRequestYES];??
    11. //同步调用??
    12. ?startSynchronous];??
    13. ?error];??
    14. if?(!error)?{??
    15. ?responseString];??
    16. ????}??
    17. else?{??
    18. ????????//出现调用错误,则使用错误前缀+错误描述??
    19. ?localizedDescription]];??
    20. }??

    6、.m文件实现之四,响应字符串中是否包含错误信息,简单处理了下错误消息的中文显示:

    派生到我的代码片

      ?//Mark:?检查WebService的Response是否包含错误信息?
    1. ????如果未包含错误,则返回零长度字符串?
    2. ????否则返回错误描述?
    3. ????错误信息格式:错误前缀n错误描述?
    4. NSString?*)?theResponse??
    5. //检查消息是否包含错误前缀??
    6. if?(![theResponse?hasPrefix:[Constant?sharedConstant].G_WEBSERVICE_ERROR])?{??
    7. return?@"";??
    8. NSMutableString?*sTemp?=?[[NSMutableString?initWithString:theResponse];??
    9. //获取错误前缀的范围??
    10. ????????NSRange?range=[sTemp?rangeOfString:[Constant?sharedConstant].G_WEBSERVICE_ERROR];??
    11. //剔除错误前缀??
    12. ????????[sTemp?replaceCharactersInRange:range?withString:@""];??
    13. ???????????
    14. NSString?*?errMsg?=?sTemp;??
    15. //Authentication?needed??
    16. if?([sTemp?isEqualToString:@"Authentication?needed"])?{??
    17. ????????????errMsg?=?@"用户登录失败!";??
    18. ????????}??
    19. //The?request?timed?out??
    20. ?isEqualToString:@"The?request?timed?out"])?{??
    21. ????????????errMsg?=?@"访问超时,请检查远程地址等基本设置!";??
    22. //The?request?was?cancelled??
    23. ?isEqualToString:@"The?request?was?cancelled"])?{??
    24. ????????????errMsg?=?@"请求被撤销!";??
    25. //Unable?to?create?request?(bad?url?)??
    26. ?isEqualToString:@"Unable?to?create?request?(bad?url?)"])?{??
    27. ????????????errMsg?=?@"无法创建请求,错误的URL地址!";??
    28. //The?request?failed?because?it?redirected?too?many?times??
    29. ?isEqualToString:@"The?request?failed?because?it?redirected?too?many?times"])?{??
    30. ????????????errMsg?=?@"请求失败,可能是因为被重定向次数过多!";??
    31. //A?connection?failure?occurred??
    32. ?isEqualToString:@"A?connection?failure?occurred"])?{??
    33. ????????????errMsg?=?@"网络连接错误,请检查无线或3G网络设置!";??
    34. return?errMsg;??
    35. 7、开始调用啦:

      派生到我的代码片

        //创建WebService的调用参数??
      1. NSMutableArray?*?wsParas?=?[[NSMutableArray?initWithObjects:??
      2. ????????????????????????????@"UserName",0); background-color:inherit">?sharedConstant].P_USER_NAME,248); line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important"> ????????????????????????????nil?nil];??
      3. ???
      4. //调用WebService,获取响应??
      5. NSString?*?theResponse?=?[WebService?getSOAP11WebServiceResponseWithNTLM:[Constant?sharedConstant].P_SYSTEM_URL??????????
      6. ??????????????????????????????????????????????????????????webServiceFile:[Constant?sharedConstant].G_WS_TODOCENTER??
      7. ????????????????????????????????????????????????????????????xmlNameSpace:[Constant?sharedConstant].G_WEBSERVICE_NAMESPACE??
      8. ?webServiceName:[Constant?sharedConstant].G_WS_TODOCENTER_GETWORKFLOWTODOCOUNT??
      9. ?wsParameters:wsParas??
      10. ????????????????????????????????????????????????????????????????userName:[Constant?sharedConstant].P_USER_NAME??
      11. ????????????????????????????????????????????????????????????????passWord:[Constant?sharedConstant].P_PASSWORD];??
      12. //检查响应中是否包含错误??
      13. NSString?*?errMsg?=?[WebService?checkResponseError:theResponse];??
      14. //接下来的代码就是检查errMsg有没有内容??
      15. //再接下来就是theResponse响应字符串的解析了??

      注意这个调用例子里面的WebService的参数UserName和调用windows集成验证时提供的userName,是两回事啊??

      (编辑:李大同)

      【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读