用携程机票为例: 携程联盟 飞机票、门票 联盟ID:278639 站点ID:739462 密钥KEY:BE57B925-E8CE-4AA2-AC8E-3EE4BBBB686F API_URL:openapi.ctrip.com http://open.ctrip.com/InlandFlight/OTA_FlightSearch.aspx

1.首先在使用携程api的时候你需要明白什么是soap?

SOAP(SimpleObjectaccessPRotocal,简单对象访问协议)技术有助于实现大量异构程序和平台之间的互操作性,从而使存在的应用能够被广泛的用户所访问。SOAP是把成熟的基于HTTP的WEB技术与xml的灵活性和可扩展性组合在了一起。

2.作为ios开发者,当我们请求时需要xml格式的请求体就比较蛋疼了。今天带大家先简单看看soap,简单对象访问协议,或者叫做简单交换协议。我的理解就是我们在请求的时候发一个请求,这个请求带上xml格式请求体。然后呢,服务器在接受到我们xml请求体后,返回给我们一个xml结果。然后我们开始解析。就是这样的一个请求的过程。

3.那么有些同学可能会问了,怎么封装xml请求体呢?

NSString *soapBody =  [NSString stringWithFormat:@"<?xml version=\"1.0\" encoding=\"utf-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/\">"

"<soap:Body>"

//------下面是xml-----//

"<Request>"

"<Header AllianceID=\"278639\" SID=\"739462\" TimeStamp=\"1450326295\" Signature=\"4639A23E98A9141EFFC639F483828C3C\" RequestType=\"OTA_FlightSearch\" AsyncRequest=\"false\" Timeout=\"0\" MessagePriority=\"3\"/>"

"<HotelRequest>"

"<RequestBody xmlns:ns=\"http://www.opentravel.org/OTA/2003/05\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\">"

"<FlightSearchRequest>"

"<SearchType>%@</SearchType>"

"<Routes>"

"<FlightRoute>"

"<DepartCity>%@</DepartCity>"

"<ArriveCity>%@</ArriveCity>"

"<DepartDate>%@</DepartDate>"

"</FlightRoute>"

"</Routes>"

"<PriceTypeOptions>"

"</PriceTypeOptions>"

"<ProductTypeOptions>Normal</ProductTypeOptions>"

"<Classgrade>%@</Classgrade>"

"</FlightSearchRequest>"

"</RequestBody>"

"</HotelRequest>"

"</Request>"

//-----以上部分是xml-------//

"</soap:Body>"

"</soap:Envelope>",SearchType,DepartCity,ArriveCity,DepartDate,Classgrade];

4.那怎样post给服务器呢?

我们平常所说的xml请求体就是一个data,NSData,首先我们需要将字符串转换成为data,然后post给服务器。这样服务器在收到请求后就会回应我们。

//API_URL,接口地址

NSURL *url = [NSURL URLWithString:@"http://openapi.ctrip.com/Flight/DomesticFlight/OTA_FlightSearch.asmx"];

NSMutableURLRequest *request=[NSMutableURLRequest requestWithURL:url];

NSString *msgLength = [NSString stringWithFormat:@"%lu", (unsigned long)[soapBody length]];

[request addValue:@"text/xml; charset=utf-8" forHTTPHeaderField:@"Content-Type"];

[request addValue: @"http://ctrip.com/Request" forHTTPHeaderField:@"SOAPAction"];

[request addValue: msgLength forHTTPHeaderField:@"Content-Length"];

[request setHTTPMethod:@"POST"];

[request setHTTPBody:[soapBody dataUsingEncoding:NSUTF8StringEncoding]];

NSURLConnection *connection=[[NSURLConnection alloc] initWithRequest:request delegate:self];

if (connection) {

NSLog(@"机票查询成功了");

}    [connection start];

//5.设置代理<NSURLConnectionDelegate>,实现代理

/**

*  请求成功后返回的data

*

*  @param connection connection

*  @param data       数据

*/

- (void)connection:(NSURLConnection*)connection didReceiveData:(NSData*)data{

NSLog(@"%@",data);

NSString* strPartData=[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];

NSLog(@"=== %@", strPartData);

[self.strReceivedData appendString:strPartData];

}

6.开始解析,#import "GDataXMLNode.h"

- (void)connectionDidFinishLoading:(NSURLConnection *)connection{

NSLog(@"%@ connectionDidFinish.\n",self);

//通过字符串内容创建,GDataXMLDocument实例

NSError*error = nil;

GDataXMLDocument *doc = [[GDataXMLDocument alloc]initWithXMLString:self.strReceivedData options:0 error:&error];

if(error)

{

NSLog(@"Create GDataXMLDocument error,error code: %@",[error localizedDescription]);

return;

}

//首先查找到根元素

GDataXMLElement *rootElement = [doc rootElement];

//在根元素里面查找所有NAME为“Student"的子元素

}

SOAP-XML请求(iOS应用下集成携程api)的更多相关文章

  1. 最简单易懂的webService客户端之soap+xml请求

    代码准备: 1.网络上有提供一些免费的服务器测试地址,可以上这里找一找:https://my.oschina.net/CraneHe/blog/183471 2.我选择了一个翻译地址:http://w ...

  2. unity3d导出到IOS程序下 集成unity3dAR功能

    转载自: 来自AR学院(www.arvrschool.com),原文地址为:http://www.arvrschool.com/index.php?c=post&a=modify&ti ...

  3. app结合unity3D程序中遇到的问题 MapFileParser unity3d导出到IOS程序下 集成unity3dAR功能

    转载自: 来自AR学院(www.arvrschool.com),原文地址为:http://www.arvrschool.com/index.php?c=post&a=modify&ti ...

  4. [转] 携程App网络服务通道治理和性能优化@2016

    App网络服务的高可靠和低延迟对于无线业务稳定发展至关重要,过去两年来我们一直在持续优化App网络服务的性能,到今年Q2结束时基本完成了App网络服务通道治理和性能优化的阶段性目标,特此撰文总结其中的 ...

  5. 李洪强iOS开发支付集成之微信支付

    iOS开发支付集成之微信支付 微信支付也是需要签名的,也跟支付宝一样,可以在客户端签名,也可以在后台签名(当然,为了安全还是推荐在服务器上做签名,逻辑也比较好理解). 1 - 集成前首先要看看文档 开 ...

  6. iOS现有工程 集成 Cordova/Ionic

    首先, 新建 Cordova 项目就不说了, 步骤: http://ionicframework.com/getting-started/ , cordova生成的项目用cdv_project称呼, ...

  7. 携程apollo系列-客户端集成

    本文讲解如何在 Java 程序中集成 Apollo 配置, 主要涉及到一些基础用法. 对于一些高级用法, 比如如何加密/解密配置项 (可用于数据库密码配置), 如何动态切换数据源地址,如何动态切换日志 ...

  8. [iOS]一行代码集成空白页面占位图(基于runtime+MJRefresh思想)

    2018年01月03日阅读 2472   [iOS]一行代码集成空白页面占位图(基于runtime+MJRefresh思想) LYEmptyView 此框架是本人在5,6个月前,公司启动新项目的时候, ...

  9. 《疯狂iOS讲义(下)——iPhone/iPad高级应用与手游开发(含CD光盘1张)》

    <疯狂iOS讲义(下)——iPhone/iPad高级应用与手游开发(含CD光盘1张)> 基本信息 作者: 李刚    肖文吉 出版社:电子工业出版社 ISBN:9787121224379 ...

随机推荐

  1. Android Builder模式在开发中的应用

    最近在学习图片加载框架Glide的时候,被他精简的写法震惊了.一句话,就可以搞定. Glide.with(mContext) .load(url) .centerCrop() .placeholder ...

  2. 内存管理范围和@property

    管理范围: 管理任何继承NSObject的对象,对其他的基本数据类型无 效 本质原因是因为对象和其他数据类型在系统中的存储空间不一样,其它局部变量主要存放于 栈中,而对象存储于堆中,当代码块结束时这个 ...

  3. 搭建Maven私服

    最近从SVN下载的代码,在本地构建时出现了诸多问题,部分依赖下载超时,就想起在局域网搭建Maven私服,废话不说了,在测试服务器上建的已经成功,就随便找台机子再练习一遍顺道写个日志.1.前往http: ...

  4. JS获取浏览器名和版本信息

    Navigator 对象包含有关浏览器的信息. Navigator 对象属性和方法: <html> <head> <title>JS完整获取浏览器信息</ti ...

  5. MySQL分表自增ID解决方案

    当我们对MySQL进行分表操作后,将不能依赖MySQL的自动增量来产生唯一ID了,因为数据已经分散到多个表中. 应尽量避免使用自增IP来做为主键,为数据库分表操作带来极大的不便. 在postgreSQ ...

  6. Second glance in Go

    Github上的"the way to Go"翻譯有時候真讓人搞不懂,我經常會暈,比如 如果需要申明一个在外部定义的函数,你只需要给出函数名与函数签名,不需要给出函数体: func ...

  7. 编写Java应用程序。首先,定义描述学生的类——Student,包括学号(int)、 姓名(String)、年龄(int)等属性;二个方法:Student(int stuNo,String name,int age) 用于对对象的初始化,outPut()用于输出学生信息。其次,再定义一个主类—— TestClass,在主类的main方法中创建多个Student类的对象,使用这些对象来测 试Stud

    package zuoye; public class student { int age; String name; int stuNO; void outPut() { System.out.pr ...

  8. 数据处理/OLAP/OLTP

  9. MySQL创建索引语法

    1.介绍: 所有mysql索引列类型都可以被索引,对来相关类使用索引可以提高select查询性能,根据mysql索引数,可以是最大索引与最小索引,每种存储引擎对每个表的至少支持16的索引.总索引长度为 ...

  10. Java api 入门教程 之 JAVA的StringBuffer类

    StringBuffer类和String一样,也用来代表字符串,只是由于StringBuffer的内部实现方式和String不同,所以StringBuffer在进行字符串处理时,不生成新的对象,在内存 ...