monster's Blog

夕阳碧霄亭

使用CFHTTP创建请求

monster posted @ 2013年3月05日 15:04 in Objective-C , 11575 阅读

学IOS开发差不多也有20天了,昨天想处理一点网络数据,百度了一下发现资料很少。昨天晚上回来以后喝醉了,就没再搞,早上起来看apple官方的文档,发现讲得很清楚,翻译下和大家分享,大牛勿喷。

 

 

HTTP请求是提供给远程服务器执行任务的一条消息,其中包括:执行地址(URL),消息头(Headers)和消息正文(Body)。招待的方式通常有以下几种:GET,HEAD,PUT,POST,DELETE,TRACE,CONNECT,OPTIONS。创建一条HTTP请求需要4步:

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

2  使用CFHTTPMessageSetBody函数设置消息正文部分;

3  使用CFHTTPMessageSetHeaderFieldValue函数设置消息头部;

4  使用CFHTTPMessageCopySerializedMessage序列化消息。

看一段简单的示例代码:

 

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);

看这段代码,首先调用CFURLCreateWithString函数将URL转为CFUR对象,然后调用CFHTTPMessageCreateRequest函数创建请求,注意传入的四个参数:kCFAllocatorDefault指定了将使用默认的系统内存管理器创建消息引用,requestMethod指定了消息请求的执行方式,myURL指定将要请求的远程地址,kCFHTTPVersion1_1指定HTTP请求的版本为1.1。CFHTTPMessageCreateRequest函数的返回值就是消息对象的引用。

 

CFHTTPMessageSetBody函数用来设置请求的正文部分。

CFHTTPMessageSetHeaderFieldValue函数用来设置请求的头部,第一个参数是CFHTTPMessageCreateRequest返回的消息对象,第二个参数是头参数名,如Content-Length,类型为CFString,第三个参数是头参数值,类型为CFString。最后调用CFHTTPMessageCopySerializedMessage函数使消息序列化,并且通过写入流发送。

当消息对象不再使用时,应该及时释放,看下面的代码:

 

CFRelease(myRequest);
CFRelease(myURL);
CFRelease(url);
CFRelease(mySerializedRequest);
myRequest = NULL;
mySerializedRequest = NULL;

 


登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter