【问题标题】:URL Encoding in AlamoFire 4.XAlamoFire 4.X 中的 URL 编码
【发布时间】: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 这意味着您在查询字符串中传递参数。是否可以手动将参数添加到您提供的查询字符串中,看看结果如何?

标签: ios swift xcode alamofire


【解决方案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

【讨论】:

  • 因为我没有意识到我能做到这一点......对不起。我已经做了。再次感谢您的帮助,祝您周末愉快。
猜你喜欢
  • 2017-02-13
  • 1970-01-01
  • 1970-01-01
  • 2017-02-22
  • 2018-06-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多