CFNetWork是苹果提供的位于 Core Foundation 中的一个基于C的底层框架,是对更底层OS层BSD socket的封装,著名的网络框架ASI网络请求方面就是对CFNetWork进行封装的。
CFNetWork主要依赖俩个API,CFSocket 和 CFStream,CFSocket主要用于网络底层的通信,而CFStream包括CFReadStream 和 CFWriteStream,分别用于对Socket的读取和写入。
昨天下午小小研究了一ASIHttpRequest,顺带着看了看CFNetWork框架,试着写了一个小Demo,主要是用CFNetWork请求网上的一张图片,向新浪微博上传发送一张图片。
首先构造URL
-
- CFStringRef urlStr = CFSTR("http://c.hiphotos.baidu.com/image/w%3D310/sign=b8f7695888d4b31cf03c92bab7d6276f/4e4a20a4462309f76248df09710e0cf3d7cad682.jpg");
-
-
- CFStringRef method = CFSTR("GET");
-
-
- CFURLRef url = CFURLCreateWithString(kCFAllocatorDefault, urlStr, NULL);
然后通过
CFReadStream发送http请求
-
- CFHTTPMessageRef request = CFHTTPMessageCreateRequest(kCFAllocatorDefault, method, url, kCFHTTPVersion1_1);
-
-
- CFReadStreamRef readStream = CFReadStreamCreateForHTTPRequest(kCFAllocatorDefault, request);
-
-
- CFStreamClientContext ctxt = {0, (__bridge voidvoid *)(self), NULL, NULL, NULL};
设置回调事件,用于监听网络事件
-
-
-
-
-
-
-
-
-
-
-
-
-
- CFOptionFlags event = kCFStreamEventHasBytesAvailable|kCFStreamEventEndEncountered;
-
传入回调函数,用于接收的流事件的回调
-
-
-
-
-
- CFReadStreamSetClient(readStream, event, myCallBack, &ctxt);
将流加入到runloop中,并打开流
-
- CFReadStreamScheduleWithRunLoop(readStream, CFRunLoopGetCurrent(), kCFRunLoopCommonModes);
-
-
- CFReadStreamOpen(readStream);
回调函数的实现,接收请求到的数据
- void myCallBack (CFReadStreamRef stream,CFStreamEventType type,voidvoid *clientCallBackInfo){
-
- if (type == kCFStreamEventHasBytesAvailable) {
-
-
- UInt8 buff [255];
- int length = CFReadStreamRead(stream, buff, 255);
-
- if (!imageData) {
- imageData = [NSMutableData data];
- }
-
- [imageData appendBytes:buff length:length];
-
- }
- if (type == kCFStreamEventEndEncountered) {
-
-
- [(__bridge ViewController *)clientCallBackInfo didRequestImage];
-
-
- CFReadStreamClose(stream);
-
- CFReadStreamUnscheduleFromRunLoop(stream, CFRunLoopGetCurrent(), kCFRunLoopCommonModes);
- }
- }
最后就非常简单了将接收到的数据转成图片,给UIImageView显示就行了.
- - (void)didRequestImage{
- UIImageView *imageView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 100, 320, 200)];
- UIImage *image = [UIImage imageWithData:imageData];
- imageView.image = image;
-
- [self.view addSubview:imageView];
- }
上面是通过
CFNetWork请求数据,看起来挺简单的吧,下面是通过
CFNetWork向 新浪微博发送一张图片,上传的流程和上面的差不太多,主要是拼接数据麻烦一些,下面放上代码。
-
- CFStringRef urlStr = CFSTR("https://upload.api.weibo.com/2/statuses/upload.json");
-
-
- CFStringRef method = CFSTR("POST");
-
- CFURLRef url = CFURLCreateWithString(kCFAllocatorDefault, urlStr, NULL);
-
- CFHTTPMessageRef request = CFHTTPMessageCreateRequest(kCFAllocatorDefault, method, url, kCFHTTPVersion1_1);
//设置请求头,和请求体,注意只有POST才需要设置请求体
-
-
- NSString *boundary = [NSString stringWithFormat:@"---------------------------14737809dasdasda2746641449"];
- NSString *contentType = [NSString stringWithFormat:@"multipart/form-data; boundary=%@",boundary];
-
-
- CFHTTPMessageSetHeaderFieldValue(request, CFSTR("Content-Type"), (__bridge CFStringRef)(contentType));
请求体
-
- NSData *bodyData = [self getRequestData];
- CFHTTPMessageSetBody(request, (__bridge CFDataRef)(bodyData));
请求体的拼接
-
- - (NSData *)getRequestData{
-
-
- UIImage *image = [UIImage imageNamed:@"cat.png"];
- NSData *imageData = UIImagePNGRepresentation(image);
-
-
-
- NSString *boundary = [NSString stringWithFormat:@"---------------------------14737809dasdasda2746641449"];
-
-
-
- NSMutableData *body = [NSMutableData data];
-
-
- [body appendData:[[NSString stringWithFormat:@"\r\n\r\n--%@\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]];
-
-
- [body appendData:[@"Content-Disposition: form-data; name=\"status\"\r\n\r\n" dataUsingEncoding:NSUTF8StringEncoding]];
- [body appendData:[@"需要发送的文字内容\r\n" dataUsingEncoding:NSUTF8StringEncoding]];
-
-
- [body appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]];
-
-
- [body appendData:[@"Content-Disposition: form-data; name=\"pic\"; filename=\"cat.png\"\r\n" dataUsingEncoding:NSUTF8StringEncoding]];
- [body appendData:[@"Content-Type: image/png\r\n\r\n" dataUsingEncoding:NSUTF8StringEncoding]];
- [body appendData:[NSData dataWithData:imageData]];
-
-
- [body appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]];
-
-
- [body appendData:[@"Content-Disposition: form-data; name=\"access_token\"\r\n\r\n" dataUsingEncoding:NSUTF8StringEncoding]];
-
- [body appendData:[@"2.00svaeojkrewe901dPLialB" dataUsingEncoding:NSUTF8StringEncoding]];
-
-
- [body appendData:[[NSString stringWithFormat:@"\r\n--%@--\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]];
-
- return body;
- }
然后将流加入到runloop中,打开流就OK了,剩下的基本和第一个Demo相同,在此就不再啰嗦了。
Ok发送成功
![](https://img-blog.csdn.net/20141003120116187?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMzM0MTM5OA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
转载:http://blog.csdn.net/u013341398/article/details/39754133