尊重原作者收集的资料,复制粘贴只为了避免作者文章出处哪天抽风了访问不了了导致资料消失。

原文地址 http://bbs.neworigin.net/forum.php?mod=viewthread&tid=488

在开发网络相关的应用,比如微博应用时,就必然需要使用到HTTP请求来发送或者接收数据。最主要的就是使用GET方法或者POST方法。本文将详细介绍HTTP请求在iOS开发中的编程实现。
1、对于HTTP请求的基本介绍
这里不对原理做过多的介绍,大家可以Google之。对于完全不了解的童鞋,这里作个基本的说明。举新浪开放平台为例,我们要从手机发布一条新的状态,需
要通过网络向新浪微博的服务器发送请求,这个请求中包含了我们要发送的状态信息。请求的URL必须是新浪开放平台指定的才行。比如这个发送状态,URL是https://api.weibo.com/2/statuses/update.json
大家可以自己到开放平台查看,然后使用的HTTP请求方式是POST。然后要附带一些请求参数。HTTP请求有GET,POST,DELETE等等方式,
不同的方式它的URL
request格式不同,对于大多数使用情况,使用GET和POST就行。然后如果发送请求成功的话,就可以从服务器接受到相关的信息。
GET是比较简单的请求方式,在URL中直接就包含了要发送的所有参数。还是以新浪开放平台的请求为例。我们要获取获取某个用户最新发表的微博列表。那么这个基本的URL是https://api.weibo.com/2/statuses/user_timeline.json ,然后由于这个请求主要是接收数据,要附带的请求参数最基本的就两个,一个是access_token,一个uid就是用户的编号。
那么一个基本的GET请求的URL就是
https://api.weibo.com/2/statuses ... uid=xxxxxxxxxxxxxxx
那么在iOS开发中,确定了URL,然后就是建立URLRequest,NSURLConnection去实现请求。当然,在实际中,GET方法也有它相关的报文格式,如下:

  1. GET /api.weibo.com/2/statuses/user_timeline.json?access_token=xxxxxxxxxxxxxxxxxxxxxxxxxxx&uid=xxxxxxxxxxxxxxx HTTP/1.1
  2. Host: api.weibo.com
  3. HTTP/1.1 200 OK
  4. Content-Type: text/xml; charset=utf-8Content-Length: length


这里的很多参数都是默认,在Xcode中创建NSURLConnection的时候会自动加上。
下面说一下POST。POST可以这样理解主要用于向服务器上传数据,简单一点的是上传文字,复杂一点的是上传图片声音等等。那么对于这种需求显然如果使
用GET的话,那么这URL未免会太长。因此有POST方式的存在,可以在基本的URL的情况下,再附加一个数据包,包含要上传的数据,然后和URL一起
发送给服务器。
POST方法有两种格式,一种是基本的格式,一般用于发送文字信息。
Post请求基本格式如下:

  1. POST /login.asp HTTP/1.1
  2. Host: www.example.com
  3. Content-Type: application/x-www-form-urlencoded
  4. Content-Length: 35
  5. username=wantsoft&password=password   //post的数据


另一种是multipart/form-data,格式如下

  1. POST /upload_file/UploadFile HTTP/1.1
  2. Accept: text/plain, */*
  3. Accept-Language: zh-cn
  4. Host: www.example.com
  5. Content-Type:multipart/form-data;boundary=---------------------------7d33a816d302b6
  6. User-Agent: Mozilla/4.0 (compatible; OpenOffice.org)
  7. Content-Length: 424
  8. Connection: Keep-Alive -----------------------------7d33a816d302b6
  9. Content-Disposition:form-data;
  10. name="userfile";
  11. filename="userfile"
  12. Content-Type: application/octet-stream abbXXXccc
  13. -----------------------------7d33a816d302b6
  14. Content-Disposition: form-data;
  15. name="text1" foo
  16. -----------------------------7d33a816d302b6
  17. Content-Disposition: form-data;
  18. name="password1" bar
  19. -----------------------------7d33a816d302b6--


看起来比较复杂,其实就是把请求数据通过分界线也就是Boundary分开,至于开头的一些内容,很多都是默认,无需考虑。
2、Xcode编程实现
2.1 HTTP请求的基本方法
STEP 1: 创建URL
一般我们用于URL的字符串。通过字符串创建URL

  1. NSString URLString;
  2. NSURL *URL = [NSURLURLWithString:[URLStringstringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];

复制代码

上面附加的stringByAddingPercentEscapesUsingEncoding:是为了保证URL字符串有效。
STEP 2:创建URLRequest

  1. NSMutableURLRequest
    *URLRequest =
    [[NSMutableURLRequestalloc]initWithURL:finalURLcachePolicy:NSURLRequestReloadIgnoringLocalCacheDatatimeoutInterval:SR_TIME_OUT_INTERVAL];
  2. //如果是GET
  3. [URLRequest setHTTPMethod:@"GET"];
  4. //如果是POST
  5. [URLRequest setHTTPBody:[HTTPBodyStringdataUsingEncoding:NSUTF8StringEncoding]];
  6. [URLRequestsetHTTPMethod:@"POST"];

复制代码

STEP 3:通过NSURLConnection实现请求
一般有两种方式,如果不需要知道请求的进度,比如文字上传,那么用简单的异步请求。如下:

  1. NSOperationQueue *queue = [[NSOperationQueuealloc]init];
  2. [NSURLConnectionsendAsynchronousRequest:self.URLRequestqueue:queuecompletionHandler:^(NSURLResponse
    *response,NSData *data,NSError *error){...};

复制代码

如果要知道请求的进度,比如图片发送的情况。那么就应该创建一个NSURLConnection的实例,并设置其delegate,通过其delegate方法来获取请求的实时状态,具体使用方法详见开发文档。
2.2 HTTP GET方法的实现
主要讲如何创建NSURLRequest
这里我直接将我写的方法放下面:

  1. - (NSURLRequest *)HTTPGETRequestForURL:(NSURL *)url parameters:(NSDictionary *)parameters
  2. {
  3. NSString *URLFellowString = [@"?"stringByAppendingString:[selfHTTPBodyWithParameters:parameters]];
  4. NSString *finalURLString =
    [[url.absoluteStringstringByAppendingString:URLFellowString]stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
  5. NSURL *finalURL = [NSURLURLWithString:finalURLString];
  6. NSMutableURLRequest *URLRequest =
    [[NSMutableURLRequestalloc]initWithURL:finalURLcachePolicy:NSURLRequestReloadIgnoringLocalCacheDatatimeoutInterval:TIME_OUT_INTERVAL];
  7. [URLRequestsetHTTPMethod:@"GET"];
  8. return URLRequest;
  9. }
  10. - (NSString *)HTTPBodyWithParameters:(NSDictionary *)parameters
  11. {
  12. NSMutableArray *parametersArray = [[NSMutableArrayalloc]init];
  13. for (NSString *keyin [parametersallKeys]) {
  14. id value = [parameters objectForKey:key];
  15. if ([value isKindOfClass:[NSStringclass]]) {
  16. [parametersArrayaddObject:[NSStringstringWithFormat:@"%@=%@",key,value]];
  17. }
  18. }
  19. return [parametersArray componentsJoinedByString:@"&"];
  20. }

复制代码

基本上就是通过方法把请求参数与URL连接起来,然后创建NSURLRequest
2.3 HTTP POST 基本方法的实现

  1. - (NSURLRequest *)HTTPPOSTNormalRequestForURL:(NSURL *)url parameters:(NSDictionary *)parameters
  2. {
  3. NSMutableURLRequest *URLRequest =
    [[NSMutableURLRequestalloc]initWithURL:urlcachePolicy:NSURLRequestReloadIgnoringLocalCacheDatatimeoutInterval:TIME_OUT_INTERVAL];
  4. NSString *HTTPBodyString = [selfHTTPBodyWithParameters:parameters];
  5. [URLRequest setHTTPBody:[HTTPBodyStringdataUsingEncoding:NSUTF8StringEncoding]];
  6. [URLRequestsetHTTPMethod:@"POST"];
  7. return URLRequest;
  8. }

复制代码

这个和GET极其类似,只不过是把请求参数放在了HTTPBody中了。
2.4 HTTP POST Multipart

  1. - (NSURLRequest *)HTTPPOSTMultipartRequestForURL:(NSURL *)url parameters:(NSDictionary *)parameters
  2. {
  3. NSMutableURLRequest *URLRequest =
    [[NSMutableURLRequestalloc]initWithURL:urlcachePolicy:NSURLRequestReloadIgnoringLocalCacheDatatimeoutInterval:TIME_OUT_INTERVAL];
  4. NSString *contentType = [NSStringstringWithFormat:@"multipart/form-data;boundary=%@",SR_POST_BOUNDARY];
  5. // 设置内容的类型 contentType,这完全是按照POST的格式来设置
  6. [URLRequestsetValue:contentType forHTTPHeaderField:@"Content-Type"];
  7. [URLRequestsetHTTPMethod:@"POST"];
  8. [URLRequest setHTTPBody:[selfHTTPPOSTMultipartBodyWithParameters:parameters]];
  9. return URLRequest;
  10. }
  11. // 用于创建Multipart Body,需要分割线,也是完全参考POST格式
  12. - (NSData *)HTTPPOSTMultipartBodyWithParameters:(NSDictionary *)parameters
  13. {
  14. NSMutableData *body = [NSMutableDatadata];
  15. // Add Body Prefix String
  16. [body appendData:[[NSStringstringWithFormat:@"--%@\r\n",SR_POST_BOUNDARY]dataUsingEncoding:NSUTF8StringEncoding]];
  17. // Add Main Body
  18. for (NSString *keyin [parametersallKeys]) {
  19. id value = [parameters objectForKey:key];
  20. if ([value isKindOfClass:[NSStringclass]]){
  21. [body
    appendData:[[NSStringstringWithFormat:@"Content-Disposition: form-data;
    name=\"%@\"\r\n\r\n%@\r\n",key,value]dataUsingEncoding:NSUTF8StringEncoding]];
  22. [body appendData:[[NSStringstringWithFormat:@"--%@\r\n",SR_POST_BOUNDARY]dataUsingEncoding:NSUTF8StringEncoding]];
  23. }else {
  24. NSLog(@"please use addMultiPartData:withName:type:filename: Methods to implement");
  25. }
  26. }
  27. return body;
  28. }
  29. // 在最后要附加上请求参数中的图片等等大的数据!
  30. - (void)addMultiPartData:(NSData *)data
  31. withName:(NSString *)name
  32. type:(NSString *)type
  33. filename:(NSString *)filename
  34. {
  35. NSMutableURLRequest *URLRequest = [self.URLRequestmutableCopy];
  36. NSMutableData *body = [URLRequest.HTTPBodymutableCopy];
  37. // Step 1
  38. NSString *disposition = [[NSStringalloc]init];
  39. if (!filename) {
  40. disposition =
  41. [NSStringstringWithFormat:@"Content-Disposition: form-data; name=\"%@\"; filename=\"%@\"\r\n", name, filename];
  42. }else {
  43. disposition =
  44. [NSStringstringWithFormat:@"Content-Disposition: form-data; name=\"%@\"; filename=\"%@\"\r\n", name, name];
  45. }
  46. [body appendData:[dispositiondataUsingEncoding:NSUTF8StringEncoding]];
  47. // Step 2
  48. NSString *contentType = [NSStringstringWithFormat:@"Content-Type: %@\r\n\r\n",type];
  49. [body appendData:[contentTypedataUsingEncoding:NSUTF8StringEncoding]];
  50. // Step 3
  51. [bodyappendData:data];
  52. // Step 4 Add suffix boundary
  53. NSString *boundary = [NSStringstringWithFormat:@"\r\n--%@--\r\n",SR_POST_BOUNDARY];
  54. [body appendData:[boundarydataUsingEncoding:NSUTF8StringEncoding]];
  55. // Step 5
  56. [URLRequestsetHTTPBody:body];
  57. self.URLRequest = URLRequest;
  58. }

复制代码

3、下面说一下接受数据
一般我们要把NSData数据变成JSON数据,大都是情况下获得的JSON Object是NSDictionary或NSArray
基本方法是

  1. id receivedData =

    [NSJSONSerializationJSONObjectWithData:dataoptions:NSJSONReadingMutableContainers
    |NSJSONReadingMutableLeaveserror:nil];

复制代码

然后就可以进行相关的处理了!

HTTP请求 GET POST 网络编程实现(转)的更多相关文章

  1. HTTP请求 GET POST 网络编程实现

      HTTP请求 GET POST 网络编程实现(转) 原文地址 http://bbs.neworigin.net/forum.php?mod=viewthread&tid=488 在开发网络 ...

  2. 8.6 day27 网络编程 osi七层协议 Time模块补充知识 TCP协议

    Time模块补充知识 date和datetime区别是什么? date 就是年月日 datetime就是年月时时分秒 以下代码为什么会报错? import json from datetime imp ...

  3. Java网络编程 -- BIO 阻塞式网络编程

    阻塞IO的含义 阻塞(blocking)IO :阻塞是指结果返回之前,线程会被挂起,函数只有在得到结果之后(或超时)才会返回 非阻塞(non-blocking)IO :非阻塞和阻塞的概念相对应,指在不 ...

  4. Java工程师学习指南第5部分:Java网络编程与NIO

    本文整理了微信公众号[Java技术江湖]发表和转载过的Java网络编程相关优质文章,想看到更多Java技术文章,就赶紧关注本公众号吧. 深度解读 Tomcat 中的 NIO 模型 [Java基本功]浅 ...

  5. JAVA基础知识之网络编程——-网络基础(Java的http get和post请求,多线程下载)

    本文主要介绍java.net下为网络编程提供的一些基础包,InetAddress代表一个IP协议对象,可以用来获取IP地址,Host name之类的信息.URL和URLConnect可以用来访问web ...

  6. 网络编程---(数据请求+slider)将网络上的大文件下载到本地,并打印其进度

    网络编程---将网络上的大文件下载到本地,并打印其进度. 点击"開始传输"button.将网络上的大文件先下载下来,下载完毕后,保存到本地. UI效果图例如以下: watermar ...

  7. 【网络编程3】网络编程基础-arp请求(局域网主机扫描)

    ARP协议 ARP(Add ress Resolution Protocol)地址解析协议位于数据链路层,是根据IP地址获取MAC地址的一个协议. ARP 查看指令 arp -a 显示所有接口的当前A ...

  8. Java网络编程和NIO详解2:JAVA NIO一步步构建IO多路复用的请求模型

    Java网络编程与NIO详解2:JAVA NIO一步步构建IO多路复用的请求模型 知识点 nio 下 I/O 阻塞与非阻塞实现 SocketChannel 介绍 I/O 多路复用的原理 事件选择器与 ...

  9. Java网络编程与NIO详解2:JAVA NIO 一步步构建IO多路复用的请求模型

    本文转载自:https://github.com/jasonGeng88/blog 本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 http ...

随机推荐

  1. C#编写最小化时隐藏为任务栏图标的 Window appllication.

    1.设置WinForm窗体属性showinTask=false 2.加notifyicon控件notifyIcon1,为控件notifyIcon1的属性Icon添加一个icon图标. 3.添加窗体最小 ...

  2. vs 2015 写php太爽了,毕竟我接触的第一款ide就是vs啊

  3. HDU4511 AC自动机+dijkstra

    题意: Description 终于放寒假了,小明要和女朋友一起去看电影.这天,女朋友想给小明一个考验,在小明正准备出发的时候,女朋友告诉他,她在电影院等他,小明过来的路线必须满足给定的规则:  1. ...

  4. hdu3341Lost's revenge(ac自动机+dp)

    链接 类似的dp省赛时就做过了,不过这题卡内存,需要把当前状态hash一下,可以按进制来算出当前的状态,因为所有的状态数是不会超过10*10*10*10的,所以完全可以把这些存下来. 刚开始把trie ...

  5. 高斯混合模型与EM算法

    对于高斯混合模型是干什么的呢?它解决什么样的问题呢?它常用在非监督学习中,意思就是我们的训练样本集合只有数据,没有标签. 它用来解决这样的问题:我们有一堆的训练样本,这些样本可以一共分为K类,用z(i ...

  6. MFC编程入门之十五(对话框:一般属性页对话框的创建及显示)

    属性页对话框包括向导对话框和一般属性页对话框两类,上一节讲了如何创建并显示向导对话框,本节将继续介绍一般属性页对话框的创建和显示. 实际上,一般属性页对话框的创建和显示过程和向导对话框是很类似的.将上 ...

  7. angular 三目运算符 需要换色或style

    解决方法:直接简单粗暴写两个.有点挫,但实现需求了. <font style="color:red" ng-show="boxlist.lineTitle.leng ...

  8. oracle中DDL DML指什么?

    DDL create table 创建表 alter table 修改表 drop table 删除表 truncate table 删除表中所有行 create index 创建索引 drop in ...

  9. 使用Chrome工具来分析页面的绘制状态

    Chrome Canary(Chrome “金丝雀版本”)目前已经支持Continuous painting mode,用于分析页面性能.这篇文章将会介绍怎么才能页面在绘制过程中找到问题和怎么利用这个 ...

  10. hdu 5877/ 2016 ACM/ICPC Dalian Online 1010 Weak Pair

    题目链接 分析:树上的节点祖先与儿子的关系,一般就会想到dfs序.正解就是对树先进行dfs序排列,再将问题转化到树状数组统计个数.应该把节点按照权值从大到小排序,这样对于,就是从小到大的顺序.这样更新 ...