网络编程归纳总结五阶段
文件上传
监视post登录的请求头(get请求头是没有此项的)
Content-Type: application/x-www-form-urlencoded
演示上传文件,监视请求
Content-Type:multipart/form-data; boundary=—-WebKitFormBoundaryqVIdsHKTeI0Mcuhb
请求头中Content-Type的作用
请求头中的Content-Type告诉服务器,客户端post过去的数据的样子
application/x-www-form-urlencoded
此值是告诉服务器post过去的数据的样式是 键=值&键=值 的形式(和URL传参的样式一致)
默认使用此值
multipart/form-data; boundary=—-WebKitFormBoundaryqVIdsHKTeI0Mcuhb
键=值的形式无法上传文件,所以上传文件的时候使用的是form-data
此形式中前半部分是协议中固定的multipart/form-data; boundary=–
后面的内容是一个随机内容,不同的浏览器生成的是不一样的,我们也可以自己指定
上传文件的第三方框架
AFN ,ASI(过时)
自己上传文件
UGC 用户生成内容
上传文件,发送请求的时候要设置请求NSMutableURLRequest的以下属性
a. request.HTTPMethod = @"post";
b. request.HTTPBody
c. Content-Type
NSString *type = [NSString stringWithFormat:@"multipart/form-data; boundary=%@",boundary];
[request setValue:type forHTTPHeaderField:@"Content-Type"];
请求体
请求体中各项的含义
——WebKitFormBoundaryuWw18YzUxr2ygEJi
Content-Disposition: form-data; name=”userfile”; filename=”03.JPG”
Content-Type: image/jpeg
二进制数据
——WebKitFormBoundaryuWw18YzUxr2ygEJi–
分隔符 ——WebKitFormBoundaryuWw18YzUxr2ygEJi
name 表单的name属性值
filename 传递给服务器的文件名
Content-Type 告诉服务器传递的文件类型
text/plain image/jpeg image/jpg image/png application/octet-stream 等
二进制数据 要上传文件的NSData
——WebKitFormBoundaryuWw18YzUxr2ygEJi–
上传单个文件
1.发送异步请求
#define boundary @"hahahhahawa"
- (void)sendFile:(NSString *)fieldName fileName:(NSString *)fileName data:(NSData *)fileData{
//1 创建请求
NSURL *url = [NSURL URLWithString:@"http://127.0.0.1/upload/upload.php"];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
//设置请求动作
request.HTTPMethod = @"post";
request.HTTPBody = [self makeBody:fieldName fileName:fileName data:fileData];
//设置请求的content-type为form-data,才能上传文件
NSString *type = [NSString stringWithFormat:@"multipart/form-data; boundary=%@",boundary];
[request setValue:type forHTTPHeaderField:@"Content-Type"];
//2 发送异步请求
[NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
if (data) {
id result = [NSJSONSerialization JSONObjectWithData:data options:0 error:NULL];
NSLog(@"%@",result);
return;
}
NSLog(@"%@",connectionError);
}];
}
2.生成formData
//搞个body
- (NSData *)makeBody:(NSString *)fieldName fileName:(NSString *)fileName data:(NSData *)fileData{
NSMutableData *data = [NSMutableData data];
NSMutableString *str = [NSMutableString string];
[str appendFormat:@"--%@\r\n",boundary];
[str appendFormat:@"Content-Disposition: form-data; name=\"%@\"; filename=\"%@\"\r\n",fieldName,fileName];
[str appendString:@"Content-Type: image/png\r\n\r\n"];
//把字符串转换成二进制数据,添加到data中
[data appendData:[str dataUsingEncoding:NSUTF8StringEncoding]];
//要上传的文件
[data appendData:fileData];
NSString *tail = [NSString stringWithFormat:@"\r\n--%@--",boundary];
[data appendData:[tail dataUsingEncoding:NSUTF8StringEncoding]];
return [data copy];
}
3.加载文件测试
//测试
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
NSString *path = [[NSBundle mainBundle] pathForResource:@"xx.png" ofType:nil];
NSData *data = [NSData dataWithContentsOfFile:path];
[self sendFile:@"userfile" fileName:@"xx.png" data:data];
}
RESTful
OC使用RESTful 使用RestKit框架
什么是RESTful
使用不同的HTTP访问方法,请求一个URL,表达不同的语义
主要由服务器端开发,我们使用
RESTful风格让url的可读性更好
示例
http://www.ooxx.com/video/cls
GET 获取服务器上 cls的所有视频
POST 新增服务器上 cls的视频
PUT 修改服务器上 cls的视频
DELETE 删除服务器上 cls的视频
http://www.ooxx.com/video/cls/c
http://www.ooxx.com/video/cls
最近才开始往github上放东西 在公司写的又不能放= = 大家姑且看看吧
github地址: https://github.com/FuThD