首先大家都知道移动端常用的网络请求只有俩种,一种是GET,另一种是POST请求,还有其他六种网络请求基本上用不到,所以这里也不多加介绍,有兴趣的伙伴可以百度。这里写的是原生,不使用AFNetWorking发送网络请求。如果觉得有帮助,麻烦小伙伴点个赞。
第一种:GET请求
使用GET请求,一般是没有请求体才使用GET发送网络请求
+(void)GET:(NSString *)url parameters:(NSMutableDictionary *)param headFileds:(NSMutableDictionary *)header complectionBlock:(ComplectionBlock)block{
//容错处理if (param == nil) {
param = [NSMutableDictionary dictionary];
}
NSMutableString *fullString = [NSMutableString string];
//遍历传进来的字典,拼接请求头
for (NSString *key in param) {
id value = param[key];
NSString *keyValueStr = [NSString stringWithFormat:@"%@=%@",key,value];
[fullString appendFormat:@"%@&",keyValueStr];
}
//容错处理
if (fullString.length != 0) {
[fullString deleteCharactersInRange:NSMakeRange(fullString.length-1, 1)];
}
NSString *lastString = [NSString stringWithFormat:@"%@?%@",url,fullString];
// 1.创建URL
NSURL *fullUrl = [NSURL URLWithString:lastString];
// 2.创建Request
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:fullUrl cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:120];
//设置请求头
//容错处理
if (header) {
[request setAllHTTPHeaderFields:header];
}
[request setHTTPMethod:@"GET"];
// 3.创建Session
NSURLSession *session = [NSURLSession sharedSession];
// 4.创建网络会话
NSURLSessionDataTask *task = [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
//如果有错误,打印错误信息,并返回
if (error) {
NSLog(@"错误信息为:%@",error);
return ;
}
//解析Json数据,先判断response的stateCode是否等于200
NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)response;
NSError *jsonError = nil;
if (httpResponse.statusCode == 200) {
id JsonData = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:&jsonError];
if (jsonError) {
NSLog(@"数据解析错误,原因为:%@",jsonError);
}
// 放入主线程里
dispatch_sync(dispatch_get_main_queue(), ^{
//解析成功则调用Block返回数据
block(JsonData);
});
}
}];
// 5.发送请求
[task resume];
}
第二种POST请求,POST请求我用了俩种方式,一种是不上传图片的网络请求,另一种是上传图片的网络请求
//POST请求
+(void)POST:(NSString *)url parameters:(NSMutableDictionary *)param headFileds:(NSMutableDictionary *)header formData: (NSData *)formData
complectionBlock:(ComplectionBlock)block{
// 1.创建URL
NSURL *fullUrl = [NSURL URLWithString:url];
// 2.创建Request
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:fullUrl cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:120];
//设置请求头
//容错处理
if (header) {
[request setAllHTTPHeaderFields:header];
}
[request setHTTPMethod:@"POST"];
//容错处理
if (param == nil) {
param = [NSMutableDictionary dictionary];
}
if (!formData) {//------------------不需要向服务器上传文件-----------------------
NSMutableString *fullString = [NSMutableString string];
//遍历传进来的字典,拼接请求头
for (NSString *key in param) {
id value = param[key];
NSString *keyValueStr = [NSString stringWithFormat:@"%@=%@",key,value];
[fullString appendFormat:@"%@&",keyValueStr];
}
//容错处理
if (fullString.length != 0) {
[fullString deleteCharactersInRange:NSMakeRange(fullString.length-1, 1)];
}
//设置请求体
[request setHTTPBody:[fullString dataUsingEncoding:NSUTF8StringEncoding]];
}else{//------------------需要向服务器上传文件-----------------------
NSString *headerField=[NSString stringWithFormat:@"multipart/form-data; charset=utf-8;boundary=%@",Boundary];
// 需要设置请求头
[request addValue:headerField forHTTPHeaderField:@"Content-Type"];
// 获取请求体
NSData *fileData = [self buildHttpBodyWithParams:param withFormData:formData];
[request setHTTPBody:fileData];
}
// 3.创建Session
NSURLSession *session = [NSURLSession sharedSession];
// 4.创建网络会话
NSURLSessionDataTask *task = [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
//如果有错误,打印错误信息,并返回
if (error) {
NSLog(@"错误信息为:%@",error);
return ;
}
//解析Json数据,先判断response的stateCode是否等于200
NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)response;
NSError *jsonError = nil;
if (httpResponse.statusCode == 200) {
id JsonData = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:&jsonError];
if (jsonError) {
NSLog(@"数据解析错误,原因为:%@",jsonError);
}
// 放入主线程里
dispatch_sync(dispatch_get_main_queue(), ^{
//解析成功则调用Block返回数据
block(JsonData);
});
}
}];
// 5.发送请求
[task resume];
}
//拼接请求体
+(NSData *)buildHttpBodyWithParams:(NSMutableDictionary *)params withFormData:(NSData *)formData{
//按照请求体的格式,拼接请求体
//开头的bodyStr + 图片数据 + 结束str
NSMutableData *bodyData = [NSMutableData data];
//(1)bodyStr
NSMutableString *bodyStr = [NSMutableString string];
for (NSString *key in params) {
id value = [params objectForKey:key];
[bodyStr appendFormat:@"--%@\r\n", Boundary]; // \n 换行,\r 切换到行首
[bodyStr appendFormat:@"Content-Disposition: form-data; name=\"%@\"", key];
[bodyStr appendFormat:@"\r\n\r\n"];
[bodyStr appendFormat:@"%@\r\n", value];
}
//.pic ---- 图片
[bodyStr appendFormat:@"--%@\r\n", Boundary]; // \n 换行,\r 切换到行首
[bodyStr
appendFormat:
@"Content-Disposition: form-data; name=\"pic\"; filename=\"file\""];
[bodyStr appendFormat:@"\r\n"];
[bodyStr appendFormat:@"Content-Type: application/octet-stream"];
[bodyStr appendFormat:@"\r\n\r\n"];
NSData *startData = [bodyStr dataUsingEncoding:NSUTF8StringEncoding];
[bodyData appendData:startData];
//(2)pic
//图片数据添加
[bodyData appendData:formData];
//(3)--str--
NSString *endStr = [NSString stringWithFormat:@"\r\n--%@--\r\n", Boundary];
NSData *endData = [endStr dataUsingEncoding:NSUTF8StringEncoding];
[bodyData appendData:endData];
return bodyData;
}