从 URLRequestConvertible 扩展时设置多部分请求的最佳方法是啥

Posted

技术标签:

【中文标题】从 URLRequestConvertible 扩展时设置多部分请求的最佳方法是啥【英文标题】:What's the best way to set up a multipart request when extending from URLRequestConvertible从 URLRequestConvertible 扩展时设置多部分请求的最佳方法是什么 【发布时间】:2017-07-10 13:54:58 【问题描述】:

我正在为我正在处理的项目(ios、Swift 3、Alamofire)设置网络层,并且我一直在使用 Alamofire 的文档来执行此操作。

在决定如何在使用从 URLRequestConvertible 扩展的路由器枚举时添加多部分请求时需要帮助。在 Alamofire 文档中,它解释了如何执行多部分请求,但它的执行方式似乎不太适合其路由器和 URLRequestConvertible 协议的实现。

这就是他们进行分段上传的方式:

Alamofire.upload(
    multipartFormData:  multipartFormData in
        multipartFormData.append(unicornImageURL, withName: "unicorn")
        multipartFormData.append(rainbowImageURL, withName: "rainbow")
    ,
    to: "https://httpbin.org/post",
    encodingCompletion:  encodingResult in
        switch encodingResult 
        case .success(let upload, _, _):
            upload.responseJSON  response in
                debugPrint(response)
            
        case .failure(let encodingError):
            print(encodingError)
        
    
)

这是我一直关注的路由器的基本实现:

import Alamofire

enum Router: URLRequestConvertible 

    //Different cases go here:
    case example

    var method: HTTPMethod 

        switch self 
        default:
            return .get
        
    

    static let basePath = "http://example.com"

    var path: String 

        switch self 
        default:
            return ""
        
    

    func asURLRequest() throws -> URLRequest 
        let url = try Router.basePath.asURL()

        var urlRequest = URLRequest(url: url.appendingPathComponent(path))
        urlRequest.httpMethod = method.rawValue

        //Add needed headers here
        switch self 
        default:
            break
        

        // If URL has params, add them here
        switch self 
        default:
            break
        

        return urlRequest
    

有人可以指出如何将两者结合起来的正确方向吗?

【问题讨论】:

【参考方案1】:

Alamofire 有一个分段上传 API,它以 URLRequestConvertible 作为参数。从你上面的例子:

Alamofire.upload(multipartFormData:  multipartFormData in
        multipartFormData.append(unicornImageURL, withName: "unicorn")
        multipartFormData.append(rainbowImageURL, withName: "rainbow")
    , 
    with: Router.example,
    encodingCompletion:  encodingResult in
        switch encodingResult 
        case .success(let upload, _, _):
            upload.responseJSON  response in
                debugPrint(response)
            
        case .failure(let encodingError):
            print(encodingError)
        
    )

【讨论】:

我确实意识到了这一点,但我正在寻找一种将 multipartFormData 包装到 URLRequestConvertible 中的方法,这样我就可以像其他所有请求一样完全抽象请求。我找不到一个,所以应用程序中的两个多部分请求有自己的自定义方法来包装它们。这没什么大不了的,但它有点困扰我:(

以上是关于从 URLRequestConvertible 扩展时设置多部分请求的最佳方法是啥的主要内容,如果未能解决你的问题,请参考以下文章

如何使用一些预定义参数创建“枚举路由器:URLRequestConvertible”

使用 URLRequestConvertible 协议将 JSON 嵌套为请求参数 (Alamofire)

使用 URLRequestConvertible 的单元测试中的链接错误

如何减少 responseJSON 中的样板,就像我使用 URLRequestConvertible 对相关的 Web 调用进行分组一样

Swift 3 - 创建简单请求方法 POST (URLRequestConvertible) 的问题

无法将“NSMutableURLRequest”(0x11beb7040)类型的值转换为“Alamofire.URLRequestConvertible”(0x11beb9040)