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 编码的主要内容,如果未能解决你的问题,请参考以下文章

Alamofire .POST 编码 (.URL)

在 Alamofire 中使用之前对 URL 进行编码

Alamofire 编码无效URL

如何阻止 Alamofire 编码 URL 参数

Moya/Alamofire - 具有相同键的 URL 编码参数

使用 SwiftyJSON 对 Alamofire GET 参数进行 URL 编码