文字部分:
// http协议:
//超文本传输协议 (HTTP , HyperText Tansfer Protocol)是互联网上应用最为广泛地一种协议 所有的www文件都必须遵循这个准则
//http 是用于 www(万维网)浏览传输数据的一个协议
//IP 协议 对应于网络层 TCP协议对应于传输层 而Http协议对应于应用层
//http协议的作用:
//1. 规定客户端和服务端之间的数据传输方式
//2.让客户端和服务器能有效的进行数据沟通
//为什么要选择http
//1. 简单快捷 因为http协议简单 所以http服务器的程序规模小 因而通信速度很快
//2.灵活 http 允许传输任何类型的数据
//3. http是非持续 限制每次连接只处理一个请求 服务器对客户端的请求做出相应后 马上断开连接 这种方式可以节省传输时间
//http通信的过程:
//1. 请求:客户端向服务器索要数据
//2.向应: 服务器向客户端相应数据
//****http的请求方法:get和post
// get 会把请求的内容 拼接到 连接 地址里面 (数据请求的时候 默认是get的方式) 如:www.baidu.com/user/longin?/usersname=xiaohua,psw=123
//get的特征:(经常考得内容)
//1.浏览器和服务器对URL长度有限制 因此URL后面附带的参数是有限制的 通常不能超过1KB
//2.请求的数据暴露在接口里面
//post 参数全部放在请求体中
//这样就保证了 数据的安全
//没有具体的长度限制(唯一的限制就是服务器的承受能力)
//选择CET和POST的建议
//1.如果要传送大量数据 比如文件 只能用post
//2.GET的安全性比post要差点 如果包含机密|敏感信息,建议用post
//3.如果仅仅是索要数据 建议使用get
//4.如果是曾加 、修改、删除数据、建议使用post
//URL:Uniform Resource Locator (统一资源定位符)
//通过1个URL 能找到妇联网上的唯一的1个资源(唯一性 可以访问到后台数据库)
//字符串读取网络数据
代码部分:
—————————————ViewController.m——————————————
#import "ViewController.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// [self loadData1];
[self loadData2];
// [self loadData3];
// [self loadData4];
// [self loadDada5];
// [self loadData6];
}
#pragma mark post
- (void)loadData6
{
NSURL *url = [NSURL URLWithString:@"http://www.weihuok.com/customer2/GetService"];
// 请求参数
// PlatformType设备类型 3表示IOS设备
NSDictionary *dic = @{@" PlatformType":@"3"};
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:10];
// 设置HTTP的请求方式
request.HTTPMethod = @"POST";
// 设置请求参数 HTTPBody要的是data类型的数据 dataUsingEncoding转换成字符串类型
request.HTTPBody = [[NSString stringWithFormat:@"%@",dic]dataUsingEncoding:NSUTF8StringEncoding];
[NSURLConnection sendAsynchronousRequest:request queue:[[NSOperationQueue alloc]init] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
NSDictionary *info = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:nil];
NSLog(@"%@",info);
}];
}
#pragma mark get
//get把传输的数据放在连接地址里面
- (void)loadDada5
{
NSString *interfaceString = @"http://apis.baidu.com/showapi_open_bus/mobile/find";
NSString *requestContentString = @"num=13370116152";
NSString *urlString = [NSString stringWithFormat:@"%@?%@",interfaceString,requestContentString];
// 把地址连接字符串 转成NSUTF8StringEncoding
NSURL *url = [NSURL URLWithString:[urlString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];//这一步步是必须的
// 可变请求 可以添加 请求方式 以及请求的 请求头 或者更多 timeoutInterval:请求时间超过时间不在发送请求cachePolicy:缓存内容的方式
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:5 ];
request.HTTPMethod = @"GET";//指定http的请求方式 大写
// 把apiKey发送给服务器 指定的请求头 位置
NSString *apiKey = @"e7f5ac9e7c42a6c8cb125ee1d7e8779e";
[request addValue:apiKey forHTTPHeaderField:@"apiKey"];
[NSURLConnection sendAsynchronousRequest:request queue:[[NSOperationQueue alloc]init] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
NSLog(@"%@",response);
#pragma mark解析文件
//把data转换成json文件
NSDictionary *info = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:nil];
NSLog(@"%@",info);
}];
}
#pragma mark 通过URL 获得到 URL里面的内容 (字符串)
- (void)loadData1
{
NSURL *url = [NSURL URLWithString:@"https://www.baidu.com"];//通过这个方法 把字符串转成NSURL
NSString *content = [NSString stringWithContentsOfURL:url encoding:NSUTF8StringEncoding error:nil];//把url转化成字符串类型的文件 NSUTF8StringEncoding 插口的编码格式
NSLog(@"%@",content);
}
#pragma mark 通过URL 获得URL里面的数据
- (void)loadData2{
NSURL *url = [NSURL URLWithString:@"http://preview.quanjing.com/is_rm001/is0997q92.jpg"];
NSData *data = [NSData dataWithContentsOfURL:url];//获得里面的内容
UIImageView *imageView = [[UIImageView alloc]initWithFrame:self.view.frame];
imageView.contentMode = UIViewContentModeScaleAspectFit;
imageView.image = [UIImage imageWithData:data];
[self.view addSubview:imageView];
}
#pragma mark 网络请求
//分为:同步请求和异步请求
//同步请求:等所有操作执行完成之后 再执行下一步
//同步请求的弊端:会遇到假装死了的情况 (只要请求操作没有执行完毕 就不会再去相应任何事件(再同一线程))
//异步请求: 在程序运行的时候 会利用空闲的时间去执行里面的操作 不会影响到同一线程里面的其他操作
#pragma mark 同步请求
-(void)loadData3{
NSURL *url = [NSURL URLWithString:@"http://preview.quanjing.com/is_rm001/is0997q92.jpg"];//连接地址
// 实例化 请求对象 里面携带着请求地址
NSURLRequest *request = [NSURLRequest requestWithURL:url];//NSURLRequest请求类 里面必须包含url 客户端
NSData *data =[NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];//SynchronousRequest 发送同步请求
UIImageView *imageView = [[UIImageView alloc]initWithFrame:self.view.frame];
imageView.contentMode = UIViewContentModeScaleAspectFit;
imageView.image = [UIImage imageWithData:data];
[self.view addSubview:imageView];
}
#pragma mark 异步请求
-(void)loadData4
{
UIImageView *imageView = [[UIImageView alloc]initWithFrame:self.view.frame];
imageView.contentMode = UIViewContentModeScaleAspectFit;
// imageView.image = [UIImage imageWithData:data];
[self.view addSubview:imageView];
NSURL *url = [NSURL URLWithString:@"http://preview.quanjing.com/is_rm001/is0997q93.jpg"];
NSURLRequest *request = [NSURLRequest requestWithURL:url];//NSURLRequest请求类 里面必须包含url 客户端
// 需要通过 连接 异步请求 发送
NSOperationQueue *queue = [[NSOperationQueue alloc]init];
// 发送一个异步请求 在queue这线程里面去执行 response服务器回应的内容 (回应状态的code 以及erro)data:回应给客户端需要的数据
[NSURLConnection sendAsynchronousRequest:request queue:queue completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
NSLog(@"%@",response);
imageView.image = [UIImage imageWithData:data];
}];
// sendAsynchronousRequest发送异步请求 NSOperationQueue:线程(类似于左脑和右脑 可以同时干布同的事情)
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
@end
————————————DataManeger.h————————————-
#import <Foundation/Foundation.h>
#import <sqlite3.h>
@interface DataManeger : NSObject
{
sqlite3 *db;
}
/* 创建数据库表格的方法
@praram需要传一个sql语句
@return yes: 创建表成功 NO:表失败
*/
+(instancetype)shareDataManeger;
- (BOOL)createTableWithSql:(NSString *)sql;
/* //插入数据的方法 @param sql yes:插入成功 no:插入失败 */
- (BOOL)insertMassageWithSql:(NSString *)sql;
//删除数据 sql 语句
- (BOOL)deleteMassageWithSql:(NSString *)sql;
//修改数据 @param sql YES:插入成功 NO:插入失败
- (BOOL)modifyMassageWithSql:(NSString *)sql;
//查询数据 @param sql 语句 obj 要查询的值 column 要查询的字段 @return 查询结果
- (NSArray*)queryMassageWithSql:(NSString *)sql andObject:(NSString *)obj ;
//- (NSArray *) searchManageWithSQL:(NSString *)sql andObject:(NSString *)obj;
@end
—————————————————-DataManeger.h——————————
#import <Foundation/Foundation.h>
#import <sqlite3.h>
@interface DataManeger : NSObject
{
sqlite3 *db;
}
/* 创建数据库表格的方法
@praram需要传一个sql语句
@return yes: 创建表成功 NO:表失败
*/
+(instancetype)shareDataManeger;
- (BOOL)createTableWithSql:(NSString *)sql;
/* //插入数据的方法 @param sql yes:插入成功 no:插入失败 */
- (BOOL)insertMassageWithSql:(NSString *)sql;
//删除数据 sql 语句
- (BOOL)deleteMassageWithSql:(NSString *)sql;
//修改数据 @param sql YES:插入成功 NO:插入失败
- (BOOL)modifyMassageWithSql:(NSString *)sql;
//查询数据 @param sql 语句 obj 要查询的值 column 要查询的字段 @return 查询结果
- (NSArray*)queryMassageWithSql:(NSString *)sql andObject:(NSString *)obj ;
//- (NSArray *) searchManageWithSQL:(NSString *)sql andObject:(NSString *)obj;
@end
————————————DataManeger.m—————————————————
#import "DataManeger.h"
static DataManeger *manager = nil;
@implementation DataManeger
+(instancetype)shareDataManeger
{
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
manager = [[DataManeger alloc] init];
});
return manager;
}
- (int)openDB
{
// 1.打开数据库 建表
NSString *dbPath = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject]stringByAppendingPathComponent:@"数据库.sqlite"];//写路径
NSLog(@"%@",dbPath);
int result = sqlite3_open([dbPath UTF8String], &db);//打开数据库 返回值是一int类型的值
// if (result == SQLITE_OK) {
// NSLog(@"打开成功");
// }else{
// NSLog(@"打开失败");
// }
// [self createTableWithSql:];
return result;
}
- (int)closeDB
{
// 关闭数据库
return sqlite3_close(db);
}
//- (BOOL)createTable
//{
//
//}
- (BOOL)createTableWithSql:(NSString *)sql
{
if ([self openDB] == SQLITE_OK) {
// 建表的SQL语句 primary key autoincrement:第一id为主题 值是自动增长的
// name text not null unique 保证不能为空也不能重复
// 建表的公式: create table 表名 (字段名 字段的类型, 字段名字 字段的数据类型....)
// NSString *sql = @"create table if not exists user (id integer primary key autoincrement, name text not null unique, phone text, creatDate text);";
char *error;
sqlite3_exec(db, [sql UTF8String], NULL, NULL, &error);
// 建表如下
int result = sqlite3_exec(db, [sql UTF8String], NULL, NULL, &error);
//
if (result == SQLITE_OK) {
[self closeDB];
NSLog(@"打开成功");
return YES;
}else{
NSLog(@"打开失败");
[self closeDB];
return NO;
}
}
return NO;
}
//插入数据
- (BOOL)insertMassageWithSql:(NSString *)sql
{
// 打开数据库
if ([self openDB] == SQLITE_OK ) {
char *error;
int result = sqlite3_exec(db, [sql UTF8String], NULL, NULL, &error);
if (result == SQLITE_OK) {
return YES;
}else{
return NO;
}
}
return NO;
}
//删除数据
- (BOOL)deleteMassageWithSql:(NSString *)sql
{
if ([self openDB] == SQLITE_OK ) {
char *error;
int result = sqlite3_exec(db, [sql UTF8String], NULL, NULL, &error);
if (result == SQLITE_OK) {
return YES;
}else{
return NO;
}
}
return NO;
}
//修改数据
- (BOOL)modifyMassageWithSql:(NSString *)sql
{
if ([self openDB] == SQLITE_OK ) {
char *error;
int result = sqlite3_exec(db, [sql UTF8String], NULL, NULL, &error);
if (result == SQLITE_OK) {
return YES;
}else{
return NO;
}
}
return NO;
}
- (NSArray*)queryMassageWithSql:(NSString *)sql andObject:(NSString *)obj
{
// 先申明一个结果集 查询的结果存在结果集里面
sqlite3_stmt *stmt;
// 打开数据库
if ([self openDB]== SQLITE_OK) {
//校验SQL语句是否正确
// int nByte 为-1 的时候 不限制 查询的长度
if (sqlite3_prepare_v2(db, [sql UTF8String], -1,& stmt , NULL)== SQLITE_OK) {
NSString *searchContent = [NSString stringWithFormat:@"%%%@%%",obj];//表示只要有@这个的都能够找到
// 绑定要查询的内容
NSMutableArray *resultList = [NSMutableArray array];//用来装所有查询到得数据
if ( sqlite3_bind_text(stmt,1, [searchContent UTF8String], -1, NULL)== SQLITE_OK) {
while (sqlite3_step(stmt)==SQLITE_ROW) {
// NSMutableArray *info = [NSMutableArray array];
// icol 是查询到得 这一列数据的列数
char *name = (char *)sqlite3_column_text(stmt, 1);
char *phone =(char *) sqlite3_column_text(stmt, 2);
char *time = (char *)sqlite3_column_text(stmt, 3);
// 把查询到得一条数据 整合到一个字典里
NSDictionary *info = @{@"name":[NSString stringWithUTF8String:name],@"phone":[NSString stringWithUTF8String:phone],@"time":[NSString stringWithUTF8String:time]};
[resultList addObject:info];
}
[self closeDB];
return resultList;
}
}
}
return nil;
}
@end