CFHTTPMessageRef Example

132 篇文章 0 订阅

1, Build a CFHTTPMessageRef

-(CFHTTPMessageRef)buildMessage
{
   NSURL *myURL = [NSURL URLWithString:@"http://myurl.com"];
   NSData *dataToPost = [[NSString stringWithString:@"POST Data It Doesn't Matter What It Is"] dataUsingEncoding:NSUTF8StringEncoding];


   //Create with the default allocator (NULL), a post request,
   //the URL, and pick either
   //kCFHTTPVersion1_0 or kCFHTTPVersion1_1
   CFHTTPMessageRef request = CFHTTPMessageCreateRequest(NULL, CSTR("POST"), (CFURLRef)myURL, kCFHTTPVersion1_1);


   CFHTTPMessageSetBody(request, (CFDataRef)dataToPost);


   //Unfortunately, this isn't smart enough to set reasonable headers for you
   CFHTTPMessageSetHeaderFieldValue(request, CFSTR("HOST"), (CFStringRef)[myURL host]);
   CFHTTPMessageSetHeaderFieldValue(request, CFSTR("Content-Length"), (CFStringRef)[NSString stringWithFormat:"%d", [dataToPost length]);
   CFHTTPMessageSetHeaderFieldValue(request, CFSTR("Content-Type"), CFSTR("charset=utf-8"));


   return [NSMakeCollectable(request) autorelease];
}



2, Send it to the server and read back the response


-(CFHTTPMessageRef)performHTTPRequest:(CFHTTPMessageRef)request
{
   CFReadStreamRef requestStream = CFReadStreamCreateForHTTPRequest(NULL, request);
   CFReadStreamOpen(requestStream);


   NSMutableData *responseBytes = [NSMutableData data];


   CFIndex numBytesRead = 0 ;
   do
   {
      UInt8 buf[1024];
      numBytesRead = CFReadStreamRead(requestStream, buf, sizeof(buf));


      if(numBytesRead > 0)
         [responseBytes appendBytes:buf length:numBytesRead];


   } while(numBytesRead > 0);


   CFHTTPMessageRef response = (CFHTTPMessageRef)CFReadStreamCopyProperty(requestStream, kCFStreamPropertyHTTPResponseHeader);
   CFHTTPMessageSetBody(response, (CFDataRef)responseBytes);


   CFReadStreamClose(requestStream);
CFRelease(requestStream);


   return [NSMakeCollectable(response) autorelease];
}  

3,  Adding Authentication to an HTTP Request


-(void)addAuthenticationToRequest:(CFHTTPMessageRef)request withResponse:(CFHTTPMessageRef)response
{
   CFHTTPAuthenticationRef authentication = CFHTTPAuthenticationCreateFromResponse(NULL, response);
   [NSMakeCollectable(authentication) autorelease];


   CFStreamError err;
   Boolean success = CFHTTPMessageApplyCredentials(request, authentication, CFSTR("username"), CFSTR("password"), &err);
} 


4,Putting It All Together


-(void)magicHappens
{
   CFHTTPMessageRef request = [self buildMessage];
   CFHTTPMessageRef response = [self performHTTPRequest: request];


   UInt32 statusCode;
   statusCode = CFHTTPMessageGetResponseStatusCode(response);


   //An HTTP status code of 401 or 407 indicates that authentication is  
   //required I use an auth count to make sure we don't get stuck in an    
   //infinite loop if our credentials are bad. Sometimes, making the    
   //request more than once lets it go through.
   //I admit I don't know why.


   int authCount = 0;
   while((statusCode == 401 || statusCode == 407) && authCount < 3)
   {
      request = [self buildMessage];
      [self addAuthenticationToRequest:request withResponse:response];


      response = [self performHTTPRequest: request];
      statusCode = CFHTTPMessageGetResponseStatusCode;
      authCount++;
   }


    NSData *responseBodyData = [(NSData*)CFHTTPMessageCopyBody(response) autorelease];
   NSString *responseBody = [[[NSString alloc] initWithData:responseBodyData encoding:NSUTF8StringEncoding] autorelease];


   NSLog(responseBody);
} 

Refer  this  link.


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值