-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathViewController.m
202 lines (139 loc) · 7.29 KB
/
ViewController.m
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
//
// ViewController.m
// TestCFNetWorkRequest
//
// Created by 陈金 on 15/8/22.
// Copyright (c) 2015年 Art. All rights reserved.
//
#import "ViewController.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
- (IBAction)getRequest:(id)sender
{
CFStringRef urlStr = CFSTR("http://c.hiphotos.baidu.com/image/w%3D310/sign=b8f7695888d4b31cf03c92bab7d6276f/4e4a20a4462309f76248df09710e0cf3d7cad682.jpg");
//GET请求
CFStringRef method= CFSTR("GET");
//构造URL
CFURLRef url = CFURLCreateWithString(kCFAllocatorDefault, urlStr, NULL);
//http请求
CFHTTPMessageRef request = CFHTTPMessageCreateRequest(kCFAllocatorDefault, method, url, kCFHTTPVersion1_1);
//创建一个读取流 读取网络数据
CFReadStreamRef readStream = CFReadStreamCreateForHTTPRequest(kCFAllocatorDefault, request);
//设置流的context这里将self传入,用于以后的回调
CFStreamClientContext ctxt = {0, (__bridge void *)(self), NULL, NULL, NULL};
//监听回调事件
// kCFStreamEventNone,(没有事件发生)
//
// kCFStreamEventOpenCompleted,(流被成功打开)
//
// kCFStreamEventHasBytesAvailable,(有数据可以读取)
//
// kCFStreamEventCanAcceptBytes,(流可以接受写入数据(用于写入流))
//
// kCFStreamEventErrorOccurred,(在流上有错误发生)
//
// kCFStreamEventEndEncountered ,(到达了流的结束位置)
CFOptionFlags event = kCFStreamEventHasBytesAvailable|kCFStreamEventEndEncountered;
//设值回调函数myCallBack
// 回调函数格式
// void callBack(CFReadStreamRef stream,CFStreamEventType type,void *clientCallBackInfo)
CFReadStreamSetClient(readStream,event,myCallBack,&ctxt);
CFReadStreamScheduleWithRunLoop(readStream,CFRunLoopGetCurrent(),kCFRunLoopCommonModes);
CFReadStreamOpen(readStream);
}
void myCallBack (CFReadStreamRef stream,CFStreamEventType type,void *clientCallBackInfo){
NSLog(@"myCallBack is %@",clientCallBackInfo);
static NSMutableData* imageData = nil;
if(type == kCFStreamEventHasBytesAvailable){
UInt8 buff[255];
long length = CFReadStreamRead(stream, buff, 255);
NSLog(@"length is %ld",length);
if(!imageData){
imageData = [[NSMutableData alloc] init];
}
[imageData appendBytes:buff length:length];
}else if(type == kCFStreamEventEndEncountered){
UIImage* image = [UIImage imageWithData:imageData];
imageData = nil;
CFReadStreamClose(stream);
CFReadStreamUnscheduleFromRunLoop(stream,CFRunLoopGetCurrent(),kCFRunLoopCommonModes);
}
}
void postmyCallBack (CFReadStreamRef stream,CFStreamEventType type,void *clientCallBackInfo){
NSLog(@"myCallBack is %@",clientCallBackInfo);
static NSMutableData* imageData = nil;
if(type == kCFStreamEventHasBytesAvailable){
UInt8 buff[255];
long length = CFReadStreamRead(stream, buff, 255);
NSLog(@"length is %ld",length);
if(!imageData){
imageData = [[NSMutableData alloc] init];
}
[imageData appendBytes:buff length:length];
}else if(type == kCFStreamEventEndEncountered){
NSString* resString = [[NSString alloc] initWithData:imageData encoding:NSUTF8StringEncoding];
NSLog(@"resString is %@",resString);
CFReadStreamClose(stream);
CFReadStreamUnscheduleFromRunLoop(stream,CFRunLoopGetCurrent(),kCFRunLoopCommonModes);
}
}
- (IBAction)postRequest:(id)sender
{
CFStringRef urlStr = CFSTR("https://upload.api.weibo.com/2/statuses/upload.json");
//GET请求
CFStringRef method= CFSTR("POST");
//构造URL
CFURLRef url = CFURLCreateWithString(kCFAllocatorDefault, urlStr, NULL);
//http请求
CFHTTPMessageRef request = CFHTTPMessageCreateRequest(kCFAllocatorDefault, method, url, kCFHTTPVersion1_1);
NSString *boundary = [NSString stringWithFormat:@"---------------------------14737809dasdasda2746641449"];
NSString *contentType = [NSString stringWithFormat:@"multipart/form-data; boundary=%@",boundary];
//OC的字符串要做C框架中使用需要__bridge桥接
CFHTTPMessageSetHeaderFieldValue(request, CFSTR("Content-Type"), (__bridge CFStringRef)(contentType));
NSData *bodyData = [self getRequestData];
CFHTTPMessageSetBody(request, (__bridge CFDataRef)(bodyData));
CFReadStreamRef readStream = CFReadStreamCreateForHTTPRequest(kCFAllocatorDefault, request);
//设置流的context这里将self传入,用于以后的回调
CFStreamClientContext ctxt = {0, (__bridge void *)(self), NULL, NULL, NULL};
CFOptionFlags event = kCFStreamEventHasBytesAvailable|kCFStreamEventEndEncountered;
CFReadStreamSetClient(readStream,event,postmyCallBack,&ctxt);
CFReadStreamScheduleWithRunLoop(readStream,CFRunLoopGetCurrent(),kCFRunLoopCommonModes);
CFReadStreamOpen(readStream);
}
- (NSData *)getRequestData{
UIImage *image = [UIImage imageNamed:@"addressIcon"];
NSData *imageData = UIImagePNGRepresentation(image);
//分隔符,注意要与上面请求头中的一致
NSString *boundary = [NSString stringWithFormat:@"---------------------------14737809dasdasda2746641449"];
//定义可变Data;
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]];
//access_token 向新浪微博发送内容,需要OAuth认证,这里必须带上access_token
[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;
}
@end