HTTP 报文部分协议 Swift示例

一:HTTP报文部分分析

  1. 请求报文的格式(从这个地方盗的图):

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GOjNM7pq-1597330367569)(/Users/lj/sutdy/typora/20170330192653242.png)]

  2. 请求实例,上传单个文件,并给服务器传递相应的参数

    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--											/*文件传输完毕*/
    
    
  3. 请求实例,传输多个文件

    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--											/*文件传输完毕*/
    
  4. 分析:只要格式按照HTTP协议来写,数据就可以正常传输

    掌握一个可靠的工具来分析报文还是很有必要的(Charles…)

二:swift实例

  1. 单文件上传

    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))
            }
        }
    
  2. 多文件上传

    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))
            }
        }
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值