随意细解:UI -- 网络编程

来源:互联网 发布:nasa 太阳能辐射数据 编辑:程序博客网 时间:2024/06/01 14:32

网络编程

GET请求方式

同步请求

会造成程序的卡顿(只有当请求完成才会恢复对界面的操作,用户的体验太差)

  1. 宏定义网址

    #define kSearchURL @"http://api.map.baidu.com/place/v2/search?query=麦当劳&region=上海&output=json&ak=6E823f587c95f0148c19993539b99295"
  2. 把字符串的网址 转换成网址对象
    注意:如果网址中有中文,需要转化格式

    // 注意:如果网址中有中文,需要转化格式NSString *newStr = [kSearchURL stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; // 把字符串的网址 转换成网址对象NSURL *url = [NSURL URLWithString:newStr];
  3. 创建一个请求
    timeoutInterval请求超时的时间 秒为单位

    NSMutableURLRequest *URLRequest = [NSMutableURLRequest requestWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:10];
  4. 设置一个请求的标示(这步很重要)

    [URLRequest setHTTPMethod:@"get"];
  5. 利用请求创建一个链接

    NSURLResponse *response = nil;// 建立同步链接,并得到返回的数据(dataNSData *data = [NSURLConnection sendSynchronousRequest:URLRequest returningResponse:&response error:nil];
  6. JSON解析数据
    注意数据类型,数组还是字典

 NSMutableDictionary *dic = [NSJSONSerialization JSONObjectWithData:data options:(NSJSONReadingMutableContainers) error:nil];

异步请求

代理方法 异步请求

  1. 获取网址对象(有中文要转码)

    NSString *urlStr = [kSearchURL stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
  2. 利用网址 创建网址对象

    NSURL *url = [NSURL URLWithString:urlStr];
  3. 利用网址对象创建一个请求

    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url cachePolicy:(NSURLRequestUseProtocolCachePolicy) timeoutInterval:10];
  4. 标识请求类型

    [request setHTTPMethod:@"Get"];
  5. 利用请求创建一个异步链接
    定义属性 @property (nonatomic, retain) NSURLConnection *conn;

    self.conn = [NSURLConnection connectionWithRequest:request delegate:self];
  6. 开始链接

    [self.conn start];
  7. 遵守协议

    <NSURLConnectionDataDelegate, NSURLConnectionDelegate>
  8. 链接成功时,创建data

    - (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response{NSLog(@"已经接收到服务器的响应信息,链接成功");NSLog(@"%@", response);// 链接成功时,创建dataself.receiveData = [NSMutableData data];}
  9. 多次触发didReceiveData方法 才能接收到 完整的data,所以需要拼接一下data

    - (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data{[self.receiveData appendData:data];NSLog(@"接收到数据触发的方法");}
  10. 完成数据加载,解析数据

    - (void)connectionDidFinishLoading:(NSURLConnection *)connection{    NSLog(@"%@", self.receiveData);    NSLog(@"已经完成数据加载 触发的方法");    // 解析数据    NSMutableDictionary *dataDic = [NSJSONSerialization JSONObjectWithData:self.receiveData options:(NSJSONReadingMutableContainers) error:nil];    // 如果在tableView上展示的话    // 注意:要刷新界面}
  11. 请求失败触发的方法

    - (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error{NSLog(@"请求失败时触发 %@", error);}

block 异步请求

  1. 获取网址对象(有中文要转码)

    NSString *urlStr = [kSearchURL stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
  2. 利用网址 创建网址对象

    NSURL *url = [NSURL URLWithString:urlStr];
  3. 利用网址对象创建一个请求

    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url cachePolicy:(NSURLRequestUseProtocolCachePolicy) timeoutInterval:10];
  4. 标识请求类型

    [request setHTTPMethod:@"Get"];
  5. 回到主线程

    [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {    // 可以对data进行JSON解析    // 当数据请求完成的时候 会指定这个block    NSLog(@"%@", data);    // 判断是否在主线程    NSLog(@"%d", [NSThread isMainThread]);}];

POST请求方式

POST同步

  1. 利用网址 创建网址对象

    NSURL *url = [NSURL URLWithString:kSearchURL];
  2. 利用网址对象创建一个请求

    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url cachePolicy:(NSURLRequestUseProtocolCachePolicy) timeoutInterval:10];
  3. 标识请求类型

    [request setHTTPMethod:@"POST"];
  4. 把字符串转化成data使用UTF- 8的编码格式(携带的请求体)

    NSData *data = [kNewsListParam dataUsingEncoding:NSUTF8StringEncoding];
  5. Post请求 携带一个请求体

    [request setHTTPBody:data];
  6. 创建同步链接

    NSData *newData = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];
  7. 解析数据

    NSMutableDictionary *dataDic = [NSJSONSerialization JSONObjectWithData:newData options:(NSJSONReadingMutableContainers) error:nil];

POST异步

代理方法 异步请求

  1. 获取网址对象

    定义宏 #define kNewsListURL 网址

     NSURL *url = [NSURL URLWithString:kNewsListURL];
  2. 利用网址对象创建请求

    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url cachePolicy:(NSURLRequestUseProtocolCachePolicy) timeoutInterval:10];
  3. 设置请求标示符

    [request setHTTPMethod:@"Post"];
  4. 给请求添加请求体

    NSData *data = [kNewsListParam dataUsingEncoding:NSUTF8StringEncoding];[request setHTTPBody:data];
  5. 利用请求创建一个链接(异步代理方法)

    self.conn = [NSURLConnection connectionWithRequest:request delegate:self];[self.conn start];
  6. 代理方法

    参考Get代理方法的异步请求

        - (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response    {        self.receiveData = [NSMutableData data];        NSLog(@"%@", response);    }    - (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data    {        [self.receiveData appendData:data];    }        - (void)connectionDidFinishLoading:(NSURLConnection *)connection    {        NSMutableDictionary *dataDic = [NSJSONSerialization JSONObjectWithData:self.receiveData options:(NSJSONReadingMutableContainers) error:nil];    }    - (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error    {        NSLog(@"请求失败时触发 %@", error);    }

block 异步请求

  1. 获取网址对象

    定义宏 #define kNewsListURL 网址

     NSURL *url = [NSURL URLWithString:kNewsListURL];
  2. 利用网址对象创建请求

    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url cachePolicy:(NSURLRequestUseProtocolCachePolicy) timeoutInterval:10];
  3. 设置请求标示符

    [request setHTTPMethod:@"Post"];
  4. 给请求添加请求体

    NSData *data = [kNewsListParam dataUsingEncoding:NSUTF8StringEncoding];[request setHTTPBody:data];
  5. 回到主线程

    [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {    // 可以对data进行JSON解析    // 当数据请求完成的时候 会指定这个block    NSLog(@"%@", data);    // 判断是否在主线程    NSLog(@"%d", [NSThread isMainThread]);}];

GET请求方式 和POST请求方法对比

相同点:都能给服务器传输数据。

不同点:

  • 给服务器传输数据的⽅式:
    GET:通过⺴址字符串。
    POST:通过data

  • 传输数据的⼤⼩:
    GET:⺴址字符串最多255字节。
    POST:使⽤NSData,容量超过1G

  • 安全性:
    GET:所有传输给服务器的数据,显⽰在⺴址⾥,类似于密码的明⽂输⼊,直接可⻅。
    POST:数据被转成NSData(⼆进制数据),类似于密码的密⽂输⼊,⽆法直接读取。

服务器端PHP简单接⼝

PHP中使⽤不同的函数获取数据,⽀持不同的请求⽅式:

  • GET请求:使⽤ $_GET[“key”] 获取数据⺴址中的数据
  • POST请求:使⽤ $_POST[“key”] 获取上传data中的数据
  • GET、POST请求:使⽤ $_REQUEST[“key”] 获取数据
0 0
原创粉丝点击