ios Communicating with HTTP Servers 与HTTP服务器通信 官方文档翻译(五)

原文地址:developer

时间过的很快,一眨眼周末就过了。人的一生到底怎么样才能过的有意义呢?我一直在找答案。做自己喜欢的事情,爱自己喜欢的人,或是成就一番伟业。都是不错的选择,找到自己想要做的事情,不要放弃寻找。最终生命带走的只能是珍贵的回忆,晚上快乐。

与HTTP服务器通信

本章解释了如何创建、发送和接收HTTP请求和响应。

创建一个CFHTTP请求

组成一个HTTP请求消息的远程服务器执行的方法,对象操作(URL),消息头和消息体。方法通常是下列之一:GET,
HEAD, PUT, POST, DELETE, TRACE, CONNECT or OPTIONS。创建一个HTTP请求与CFHTTP需要四个步骤:

1.使用CFHTTPMessageCreateRequest函数生成一个CFHTTP消息对象。

2.使用函数CFHTTPMessageSetBody设置消息的主体。

3.设置消息的标题使用CFHTTPMessageSetHeaderFieldValue函数。

4.CFHTTPMessageCopySerializedMessage通过调用函数序列化消息。

示例代码看起来就像清单3中的代码。

CFStringRef bodyString = CFSTR(""); // Usually used for POST data

CFDataRef bodyData = CFStringCreateExternalRepresentation(kCFAllocatorDefault,

bodyString, kCFStringEncodingUTF8, 0);

CFStringRef headerFieldName = CFSTR("X-My-Favorite-Field");

CFStringRef headerFieldValue = CFSTR("Dreams");

CFStringRef url = CFSTR("http://www.apple.com");

CFURLRef myURL = CFURLCreateWithString(kCFAllocatorDefault, url, NULL);

CFStringRef requestMethod = CFSTR("GET");

CFHTTPMessageRef myRequest =

CFHTTPMessageCreateRequest(kCFAllocatorDefault, requestMethod, myURL,

kCFHTTPVersion1_1);

CFDataRef bodyDataExt = CFStringCreateExternalRepresentation(kCFAllocatorDefault, bodyData, kCFStringEncodingUTF8, 0);

CFHTTPMessageSetBody(myRequest, bodyDataExt);

CFHTTPMessageSetHeaderFieldValue(myRequest, headerFieldName, headerFieldValue);

CFDataRef mySerializedRequest = CFHTTPMessageCopySerializedMessage(myRequest);

这个示例代码,url是通过调用CFURLCreateWithString首先转换成一个CFURL对象。然后用四个参数:CFHTTPMessageCreateRequest叫做kCFAllocatorDefault指定默认的系统内存分配器是用于创建消息引用,requestMethod指定方法,如POST方法,myURL指定URL,如http://www.apple.com,kCFHTTPVersion1_1指定消息的HTTP版本是1.1。

返回的消息对象引用(myRequest)CFHTTPMessageCreateRequest然后送到CFHTTPMessageSetBody随着消息的主体(bodyData)。然后调用CFHTTPMessageSetHeaderFieldValue使用相同的消息对象引用的名字一起头(headerField)和价值(价值)。头参数是CFString对象等内容长度,和值参数是CFString对象如1260。最后,通过调用CFHTTPMessageCopySerializedMessage消息序列化,应该通过写流发送到接收者,在这个例子中http://www.apple.com。

注意:请求主体通常省略。主要将使用请求主体是一个POST请求包含POST数据。它也可以用于其他WebDAV等有关HTTP请求类型的扩展。有关更多信息,请参见RFC
2616

当消息不再需要时,释放消息序列化对象和消息。参见清单3的示例代码

CFRelease(myRequest);

CFRelease(myURL);

CFRelease(url);

CFRelease(mySerializedRequest);

myRequest = NULL;

mySerializedRequest = NULL;

创建一个CFHTTP响应

创建一个HTTP响应几乎完全相同的步骤创建一个HTTP请求。唯一的区别是,而不是调用CFHTTPMessageCreateRequest,你调用函数CFHTTPMessageCreateResponse使用相同的参数。

反序列化传入的HTTP请求

反序列化传入的HTTP请求,创建一个空的消息使用CFHTTPMessageCreateEmpty函数,传递真实的isRequest参数指定要创建一个空的请求消息。然后使用函数CFHTTPMessageAppendBytes将传入消息添加到空的请求消息里。CFHTTPMessageAppendBytes反序列化消息并移除任何可能包含的控制信息。

继续这样做,直到函数CFHTTPMessageIsHeaderComplete返回TRUE。如果你不检查CFHTTPMessageIsHeaderComplete返回TRUE,消息可能是不完整的和不可靠的。一个示例使用清单3
- 3中可以看到这两个函数。

CFHTTPMessageRef myMessage = CFHTTPMessageCreateEmpty(kCFAllocatorDefault, TRUE);

if (!CFHTTPMessageAppendBytes(myMessage, &data, numBytes)) {

//Handle parsing error

}

在这个示例中,数据是附加的数据和numBytes数据的长度。你可能想叫CFHTTPMessageIsHeaderComplete附加消息的验证头就完成了。

if (CFHTTPMessageIsHeaderComplete(myMessage)) {

// Perform processing.

}

反序列化的消息,您现在可以从以下函数提取信息:

1.CFHTTPMessageCopyBody消息正文的一个副本

2.CFHTTPMessageCopyHeaderFieldValue获得特定的header字段值的副本

3.CFHTTPMessageCopyAllHeaderFields拿到一份所有消息的头字段

4.CFHTTPMessageCopyRequestURL的消息副本的URL

5.CFHTTPMessageCopyRequestMethod得到消息的请求方法的副本

当你不再需要信息,就释放,正确的处理它。

反序列化传入的HTTP响应

就像创建一个HTTP请求非常类似于创建一个HTTP响应,反序列化传入HTTP请求也非常类似于反序列化传入的HTTP响应。唯一重要的区别是,当调用CFHTTPMessageCreateEmpty,你必须通过isRequest参数指定要创建的消息是一个响应消息

使用读取流序列化并发送HTTP请求

您可以使用一个CFReadStream对象序列化和发送CFHTTP请求。当你使用CFReadStream CFHTTP请求对象发送,打开流导致消息序列化和发送在一个步骤。使用CFReadStream对象发送CFHTTP请求让我们更加容易的请求的响应,因为响应是可用属性的流。

序列化并发送一个HTTP请求

使用CFReadStream对象序列化并发送一个HTTP请求,首先创建一个CFHTTP请求和设置消息正文和标题中描述创建一个CFHTTP请求。然后创建一个CFReadStream对象通过调用函数CFReadStreamCreateForHTTPRequest和通过请求您刚刚创建的。最后,用CFReadStreamOpen打开读取流。

当CFReadStreamCreateForHTTPRequest被调用时,它通过CFHTTP复制请求对象。因此,如果有必要,你可以调用CFReadStreamCreateForHTTPRequest后立即释放CFHTTP请求对象。

因为读流与服务器打开一个套接字连接指定的myUrl参数CFHTTP请求创建时,一段时间前必须允许通过流被认为是开放的。打开读取流也让请求序列化和发送。

如何序列化和发送一个HTTP请求可以看清单3 - 4所示。

CFStringRef url = CFSTR("http://www.apple.com");

CFURLRef myURL = CFURLCreateWithString(kCFAllocatorDefault, url, NULL);

CFStringRef requestMethod = CFSTR("GET");

CFHTTPMessageRef myRequest = CFHTTPMessageCreateRequest(kCFAllocatorDefault,

requestMethod, myUrl, kCFHTTPVersion1_1);

CFHTTPMessageSetBody(myRequest, bodyData);

CFHTTPMessageSetHeaderFieldValue(myRequest, headerField, value);

CFReadStreamRef myReadStream = CFReadStreamCreateForHTTPRequest(kCFAllocatorDefault, myRequest);

CFReadStreamOpen(myReadStream);

检查响应

调度的请求run loop之后,你最终会得到一个头完成回调。在这一点上,你可以叫CFReadStreamCopyProperty阅读得到的消息响应流

CFHTTPMessageRef myResponse = (CFHTTPMessageRef)CFReadStreamCopyProperty(myReadStream, kCFStreamPropertyHTTPResponseHeader);

你可以得到完整的状态行CFHTTPMessageCopyResponseStatusLine响应消息通过调用函数:

CFStringRef myStatusLine = CFHTTPMessageCopyResponseStatusLine(myResponse);

或者只是响应消息的状态代码CFHTTPMessageGetResponseStatusCode通过调用函数

UInt32 myErrCode = CFHTTPMessageGetResponseStatusCode(myResponse);

注意:如果您正在使用这个类同步(没有调用run loop),你必须开始阅读消息通过至少一个调用CFReadStreamRead调用CFReadStreamCopyProperty之前。CFReadStreamRead调用直到数据块(或连接失败)是可用的。不要在你的主应用程序线程上做这个。

处理身份验证错误

如果返回的状态码函数CFHTTPMessageGetResponseStatusCode是401(远程服务器需要身份验证信息)或407(代理服务器需要身份验证),您需要将身份验证信息附加到请求和发送一遍。请阅读
Communicating with Authenticating HTTP Servers 如何处理身份验证。

处理重定向错误

当CFReadStreamCreateForHTTPRequest创建一个读流,自动重定向流默认情况下是禁用的。如果统一资源定位符,或者URL,该URL发送请求重定向到另一个,发送请求将导致一个错误的状态码300到307不等。如果你收到一个重定向错误,你需要关闭流,创建流再次启用自动重定向,并打开流。参见清单3
- 5

CFReadStreamClose(myReadStream);

CFReadStreamRef myReadStream =

CFReadStreamCreateForHTTPRequest(kCFAllocatorDefault, myRequest);

if (CFReadStreamSetProperty(myReadStream, kCFStreamPropertyHTTPShouldAutoredirect, kCFBooleanTrue) == false) {

// something went wrong, exit

}

CFReadStreamOpen(myReadStream);

你当你创建一个读取流可能想要启用自动重定向。

取消一个未决请求

一旦请求已经发送,它是不可能阻止远程服务器代理。然而,如果你不再关心响应数据,您可以关闭流。

重要:不要从任何线程关闭流,另一个线程正在等待该流的内容。如果你需要能够终止请求时,您应该使用非阻塞I / O防止所述阻塞在处理流。一定要run
loop关闭之前删除流。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-06 22:51:13

ios Communicating with HTTP Servers 与HTTP服务器通信 官方文档翻译(五)的相关文章

iOS Communicating with Authenticating HTTP Servers 与HTTP服务器通信认证 官方文档翻译(六)

原文地址:developer 召集翻译人手:请加入486111671  ios 官方文档翻译                                                            与HTTP服务器通信认证 本章描述了如何与HTTP服务器身份验证利用CFHTTPAuthentication API.它解释了如何找到匹配验证对象和凭证,将它们应用到一个HTTP请求,并将它们存储供以后使用. 一般来说,如果一个HTTP服务器将返回一个401或407响应后你的HTTP请求

与HTTP服务器通信(Communicating with HTTP Servers)

本文解释了如何创建.发送和接收HTTP请求和响应. 创建一个CFHTTP请求 HTTP请求是一个消息,这个消息由远程服务器执行的方法,操作的对象(URL),消息头和消息体.方法通常是下面之一:GET, HEAD, PUT, POST, DELETE, TRACE, CONNECT 或OPTIONS.用CFHTTP创建一个HTTP请求分为四个步骤: 使用CFHTTPMessageCreateRequest 函数生成CFHTTP消息对象 使用CFHTTPMessageSetBody函数设置消息体 使

与身份验证HTTP服务器通信(Communicating with Authenticating HTTP Servers)

本文描述了如何利用CFHTTPAuthentication API与需要身份验证的HTTP服务器通信.它解释了如何找到匹配的验证对象和证书,并将它们应用到HTTP请求,然后存储以供以后使用. 一般来说,如果一个HTTP服务器返回一个401或407响应你的HTTP请求,这表明服务器进行身份验证需要证书.在CFHTTPAuthentication API中,每个证书组存储在CFHTTPAuthentication 对象中.因此,每个不同的身份认证服务器和每个不同用户连接的服务器需要一个单独的CFHT

客户端(android,ios)与服务器通信

android,ios客户端与服务器通信为了便于理解,直接用PHP作为服务器端语言 其实就是一个 http请求响应的过程序,先从 B/S模式说起浏览器发起http请求,服务器响应请求,并把数据返回给浏览器,经过浏览器的渲染,即为我们所看到的效果 客户端(android,ios)android通过 httpClient或urlconnection等网络请求去实现http请求,(相当于浏览器,发送 url请求),即访问服务器,服务器响应请求,并把结果返回给客户端,经过客户端渲染,即为我们看到的效果.

iOS CFNetwork Concepts CFNetwork概念 官方文档翻译(三)

原文地址:developer CFNetwork概念 CFNetwork是一个低级的.高性能的框架,使您能够详细的控制协议栈.BSD套接字是一个扩展,提供对象的标准套接字抽象API来简化任务,比如与FTP和HTTP服务器或沟通解决DNS主机.CFNetwork为基础,从主体上和理论上,BSD套接字. 正如CFNetwork依赖于BSD套接字,有大量的Cocoa类依赖CFNetwork(例如,NSURL).此外,Web工具包是一组Cocoa类在窗口中显示网页内容.这两个类是非常高的水平,实现大部分

AFNetworking+Nginx+HTTPS服务器通信

摘要 1.介绍iOS平台用AFNetworking与HTTPS后台接口进行安全通信. 2.介绍后台自签名证书制作步骤. 3.以及Linux平台Nginx配置HTTPS协议接口的Web站点. iOS AFNetworking HTTPS Openssl Nginx 这个关于AFNetworking的HTTPS安全通信的问题,很多没有过第一次经验的以及甚至有过一次经验的都会有点不确定. 其实很简单: A.对于后台服务器所配置动证书如果是经过CA机构认证颁发的,那么用户用AFNetworking来访问

【iOS官方文档翻译】iOS蓝牙的基本概念

之前写了[iOS官方文档翻译]iOS的蓝牙连接.数据接收及发送一文,介绍了怎样进行蓝牙通讯,但是很多基本概念没有进行解释,看起来可能有点吃力,所以现在再翻译一篇苹果对官方蓝牙4.0一些基本概念介绍的文章. 1.中心设备和外围设备以及它们在蓝牙通讯中的角色. 在所有的BLE( Bluetooth low energy,下文简称蓝牙4.0 )通讯中都涉及2个主要的角色:中心设备和外围设备.它是基于传统的客户-服务器(主从式)结构,一般来说,外围设备有其它设备需要的数据,中心设备使用外围设备提供的数据

利用webSocket使网页和服务器通信

WebSocket protocol 是HTML5一种新的协议.它实现了浏览器与服务器全双工通信(full-duplex).具体说明请查阅相关资料,下面我来演示一种简单的页面与服务器通信的简单样例. 新建个web工程(基于tomcat-7版本(6以下的版本未实现webSocket功能)) 引入tomcat/lib目录下的tomcat7-websocket.jar和websocket-api.jar添加到classpath中 新建WebSocketConfig.java如下 本次采用注解方式 im

使用Ajax与服务器通信,达到异步通信效果

AJAX = 异步 JavaScript 和 XML,AJAX 是一种用于创建快速动态网页的技术.通过在后台与服务器进行少量数据交换,AJAX 可以使网页实现异步更新.这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行更新.传统的网页(不使用 AJAX)如果需要更新内容,必需重载整个网页面. XMLHttpRequest 对象 所有现代浏览器均支持 XMLHttpRequest 对象(IE5 和 IE6 使用 ActiveXObject),XMLHttpRequest 用于在后台与服务