CFNetwork 网络请求方式1

//
//  CFNetworkTest1.m
//  TestCF
//
//  Created by Jabez on 15/5/11.
//  Copyright (c) 2015年 John. All rights reserved.
//

#import "CFNetworkTest1.h"

@implementation CFNetworkTest1

- (void)sendMessage
{
    [self magicHappens];
}

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

    CFIndex 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 tha once lets it go through.
    // I admit I don't know why.
    //    int authCount = 0;
    //    while ((statusCode == 401 || statusCode == 407) && authCount < 3) {
    //        request = [self buildMeaage];
    //        [self addAuthentionToRequest:request withResponse:response];
    //
    //        response = [self performHTTPRequest:request];
    //        statusCode = CFHTTPMessageGetResponseStatusCode(response);
    //        authCount++;
    //    }

    CFDataRef responseDataRef = CFHTTPMessageCopyBody(response);
    NSData *responseData = (__bridge NSData *)responseDataRef;
    NSString *responseBody = [[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding];

    NSLog(@"responseBody: %@", responseBody);
}

- (CFHTTPMessageRef)buildMeaage
{
    NSURL *url = [NSURL URLWithString:@"http://jabez.local/~jabez/test/response/response0"];
    NSData *dataToPost = [@"key=test1" 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, CFSTR("POST"), (__bridge CFURLRef)url, kCFHTTPVersion1_1);

    CFHTTPMessageSetBody(request, (__bridge CFDataRef) dataToPost);

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

    return ((CFHTTPMessageRef) CFAutorelease(request));
}

- (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, (__bridge CFDataRef)responseBytes);

    CFReadStreamClose(requestStream);
    CFRelease(requestStream);

    return ((CFHTTPMessageRef) CFAutorelease(response));
}

- (Boolean)addAuthentionToRequest:(CFHTTPMessageRef)request withResponse:(CFHTTPMessageRef)response
{
    CFHTTPAuthenticationRef authentication = CFHTTPAuthenticationCreateFromResponse(NULL, response);

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

@end
时间: 2024-10-23 17:20:50

CFNetwork 网络请求方式1的相关文章

Android中的几种网络请求方式详解

http://blog.csdn.net/zuolongsnail/article/details/6373051 Android应用中使用AsyncHttpClient来异步网络数据 http://blog.csdn.net/sdvch/article/details/13615605 Android中的几种网络请求方式详解,布布扣,bubuko.com

百度语音识别REST API——通过使用Http网络请求方式获得语音识别功能

百度语音识别通过REST API的方式给开发者提供一个通用的HTTP接口,基于该接口,开发者可以轻松的获取语音识别能力,本文档描述了使用语音识别服务REST API的方法. 优点: 较之开发者常用的获取语音识别功能的方法,本方法最大的优势是轻量级,不需要在所开发的应用中集成任何SDK开发工具包,也不需要在测试机中添加任何识别引擎软件,开发者只要了解Http网络请求以及百度语音识别 REST API的使用规则,即可轻轻松松在自己的应用中使用语音识别相关的功能了. 功能介绍: REST API支持整

Android Studio第三十期 - 介绍几种网络请求方式写法

框架git地址:附(爱一个人就要爱他(loader)的全部~) https://github.com/geeklx/MakeJarAAR 1:http://192.168.200.96/v2/weather/weather.get.info 请求方式:POST     请求示例 {    "verify_info":{        "app":{            "app_id":"2e263d60-2d48-43d9-b699

IOS 网络请求方式

iOS开发中的网络请求 今天来说说关于iOS开发过程中的网络请求. 关于网络请求的重要性我想不用多说了吧.对于移动客户端来说,网络的重要性不言而喻.常见的网络请求有同步GET, 同步POST, 异步GET, 异步POST.今天来看一下四种网络请求的实现方式. 一.同步GET 1 2 3 4 5 6 7 8 9 10 11 12 // 1.将网址初始化成一个OC字符串对象 NSString *urlStr = [NSString stringWithFormat:@"%@?query=%@®ion

Windows Phone 网络请求方式对比

目前的Windows Phone平台支持有以下几种实现网络请求的方式:HttpWebRequest.WebClient.WebBrowser.Socket 我个人给他们分个类: 最实用,最麻烦:HttpWebRequest 最简洁:WebClient 最猥琐:WebBrowser 最不常用:Socket 可能用到的一些wp源码案例:http://code.662p.com/list/14_1.html 1.HttpWebRequest: 能实现各种WP上支持的请求类型(目前支持POST/GET)

CFNetwork 网络请求2

// //  CFNetworkTest2.m //  TestCF // //  Created by Jabez on 15/5/11. //  Copyright (c) 2015年 John. All rights reserved. // #import "CFNetworkTest2.h" #import <CoreFoundation/CoreFoundation.h> #import <CFNetwork/CFNetwork.h> @interf

iOS进阶(网络请求)

1.网络请求方式 GET:通过网址字符串  网址字符串最多255字节  所有传输给服务器的数据都显示在网址里,直接可见,不安全 POST:通过data  容量很大 数据被转换成二进制数 安全 2.连接方式 同步连接:程序容易出现卡死现象 异步连接:等待数据返回 (有代理和block两种方式)创建请求对象时,采用NSMutableURLRequest对象并设置请求方式和body主体 POSTBlock异步block //创建一个NSURLSession对象 NSURLSession *sessio

用Block封装网络请求

#import <Foundation/Foundation.h> // 定义一个枚举typedef NS_ENUM(NSInteger) {    LY_GET,    LY_POST} URLRequestMethod;///定义返回block网络请求结果typedef void(^ResultBlock)(NSData *data,NSURLResponse *response,NSError *error); @interface LYNetWorkRequestManager : N

iOS开发——网络请求方法汇总

在实际的项目开发中,连接网络是每一款App必不可少的基本功能.对于客户端的网络请求而言,无非是有两个实现方向:使用网络请求框架或者不使用网络请求框架.在这篇博客中,我将用苹果自带的网络请求方式(不使用第三方框架)下对iOS网络请求方法做一个汇总.我将在之后的博客中介绍使用AFNetworking框架进行请求的实现.代码已经上传至:https://github.com/chenyufeng1991/iOS-NetworkRequest   . [使用XML请求Webservice,可用GET或PO