iOS开发实践之GET和POST请求

iOS开发实践之GET和POST请求

GET和POST请求是HTTP请求方式中最最为常见的。在说请求方式之前先熟悉HTTP的通信过程:

请求

1、请求行 : 请求方法、请求路径、HTTP协议的版本

GET /MJServer/resources/images/1.jpg HTTP/1.1

2、请求头 : 客户端的一些描述信息

Host: 192.168.1.111:8080 // 客户端想访问的服务器主机地址

User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9) Firefox/30.0 // 客户端的类型,客户端的软件环境

Accept: text/html, // 客户端所能接收的数据类型

Accept-Language: zh-cn // 客户端的语言环境

Accept-Encoding: gzip // 客户端支持的数据压缩格式

3、请求体 : POST请求才有这个东西

请求参数,发给服务器的数据

响应

1、状态行(响应行): HTTP协议的版本、响应状态码、响应状态描述

Server: Apache-Coyote/1.1 // 服务器的类型

Content-Type: image/jpeg // 返回数据的类型

Content-Length: 56811 // 返回数据的长度

Date: Mon, 23 Jun 2014 12:54:52 GMT // 响应的时间

2、响应头:服务器的一些描述信息

Content-Type : 服务器返回给客户端的内容类型

Content-Length : 服务器返回给客户端的内容的长度(比如文件的大小)

3、实体内容(响应体)

服务器返回给客户端具体的数据,比如文件数据

NSMutableURLRequest(注意:非NSURLRequest因为这个对象是不可变的)

1、设置超时时间(默认60s)

request.timeoutInterval = 15;

2、设置请求方式

request.HTTPMethod = @"POST";

3、设置请求体

request.HTTPBody = data;

4、设置请求头 例如如下是传JSON数据的表头设置

[request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];

GET和POST对比:

GET(默认情况是get请求):

特点:GET方式提交的参数直接拼接到url请求地址中,多个参数用&隔开。例如:http://localhost:8080/myService/login?username=123&pwd=123

缺点:

1、在url中暴露了所有的请求数据,不太安全

2、由于浏览器和服务器对URL长度有限制,因此在URL后面附带的参数是有限制的,通常不能超过1KB

- (IBAction)login {
    NSString *loginUser = self.userName.text;
    NSString *loginPwd = self.pwd.text;
    if (loginUser.length==0) {
        [MBProgressHUD showError:@"请输入用户名!"];
        return;
    }

    if (loginPwd.length==0) {
        [MBProgressHUD showError:@"请输入密码!"];
        return;
    }

     // 增加蒙板
    [MBProgressHUD showMessage:@"正在登录中....."];

    //默认是get方式请求:get方式参数直接拼接到url中
    NSString *urlStr = [NSString stringWithFormat:@"http://localhost:8080/myService/login?username=%@&pwd=%@",loginUser,loginPwd];

    //post方式请求,参数放在请求体中
    //NSString *urlStr = @"http://localhost:8080/myService/login";

    //URL转码
    urlStr = [urlStr stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]];

     //urlStr = [urlStr stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];

    NSURL *url = [NSURL URLWithString:urlStr];

    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];

    //设置超时时间(默认60s)
    request.timeoutInterval = 15;

    //设置请求方式
    request.HTTPMethod = @"POST";

    //设置请求体
    NSString *param = [NSString stringWithFormat:@"username=%@&pwd=%@", loginUser,loginPwd];
    // NSString --> NSData
    request.HTTPBody =  [param dataUsingEncoding:NSUTF8StringEncoding];

     // 设置请求头信息
    [request setValue:@"iphone" forHTTPHeaderField:@"User-Agent"];

    [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse * _Nullable response, NSData * _Nullable data, NSError * _Nullable connectionError) {
        //隐藏蒙板
        [MBProgressHUD hideHUD];
        if(connectionError || data==nil){
            [MBProgressHUD showError:@"网络繁忙!稍后再试!"];
            return ;
        }else{
           NSDictionary *dict =  [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableLeaves error:nil];
            NSString *error =  dict[@"error"];
            if (error) {
                [MBProgressHUD showError:error];
            }else{
                NSString *success = dict[@"success"];
                [MBProgressHUD showSuccess:success];
            }
        }
    }];

}

POST

特点:

1、把所有请求参数放在请求体(HTTPBody)中

2、理论上讲,发给服务器的数据的大小是没有限制

3、请求数据相对安全(没有绝对的安全)

 // 1.URL
    NSURL *url = [NSURL URLWithString:@"http://localhost:8080/myService/order"];

    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];

    request.timeoutInterval = 15;
    request.HTTPMethod = @"POST";

    NSDictionary *orderInfo = @{
                                @"shop_id" : @"1111",
                                @"shop_name" : @"的地方地方",
                                @"user_id" : @"8919"
                                };
    NSData *json = [NSJSONSerialization dataWithJSONObject:orderInfo options:NSJSONWritingPrettyPrinted error:nil];
    request.HTTPBody = json;

    // 5.设置请求头:这次请求体的数据不再是普通的参数,而是一个JSON数据
    [request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];

    [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse * _Nullable response, NSData * _Nullable data, NSError * _Nullable connectionError) {
        if(connectionError || data==nil){
            [MBProgressHUD showError:@"网络繁忙!稍后再试!"];
            return ;
        }else{
            NSDictionary *dict =  [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableLeaves error:nil];
            NSString *error =  dict[@"error"];
            if (error) {
                [MBProgressHUD showError:error];
            }else{
                NSString *success = dict[@"success"];
                [MBProgressHUD showSuccess:success];
            }
        }
    }];

url转码问题(URL中不能包含中文)

1、这方法已过时

NSString *urlStr = [NSString stringWithFormat:@"http://localhost/login?username=喝喝&pwd=123"];
urlStr = [urlStr stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];

2、官方推荐使用:

NSString *urlStr = [NSString stringWithFormat:@"http://localhost/login?username=喝喝&pwd=123"];
    urlStr = [urlStr stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]];
时间: 2024-08-08 16:23:38

iOS开发实践之GET和POST请求的相关文章

iOS 开发实践之 Auto Layout

原:http://xuexuefeng.com/autolayout/?utm_source=tuicool 本文是博主 iOS 开发实践系列中的一篇,主要讲述 iOS 中 Auto Layout(自动布局)在实际项目中的使用. Auto Layout 在 2012 年的 iOS 6 中发布,距今已经 2 年多了,如果从 2011 年在 Mac OS X 上发布的 Auto Layout 开始算起,已经超过 3 年了.如果你的简历上写着 2 年以上工作经验,而竟然不会使用 Auto Layout

iOS 开发实践之Auto Layout(From Vincent Sit)

本文是博主 iOS 开发实践系列中的一篇,主要讲述 iOS 中 Auto Layout(自动布局)在实际项目中的使用. Auto Layout 在 2012 年的 iOS 6 中发布,距今已经 2 年多了,如果从 2011 年在 Mac OS X 上发布的 Auto Layout 开始算起,已经超过 3 年了.如果你的简历上写着 2 年以上工作经验,而竟然不会使用 Auto Layout,真有点不可思议. 本文将会通过若干个 Demo 进行讲解,通过实践来理解 Auto Layout 到底是什么

iOS开发项目篇—35封装网络请求

iOS开发项目篇—35封装网络请求 一.简单说明 1.分析项目对网路请求(AFN框架)的依赖 项目中,多个控制器都使用了AFN框架发送网络请求,如果AFN2.0存在重大BUg,或者是升级至3.0版本,那么对于整个项目都是及其危险的,所有用到AFN的地方都需要做出相应的修改. 另外,如果现在要求不再使用AFN框架,而是使用一个新的框架,那么有关AFN的依赖所关联的所有代码都需要重新来过. 如果把afn这个第三方框架从项目中删除的话,那么项目就相当于作废了,这就是项目对第三方框架的强依赖的体现. 说

iOS开发实践之网络检测Reachability

在网络应用开发中,有时需要对用户设备的网络状态进行实时监控,以至于对用户进行友好提示 或者根据不同网络状态处理不一样的逻辑(如视频播放app,根据当前的网络情况自动切换视频清晰度等等).用Reachability实现网络的检测. 苹果官方提供了Reachability的示例程序,便于开发者检测网络状态 https://developer.apple.com/library/ios/samplecode/Reachability/Reachability.zip 1. 网络状态枚举NetworkS

iOS 开发中使用 NSURLProtocol 拦截 HTTP 请求

这篇文章会提供一种在 Cocoa 层拦截所有 HTTP 请求的方法,其实标题已经说明了拦截 HTTP 请求需要的了解的就是 NSURLProtocol. 由于文章的内容较长,会分成两部分,这篇文章介绍 NSURLProtocol 拦截 HTTP 请求的原理,另一篇文章如何进行 HTTP Mock 介绍这个原理在 OHHTTPStubs 中的应用,它是如何 Mock(伪造)某个 HTTP 请求对应的响应的. NSURLProtocol NSURLProtocol 是苹果为我们提供的 URL Loa

iOS开发实践之网络检測Reachability

在网络应用开发中.有时须要对用户设备的网络状态进行实时监控.以至于对用户进行友好提示 或者依据不同网络状态处理不一样的逻辑(如视频播放app,依据当前的网络情况自己主动切换视频清晰度等等).用Reachability实现网络的检測. 苹果官方提供了Reachability的演示样例程序,便于开发人员检測网络状态 https://developer.apple.com/library/ios/samplecode/Reachability/Reachability.zip 1. 网络状态枚举Net

iOS开发——网络编程OC篇&数据请求总结

数据请求总结 1 //**************************************GET 2 //同步 3 /* 4 //第一步,创建URL 5 NSURL * url = [[NSURL alloc]initWithString:@"http://e.hiphotos.baidu.com/image/w%3D1366%3Bcrop%3D0%2C0%2C1366%2C768/sign=66f9b9980ef431adbcd2473a7d0097cc/08f790529822720

iOS开发实践:一个完整微博客户端的实现

本文基于数据字典和数据流图两种工具讲述一个完整微博客户端的实现.数据字典和数据流图都可以用来表达线程的执行流程,同时定义了需要的类,是进一步设计类的基础. 数据字典实际上是一张表,表的第一个字段是程序代码中的标识符,其它字段具体描述它在线程中被如何使用,以及它所依赖的其它元素,数据字典中各个标识符基本上也是按照线程的执行流程来排序. 数据流图是一个平面拓扑结构,每个节点或者是外部数据,或者是可被线程执行的代码模块.从外部数据到代码模块的边意味着线程在执行代码模块的时候需要用到外部数据,从代码模块

iOS开发实践之cell下载图片(自定义NSOperation)

上一篇文章的下载图片操作都放在了block中,当遇到复杂的操作,一堆的代码放在block中 ,很明显这不是明智的选择,代码显得很臃肿. 因此,把线程操作放到自定义NSOperation中. 自定义NSOperation的步骤:继承NSOperation.重写- (void)main方法,在里面实现想执行的任务. 重写- (void)main方法的注意点: 1.自己创建自动释放池(因为如果是异步操作,无法访问主线程的自动释放池). 2.经常通过- (BOOL)isCancelled方法检测操作是否