2017-08-03 56 views
0

我試圖從公共網絡服務器上獲取JPG文件,沒有任何形式的身份驗證。編碼是斯威夫特3 AlamoFire完成4.4AlamoFire 4.X中的網址編碼

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如何對其進行編碼。任何線索都非常感謝。感謝您的幫助。

+0

我注意到您使用的 - 編碼:URLEncoding.default這意味着你傳遞參數的查詢字符串。您可以手動將參數添加到您提供的查詢字符串中,並查看結果是什麼? –

回答

0

請簡單

這些都是一些提示,以幫助您:

  • 的默認方法是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

+0

非常感謝。奇蹟般有效。 –

+0

@JessicaMeckmann你爲什麼不接受答案 – zombie

+0

因爲我沒有意識到我可以這樣做......我很抱歉。我已經做了。再次感謝您的幫助和愉快的週末。 –