AlamoFire 4.X 中的 URL 编码
Posted
技术标签:
【中文标题】AlamoFire 4.X 中的 URL 编码【英文标题】:URL Encoding in AlamoFire 4.X 【发布时间】:2017-08-03 17:27:57 【问题描述】:我正在尝试从公共网络服务器获取 JPG 文件,而无需任何身份验证。使用 AlamoFire 4.4 在 Swift 3 中完成编码
urlString 具有以下值: https://drscdn.500px.org/photo/36406120/m%3D900_k%3D1_a%3D1/v2?client_application_id=29771&webp=true&sig=97ac488f1336f41d9f3e4a67e6bf99b3bd1aadfb6c9631a6097ff5b4a729a94e
let url = URL(string: urlString)
let myParameters: [String : AnyObject] = ["myImage": image, "myBlurredImage": blurredImage, "index": index as AnyObject]
let croppedSize = CGSize(width: self.scrollViewWidth!, height: self.scrollViewHeight!)
self.apicounterPerRequest += 1
Alamofire.request(url!, method: .get, parameters: myParameters, encoding: URLEncoding.default)
.validate()
.response response in
let myImage = myParameters["myImage"] as! UIImageView
let myBlurredImage = myParameters["myBlurredImage"] as! UIImageView
let index = myParameters["index"] as! Int
if let downloadedImage = UIImage(data: response.data!)
myImage.image = downloadedImage
self.displayed500PxPhoto[index].uiimage = downloadedImage
myBlurredImage.image = PhotoManager.imageWithSize(downloadedImage, size: croppedSize)
completion(
print("Done Downloading")
)
else
print("Error : \(response.data)")
if response.error != nil
print(response.error!)
self.showAlert("One or more photos could not be downloaded. Please try again.")
completion(
throw response.error!
)
我收到 403 错误:
Error : Optional(409 bytes)
responseValidationFailed(Alamofire.AFError.ResponseValidationFailureReason.unacceptableStatusCode(403))
我很确定上面发布的 URL 中的保留字符存在编码问题,但还不知道如何正确地告诉 AlamoFire 如何对其进行编码。任何线索都受到高度赞赏。感谢您的帮助。
【问题讨论】:
我注意到您正在使用 - encoding: URLEncoding.default 这意味着您在查询字符串中传递参数。是否可以手动将参数添加到您提供的查询字符串中,看看结果如何? 【参考方案1】:请尽量简单
这些提示可以帮助您:
默认方法是get
,所以不需要传递。
参数可能需要为空(因为我不认为你想传递一个 UIImageView)
不要通过存储["myImage": image]
然后再取回它来添加额外的不需要的工作。
不要对索引进行不必要的转换为AnyObject
,因为Alamofire
接受Parameters = [String: Any]
响应是数据,因此请使用responseData
函数
这是我的工作示例:
func testingImage(_ completion: @escaping ((UIImage?) -> Swift.Void))
let urlString = "https://drscdn.500px.org/photo/36406120/m%3D900_k%3D1_a%3D1/v2?client_application_id=29771&webp=true&sig=97ac488f1336f41d9f3e4a67e6bf99b3bd1aadfb6c9631a6097ff5b4a729a94e"
guard let url = URL(string: urlString) else return completion(nil)
Alamofire.request(url).validate().responseData
guard let data = $0.data else return completion(nil)
guard let image = UIImage(data: data) else return completion(nil)
completion(image)
你可以这样称呼它
testingImage() self.imageView.image = $0
$0
表示返回的参数(如果您不想指定名称,则使用)而不是 response in
【讨论】:
因为我没有意识到我能做到这一点......对不起。我已经做了。再次感谢您的帮助,祝您周末愉快。以上是关于AlamoFire 4.X 中的 URL 编码的主要内容,如果未能解决你的问题,请参考以下文章