最好的学习方法就是 领悟 + 证悟。
此篇文章的理论基础主要是与HTTP网络通信协议相关。为集中精力,可以先把TCP/IP协议这些置之不理,也就是先只关注HTTP的请求和响应的结构。HTTP完整的原理内容就此略过。在此只略提相关内容。文中涉及的设计源码可以通过这里获取 https://github.com/wuqingjian2015/uploadHelper,有意者可以去看看。
HTTP是干什么用的呢?
先考虑一下以下应用过程:
- 从客户端向服务器端发起一个请求。
- 服务器端处理请求。
- 服务器端发送一个响应。
那么,如果应用上面过程来实现上传文件这个功能,需要做到几方面:
- 要上传的文件需要捆绑在这个请求里面。
- 服务器端能够理解该请求,作出相关处理:如能提取出文件内容,存放在某一个文件目录下;如能提取当中某些指令,调用相关的指令处理程序。
- 服务器端发送一个响应,客户端应该能够理解该响应内容。
HTTP协议就是解决以上这些问题的。它定义了请求体结构和响应体结构。只要客户端或服务端遵守这个标准,它就能与任何遵守这一标准的应用程序通信。
如果再想实地观察一下符合HTTP标准的请求体和响应体“长”什么样,可以用一些抓包工具。我用了Wireshark和Charles。如果你的是网页应用,可以在IE上按F12键调出开发工具窗口的网络Tab。
在这里,我们只关注请求,了解响应StatusCode是200表示正常。
对于请求,因为iOS会自动设置其他内容,如果咱们不设置的话。下面只讨论其中的
- 上传到的目标地址
- 请求标头中的Content-Type
- 以及请求正文的内容
如何设置目标地址?在创建NSURLRequest时,指定URL即可。如,
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:self.targetURL];