zoukankan      html  css  js  c++  java
  • 网络处理1-异步GET请求

    前言

    云计算

    近几年来,云计算是一个非常热门的技术名词。非常多专家觉得。云计算会改变互联网的技术基础,甚至会影响整个产业的格局。可能还非常多人不了解什么是云计算,简单来说。就是把用户的数据(比方文档、照片等)、用户须要使用的软件、用户须要搜索的资源都保存在"云端"。并不用保存在用户本地。你能够将"云端"看做了一台超级计算机。事实上是由无数台大型server组成的。

    移动应用

    如今非常多的移动应用也类似于"云计算"的模式。比方新浪微博,用户的数据都是保存在新浪server的数据库里面。当用户想在手机上看到自己的微博数据时,大致须要下面几个过程:

    1.新浪微博手机client发送HTTP请求到新浪server

    2.server响应后返回数据给client

    3.client对数据进行解析后以图形界面的形式(如列表形式)呈现给用户

    网络处理这一块在移动开发中占领着很重要的地位,我们这个专题主要来学习iOS网络处理中的HTTP请求。

     

    一、API简单介绍

    假设你想在iOS中发送Http请求的话,有非常多方式能够选择,我在这里介绍几个常见的:

    1.苹果自带的API

    1> Core Foundation框架中的CFNetwork API:纯C语言的API。性能很高

    2> Foundation框架中的NSURLConnection API:Objective-C的API,性能也不错。简单易用

    2.第3方开源框架

    1> ASIHttpRequest

    2> AFNetworking

    我们这个专题主要来研究NSURLConnection的使用。至于第3方框架的学习,网上也有非常多资源能够搜索。

     

    二、发送异步的GET请求

    众所周知。HTTP的主要请求方式有2种:GET请求和POST请求。接下来先演示下怎样发送一个GET请求。

    须要注意的是,你最好发送一个异步请求,不要发送同步请求。

    iOS程序启动后。系统会默认创建一条主线程,也称为UI线程,这条主线程专门用来渲染UI界面、处理UI界面和用户之间的交互,比方处理用户的触摸事件、文本输入事件等。所谓异步请求,就是在后台线程发送请求,不在主线程发送请求。

    普通情况下。client发出请求后,须要等待server的数据返回,假设server处理速度比較慢或者网速慢的话,可能要等非常长时间。因此,假设你执意要发送同步请求。也就是在主线程发送请求,会造成主线程堵塞。easy出现卡机现象。给用户带来极差的体验。

    1.利用NSURLConnection发送异步请求

    复制代码
     1 // 请求地址
     2 NSString *urlString = @"http://192.168.1.102:8080/MJServer/login?

    username=123&pwd=123"; 3 4 // 初始化一个NSURL对象 5 NSURL *url = [NSURL URLWithString:urlString]; 6 7 // 初始化一个请求 8 NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url]; 9 // 设置请求方法,能够省略,默认就是GET请求 10 request.HTTPMethod = @"GET"; 11 // 假设60秒过后server还没有对应,就算请求超时 12 request.timeoutInterval = 60; 13 14 // 初始化一个连接 15 NSURLConnection *conn = [NSURLConnection connectionWithRequest:request delegate:self]; 16 // 開始一个异步请求 17 [conn start];

    复制代码

    1> 第2行的是请求地址,因为是GET请求,请求參数是直接拼接到路径后面的

    2> 第17行调用NSURLConnection的start方法发送一个HTPP请求。默认就是异步请求

     

    2.NSURLConnectionDataDelegate

    在前面的第15行代码中。初始化NSURLConnection对象的时候传了个self做代理(delegate)。我这里的self是控制器。在client跟server交互过程会不断地给这个代理对象发送消息,也就是会不断地调用代理对象的对应方法。

    iOS在NSURLConnectionDataDelegate协议中定义了非常多代理方法,我这里仅仅介绍经常使用的3个方法:

    复制代码
     1 #pragma mark - NSURLConnectionDataDelegate
     2 #pragma mark 接收到server返回的数据时调用(假设数据比較多。这种方法可能会被调用多次)
     3 - (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {
     4     NSLog(@"接收到server返回的数据");
     5     // 拼接数据
     6     [self.data appendData:data];
     7 }
     8 
     9 #pragma mark 网络连接出错时调用
    10 - (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error {
    11     NSLog(@"网络连接出错:%@", [error localizedDescription]);
    12 }
    13 
    14 #pragma mark server的数据已经接收完成时调用
    15 - (void)connectionDidFinishLoading:(NSURLConnection *)connection {
    16     NSLog(@"server的数据已经接收完成");
    17     // 解析成字符串数据
    18     NSString *str = [[[NSString alloc] initWithData:self.data encoding:NSUTF8StringEncoding] autorelease];
    19     NSLog(@"%@", str);
    20 }
    复制代码

    1> 当server有数据返回时就会调用第3行的代理方法。返回的数据以NSData的格式传入。假设数据比較多,比方下载大文件时。这种方法可能会被调用多次。

    2> 第6行用一个NSMutableData对象拼接server返回的全部数据,self.data是一个NSMutableData。

    3> 当server已经成功返回全部的数据后,会调用第15行的代理方法,到此为止。self.data里面存放着server端返回的全部数据

    4> 因为我这边server返回的是JSON字符串数据,所以在18行将self.data转换为NSString,然后打印出来看看数据对不正确

     

    3.对中文參数进行编码

    假设你的请求參数中含有中文,必须先进行编码,然后再拼接到请求路径后面。

    以下的请求路径写法是错误的:

    1 NSString *urlString = @"http://192.168.1.102:8080/MJServer/login?username=母鸡";

    应该这样写:

    复制代码
    1 // 使用UTF-8对中文參数进行编码
    2 NSString *param = [@"母鸡" stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
    3 
    4 // 请求地址
    5 NSString *baseUrl = @"http://192.168.1.102:8080/MJServer/login?username=";
    6 NSString *urlString = [baseUrl stringByAppendingString:param];
    复制代码

    1> 第2行使用UTF-8对中文參数进行编码

    2> 在第6行拼接编码后的參数到请求路径中

     

    4.取消请求

    假设用户的网络状况不是非常好。那么在登录的过程中,用户非常可能会点击"取消"button来取消登录

    当用户点击了取消button。我们也应该终止之前发送的请求,这时候能够这样做

    [conn cancel];

    conn是一个NSURLConnection对象

  • 相关阅读:
    mysql数据库链接与创建
    Jmeter之csv、用户自定义变量以及Query Type分析(八)
    Jmeter之接口测试实战项目运用操作(七)
    SoapUI接口测试之实战运用操作(五)
    SoapUI接口测试之WSDL(四)
    SoapUI接口测试之JDBC(三)
    SoapUI接口测试之HTTP(二)
    Jmeter之参数化(五)
    Jmeter之WSDL(六)
    Java学习之接口
  • 原文地址:https://www.cnblogs.com/lxjshuju/p/6835842.html
Copyright © 2011-2022 走看看