一:HTTP报文部分分析
-
请求报文的格式(从这个地方盗的图):
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GOjNM7pq-1597330367569)(/Users/lj/sutdy/typora/20170330192653242.png)]
-
请求实例,上传单个文件,并给服务器传递相应的参数
POST /user/userCenter/uploadPhotos.do HTTP/1.1 Host: xxx.xxxx.xxx:8888 /*服务器域名*/ Accept: */* userId: 936573 /*部分自定义消息头*/ session: 2f3ce3ce0e2b42351210539986ea8c627 os: 2 Accept-Language: zh-cn Accept-Encoding: gzip, deflate Content-Type: multipart/form-data; boundary=boundary+fjaksdjf /*指定边界字段*/ Content-Length: 15407 User-Agent: DD/9 CFNetwork/902.2 Darwin/17.7.0 Connection: keep-alive --boundary+fjaksdjf /*参数1*/ Content-Disposition: form-data; name ="file" avatar --boundary+fjaksdjf /*参数2*/ Content-Disposition: form-data; name ="key" 513b019ea10010a86d1a259f3b6faee4 --boundary+fjaksdjf /*开始文件信息部分*/ Content-Disposition: form-data; name="file"; filename="file0.png" Content-Type: image/jpeg �PNG /*文件内容开始*/ IHDRp,��<�sRGB���iDOT(���\IDATx���kUY��_T?Tk��f2�i�Ŵ�T�2�O����X�X�HE�J�DAPD�A�EEŇj'D��r� ��e���/�=�{ϵ���pv��k�o}k���4������ɉwsssjkkO����#uw�������o�===�w{{%U*��W�t�ɓ'Ǹ��-���������C�[ZZc���-�---ٻ%������L��!.ְ��ɞ��wG�3��ښ=m�O��3=�7.t3F^��>���m�^W��ގ��qggW�g]��.ِ>t9�l �ndm�w>� ]��-�|��^�D��Ni�iC!�a== .... �k����p/&�ꨫ����b��{xS�>.W����!_}F���7�u�݀\�?�O_�O_�.��k�}�ׁw�~��Z8�"�����\��x}�W8��qu��ˣĒ_k���G��v˽k����س}snw�tx}�o_���*N�ᄇ+.<�1N�|*��]����l�iIEND�B`� --boundary+fjaksdjf-- /*文件传输完毕*/
-
请求实例,传输多个文件
POST /user/userCenter/uploadPhotos.do HTTP/1.1 Host: xxx.xxxx.xxx:8888 /*服务器域名*/ Accept: */* userId: 936573 /*部分自定义消息头*/ session: 2f3ce3ce0e2b42351210539986ea8c627 os: 2 Accept-Language: zh-cn Accept-Encoding: gzip, deflate Content-Type: multipart/form-data; boundary=boundary+fjaksdjf /*指定边界字段*/ Content-Length: 15407 User-Agent: DD/9 CFNetwork/902.2 Darwin/17.7.0 Connection: keep-alive --boundary+fjaksdjf /*参数1*/ Content-Disposition: form-data; name ="file" avatar --boundary+fjaksdjf /*参数2*/ Content-Disposition: form-data; name ="key" 513b019ea10010a86d1a259f3b6faee4 --boundary+fjaksdjf /*开始文件1信息部分*/ Content-Disposition: form-data; name="file"; filename="file0.png" Content-Type: image/jpeg �PNG /*文件1内容开始*/ IHDRp,��<�sRGB���iDOT(���\IDATx���kUY��_T? ]��-�|��^�D��Ni�iC!�a== ............................................................ �k����p/&�ꨫ����b��{xS�>.ND /*文件1传输完毕*/ --boundary+fjaksdjf /*开始文件2信息部分*/ Content-Disposition: form-data; name="file"; filename="file2.png" Content-Type: image/jpeg �PNG /*文件2内容开始*/ IHDRB$=��sRGB� ��=���R����E�к��e ............................................................ �=�X^Z��,\Á�I;�����ngr�~�ޟ���� /*文件2传输完毕*/ --boundary+fjaksdjf-- /*文件传输完毕*/
-
分析:只要格式按照HTTP协议来写,数据就可以正常传输
掌握一个可靠的工具来分析报文还是很有必要的(Charles…)
二:swift实例
-
单文件上传
func uploadSingle(url: String, data: Data, mime: mimeType, params: [String: Any]?, headers:[String: String]?, fileName: String, completion: @escaping (NetworkResult) -> Void) { if var request = Request.reqeust(urlStr: url, params: nil, headers: headers, method: .post) { var body: Data = Data() var field = "" if let params = params { for (key, value) in params { field.append("\(config.boundaryPre)\(config.boundary)\r\n") field.append("Content-Disposition: form-data; name =\"\(key)\"\r\n\r\n\(value)\r\n") } } field.append("\(config.boundaryPre)\(config.boundary)\r\n") field.append("Content-Disposition: form-data; name=\"file\"; filename=\"\(fileName)\"\r\n") field.append("Content-Type: \(mime.rawValue)\r\n\r\n") if let temp = field.data(using: String.Encoding.utf8) { body.append(temp) } body.append(data) body.append("\r\n\(config.boundaryPre)\(config.boundary)\(config.boundaryPre)".data(using: String.Encoding.utf8)!) request.httpBody = body request.setValue("\(body.count)", forHTTPHeaderField: "Content-Length") request.setValue("multipart/form-data; boundary=\(config.boundary)", forHTTPHeaderField: "Content-Type") request.httpMethod = Method.post.rawValue let task = config.session.dataTask(with: request) {(data, response, error) in if error == nil { completion(NetworkResult.handleServiceResult(response: data?.parse())) }else{ completion(NetworkResult.handleNetworkFailure(err: error)) } } task.resume() }else{ completion(NetworkResult.init(code: 0)) } }
-
多文件上传
func uploadMultiple(url: String, datas: [Data], pathExtension: String, mime: mimeType, params: [String: Any]?, headers:[String: String]?, fileName: String, completion: @escaping (NetworkResult) -> Void){ if var request = Request.reqeust(urlStr: url, params: nil, headers: headers, method: .post) { var body: Data = Data() var field = "" if let params = params { for (key, value) in params { field.append("\(config.boundaryPre)\(config.boundary)\r\n") field.append("Content-Disposition: form-data; name =\"\(key)\"\r\n\r\n\(value)\r\n") } } if field.count > 0, let data = field.data(using: String.Encoding.utf8) { body.append(data) } for (index, data) in datas.enumerated() { field = "" field.append("\(config.boundaryPre)\(config.boundary)\r\n") field.append("Content-Disposition: form-data; name=\"file\"; filename=\"\(fileName)\(index).\(pathExtension)\"\r\n") field.append("Content-Type: \(mime.rawValue)\r\n\r\n") if let temp = field.data(using: String.Encoding.utf8) { body.append(temp) } body.append(data) body.append("\r\n".data(using: String.Encoding.utf8)!) } body.append("\r\n\(config.boundaryPre)\(config.boundary)\(config.boundaryPre)".data(using: String.Encoding.utf8)!) request.httpBody = body request.setValue("\(body.count)", forHTTPHeaderField: "Content-Length") request.setValue("multipart/form-data; boundary=\(config.boundary)", forHTTPHeaderField: "Content-Type") request.httpMethod = Method.post.rawValue let task = config.session.dataTask(with: request) {(data, response, error) in if error == nil { completion(NetworkResult.handleServiceResult(response: data?.parse())) }else{ completion(NetworkResult.handleNetworkFailure(err: error)) } } task.resume() }else{ completion(NetworkResult.init(code: 0)) } }