从 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)