“我正在参加「启航计划」”

前言

iOS 完成json数据提交(发送JSON数据给服务器)

1.一定要运用POST恳求

2.设置恳求头 [request setValue:@”application/json” forHTTPHeaderField:@”Content-Type”];

3.设置JSON数据为恳求体

I NSURLConnection 根本运用

1.1 常用类

NSURL:恳求地址
NSURLRequest:一个NSURLRequest目标就代表一个恳求,它包括的信息有:一个NSURL目标恳求办法;恳求头、恳求体;恳求超时… …
NSMutableURLRequestNSURLRequest的子类
NSURLConnection:担任发送恳求,树立客户端和服务器的衔接;发送NSURLRequest的数据给服务器,并搜集来自服务器的呼应数据

1.2NSURLConnection的运用过程

创立一个NSURL目标,设置恳求途径
传入NSURL创立一个NSURLRequest目标,设置恳求头和恳求体
运用NSURLConnection发送NSURLRequest

iOS小技能:1. iOS 实现json数据提交 2. 对同一个URL的多次请求进行数据缓存 3. 检查网络状态

1.3 NSURLConnection发送恳求

NSURLConnection常见的发送恳求办法有以下几种

  • 1)同步恳求
+ (NSData *)sendSynchronousRequest:(NSURLRequest *)request returningResponse:(NSURLResponse **)response error:(NSError **)error;
  • 2)异步恳求:依据对服务器回来数据的处理方式的不同,又能够分为2种: block回调
+ (void)sendAsynchronousRequest:(NSURLRequest*) request queue:(NSOperationQueue*) queue   completionHandler:(void (^)(NSURLResponse* response, NSData* data, NSError* connectionError)) handler;

采用block的好处:网络恳求预备和处理回来数据的代码比较会集。灵活(block能够作为参数)。不用像署理一样完成多个协议办法。

  • 署理
- (id)initWithRequest:(NSURLRequest*)request delegate:(id)delegate;
+ (NSURLConnection*)connectionWithRequest:(NSURLRequest*)request delegate:(id)delegate;
- (id)initWithRequest:(NSURLRequest*)request delegate:(id)delegate startImmediately:(BOOL)startImmediately;//在startImmediately = NO的情况下,需要调用start办法开端发送恳求- (void)start;
//成为NSURLConnection的署理,最好遵守NSURLConnectionDataDelegate协议
@protocol NSURLConnectionDataDelegate <NSURLConnectionDelegate>
@optional
- (nullable NSURLRequest *)connection:(NSURLConnection *)connection willSendRequest:(NSURLRequest *)request redirectResponse:(nullable NSURLResponse *)response;//
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response;//开端接纳到服务器的呼应时调用
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data;//接纳到服务器回来的数据时调用(服务器回来的数据比较大时会调用屡次)
- (nullable NSInputStream *)connection:(NSURLConnection *)connection needNewBodyStream:(NSURLRequest *)request;
- (void)connection:(NSURLConnection *)connection   didSendBodyData:(NSInteger)bytesWritten
                                                 totalBytesWritten:(NSInteger)totalBytesWritten
                                         totalBytesExpectedToWrite:(NSInteger)totalBytesExpectedToWrite;
- (nullable NSCachedURLResponse *)connection:(NSURLConnection *)connection willCacheResponse:(NSCachedURLResponse *)cachedResponse;
- (void)connectionDidFinishLoading:(NSURLConnection *)connection;//服务器回来的数据彻底接纳完毕后调用
@end
@protocol NSURLConnectionDelegate <NSObject>
@optional
- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error;//恳求犯错时调用(比方恳求超时)

1.4 iOS 完成json数据提交


API

/设置恳求超时等待时间(超过这个时间就算超时,恳求失利)
- (void)setTimeoutInterval:(NSTimeInterval)seconds;
//设置恳求办法(比方GET和POST)
- (void)setHTTPMethod:(NSString*)method;
//设置恳求体
- (void)setHTTPBody:(NSData*)data;
//设置恳求头
- (void)setValue:(NSString*)value forHTTPHeaderField:(NSString*)field;

创立POST恳求

NSString *urlStr = @"http://192.168.1.102:8080/MJServer/login";
NSURL *url = [NSURL URLWithString:urlStr];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
request.HTTPMethod = @"POST";
// 恳求体
NSString *bodyStr = @"username=123&pwd=123";
request.HTTPBody = [bodyStr dataUsingEncoding:NSUTF8StringEncoding];

发送JSON给服务器

//1.一定要运用POST恳求
//2.设置恳求头
[request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
//3.设置JSON数据为恳求体

多值参数

有时候一个参数名,可能会对应多个值
http://192.168.1.103:8080/KNServer/weather?place=北京&place=河南&place=湖南
服务器的place属性是一个数组*/

II NSURLCache

2.1 缓存的完成:

一般只对GET恳求进行缓存,不用对POST恳求进行缓存:

GET恳求一般用来查询数据;POST恳求一般是发很多数据给服务器处理(变动性比较大)

在iOS中,能够运用NSURLCache类缓存数据:

iOS 5之前:只支撑 内存缓存;i

OS 5开端:同时支撑 内存缓存 和 硬盘缓存

  • 缓存原理:一个NSURLRequest对应一个NSCachedURLResponse

  • 缓存技术:数据库

2.2 NSURLCache的常见用法

//获得全局缓存目标(没必要手动创立)
NSURLCache *cache = [NSURLCache sharedURLCache];
//设置内存缓存的最大容量(字节为单位,默以为512KB)
- (void)setMemoryCapacity:(NSUInteger)memoryCapacity;
//设置硬盘缓存的最大容量(字节为单位,默以为10M)
- (void)setDiskCapacity:(NSUInteger)diskCapacity;
//硬盘缓存的方位:沙盒/Library/Caches
//取得某个恳求的缓存
- (NSCachedURLResponse *)cachedResponseForRequest:(NSURLRequest*)request;
//铲除某个恳求的缓存
- (void)removeCachedResponseForRequest:(NSURLRequest*)request;
//铲除一切的缓存
- (void)removeAllCachedResponses;
/**比如*/
//要想对某个GET恳求进行数据缓存,非常简单
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
// 设置缓存战略
request.cachePolicy = NSURLRequestReturnCacheDataElseLoad;//只需设置了缓存战略,系统会主动利用NSURLCache进行数据缓存
/** 
缓存战略
iOS对NSURLRequest供给了7种缓存战略:(实际上能用的只有3种)
NSURLRequestUseProtocolCachePolicy // 默许的缓存战略(取决于协议)
NSURLRequestReloadIgnoringLocalCacheData // 忽略缓存,从头恳求---1
NSURLRequestReloadIgnoringLocalAndRemoteCacheData // 未完成
NSURLRequestReloadIgnoringCacheData = NSURLRequestReloadIgnoringLocalCacheData // 忽略缓存,从头恳求
NSURLRequestReturnCacheDataElseLoad// 有缓存就用缓存,没有缓存就从头恳求--2
NSURLRequestReturnCacheDataDontLoad// 有缓存就用缓存,没有缓存就不发恳求,作为恳求犯错处理(用于离线模式)---3
NSURLRequestReloadRevalidatingCacheData // 未完成
*/

2.3 运用缓存的注意事项


  • 1.假如恳求某个URL的回来数据:
常常更新:不能用缓存!比方股票、彩票数据
原封不动:决断用缓存
偶然更新:能够定时更改缓存战略 或许 铲除缓存
  • 2.假如很多运用缓存,会越积越大,建议:定时铲除缓存

III Reachability

3.1 检查网络状况:

苹果官方供给了一个叫Reachability的示例程序,便于开发者检测网络状况

依据用户的网络状况进行智能处理,节约用户流量,进步用户体验;——–WIFI\3G网络:主动下载高清图片;—-低速网络:只下载缩略图;—没有网络:只显示离线的缓存数据

3.2 Reachability的运用过程

增加框架SystemConfiguration.framework—-

增加源代码(Reachability.h\Reachability.m)—包括头文件:#import “Reachability.h”

// 是否WIFI
+ (BOOL) IsEnableWIFI {
return ([[Reachability reachabilityForLocalWiFi] currentReachabilityStatus] != NotReachable);
}
// 是否3G
+ (BOOL) IsEnable3G {
return ([[Reachability reachabilityForInternetConnectionen] currentReachabilityStatus] != NotReachable);
}
//网络监控
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(reachabilityChanged:) name: kReachabilityChangedNotification object: nil];
self.netReachability = [Reachability reachabilityForInternetConnection];
[self.netReachability startNotifier];
- (void)dealloc{
[self.netReachability stopNotifier];  
[[NSNotificationCenter defaultCenter] removeObserver:self name:kReachabilityChangedNotification object:nil];
}

see also

公号:iOS逆向

其他相关的文章:

  1. iOS接纳json格局【 unacceptable content-type: text/plain的解决方案】:https://kunnan.blog.csdn.net/article/details/78148401

  2. iOS完成key=value&key=value方式的数据提交【Post 提交恳求数据格局为application/x-www-form-urlencoded的方案】(基于AFNetworkSDK):https://kunnan.blog.csdn.net/article/details/77128793