2017-09-10 51 views
0

過去一週,我一直試圖通過在Alamofire中使用它們的API來從第三方Web服務獲取身份驗證令牌。我實施了不同類型的解決方案。問題是Web服務僅提供有關如何使用curl連接到其服務的文檔。但我想用Alamofire連接它,因爲我正在開發一個iOS應用程序。使用Alamofire將Curl命令轉換爲Swift

下面我已經發布了不同的解決方案,我已經實現了400個狀態代碼或404的回來。有人會引導我通過這個?

下面是使用Alamofire的curl命令我要轉換爲SWIFT:

curl "https://api.webservice.com/oauth/token?client_id=<your-client-id>&client_secret=<your-client-secret>&grant_type=client_credentials" 

爲了從認證客戶端收到一個訪問令牌,你必須爲它提供一個客戶端ID和客戶端密鑰是提供。

這裏是一些我曾嘗試實施的解決方案:

func doAuth(){ 
    let parameters = ["ClientID": clientID, "clientSecret": clientSecret] 

    Alamofire.request("https://api.everypixel.com/oauth/token", method: .post, parameters: parameters, encoding: JSONEncoding.default, headers: nil).responseJSON { (response:DataResponse<Any>) in 

     switch(response.result) { 
     case .success(_): 
      if response.result.value != nil{ 
       print(response.result.value as Any) 
      } 
      break 

     case .failure(_): 
      print(response.result.error as Any) 
      break 

     } 
    } 

    let user = clientID 
    let password = clientSecret 
    let credentialData = "\(user):\(password)".data(using: String.Encoding.utf8)! 
    let base64Credentials = credentialData.base64EncodedString(options: []) 
    let headers = ["Authorization": "Bearer \(base64Credentials)"] 
    print(credentialData) 
    Alamofire.request(tokenRequestURL, 
         method: .post, 
         parameters: nil, 
         encoding: URLEncoding.default, 
         headers:headers) 
     .validate() 
     .responseJSON { response in 
      if response.result.value != nil{ 
       print(response) 
      }else{ 

       print("found an error") 
      } 
    } 

    let response = Alamofire.request(tokenRequestURL, method: .get).authenticate(user: clientID, password: clientSecret).response?.statusCode 
    print(response) 


    let key = clientID 
    let secret = clientSecret 

    let url = tokenRequestURL 

    var request = URLRequest(url: url!) 

    request.addValue("application/json", forHTTPHeaderField: "Accept") 
    request.addValue("sso-key \(key):\(secret)", forHTTPHeaderField: "Authorization") 
    let task = URLSession.shared.dataTask(with: url!) { data, response, error in 
     guard error == nil else { 
      print(error!) 
      return 
     } 
     guard let data = data else { 
      print("Data is empty") 
      return 
     } 

     print(response) 
    } 

    task.resume() 
} 

回答

0

在你的代碼使用method: .post,在不需要它。還有一些錯誤的參數名稱(例如"ClientID": clientID應重命名爲"client_id": clientID)。這可能是400或404狀態碼的原因。

至少這GET請求工作對我來說沒有400個或404狀態碼:

Alamofire 
     .request(
      "https://api.everypixel.com/oauth/token", 
      parameters:[ 
       "client_id"  : clientID, 
       "client_secret" : clientSecret, 
       "grant_type" : "client_credentials" 
      ] 
     ) 
     .responseString { response in 
      switch response.result { 
      case .success(let value): 
       print("from .success \(value)") 
      case .failure(let error): 
       print(error) 
      } 
    }