2016-01-21 58 views
0

我通過Alamofire向我的API發送POST請求時發生問題,GET工作沒有問題,但是每當我檢查響應時進行POST,我就會得到最後一次GET的結果。Alamofire響應不匹配請求

import Alamofire 
import SwiftyJSON 

class NetworkManager { 
    static let sharedInstace = NetworkManager() 

    let defaultManager: Alamofire.Manager = { 
     let serverTrustPolicies: [String: ServerTrustPolicy] = [ 
      "homestead.app": .DisableEvaluation 
     ] 

     let configuration = NSURLSessionConfiguration.defaultSessionConfiguration() 
     configuration.HTTPAdditionalHeaders = Alamofire.Manager.defaultHTTPHeaders 

     return Alamofire.Manager(
      configuration: configuration, 
      serverTrustPolicyManager: ServerTrustPolicyManager(policies: serverTrustPolicies) 
     ) 
    }() 
} 

internal class ApiHelper { 

    /** 
    Get data from a target URL and return JSON data to be parsed 

    - parameter targetURL: URL to pull data from 
    - parameter success: return data to the calling function 
    - parameter failure: return an error message to the calling function 
    */ 
    private func getDataFromAPI(targetURL: String, success:(JSONData: JSON) ->(), failure:(message: String) ->()) { 

     NetworkManager.sharedInstace.defaultManager.request(.GET, targetURL).responseJSON { response in 
      print(response.result) 
      switch response.result { 
      case .Success: 
       if let jsonRaw = response.result.value { 
        let json = JSON(jsonRaw) 

        success(JSONData: json) 

       } 
      case .Failure(let error): 
       print(error.localizedDescription) 
       failure(message: error.localizedDescription) 
      } 
     } 
    } 

    /** 
    Post data to the target URL and return errors as JSON data to be parsed 

    - parameter targetURL: URL to post to 
    - parameter parameters: JSON data to post 
    - parameter success: return success message to the calling function 
    - parameter failure: return JSON data to the calling function with server error 
    */ 
    private func postDataToAPI(targetURL: String, parameters: [String : AnyObject], success:() ->(), failure:(JSONData: JSON) ->()) { 

     NetworkManager.sharedInstace.defaultManager.request(.POST, targetURL, parameters: parameters, encoding: .JSON).responseJSON { response in 
      debugPrint(response) 

      success() 
     } 
    } 


    /** 
    Post an updated profile to the API 

    - parameter parameters: JSON data to be posted 
    - parameter success: success callback 
    - parameter failure: JSON data of serverError 
    */ 
    internal func postUpdateRequest(parameters: [String : AnyObject], success:() ->(), failure:(JSONData: JSON) ->()) { 
     let url = "https://homestead.app/profile/a/update" 

     postDataToAPI(url, parameters: parameters, success: { 
      success() 
      }, failure: { JSONData in 
       failure(JSONData: JSONData) 
     }) 
    } 

    /** 
    Get all states from the API 

    - parameter success: JSON data of all states 
    - parameter failure: failure message 
    */ 
    internal func getAllStates(success:(JSONData: JSON) ->(), failure:(message: String) ->()) { 
     let url = "https://homestead.app/api/state/all" 
     getDataFromAPI(url, success: 
      { JSONData in 
       success(JSONData: JSONData) 
      }, failure: { message in 
       failure(message: message) 
     }) 
    } 
} 

let api = ApiHelper() 
api.getAllStates({ JSONdata in 
    print(JSONdata) 
    let params: [String : AnyObject] = ["name" : "Bob"] 
    api.postUpdateRequest(params, success: { JSONdata in 
     print("Success") 
     }, failure: { message in 
      print("Message") 
    }) 
    }, failure: { message in 
     print(message) 
}) 

我的代碼首先獲取狀態列表,然後發佈更新的用戶配置文件。我的問題是,當我得到該更新的用戶配置文件的響應時,它包含了早前已完成的GET請求的響應。 POST通過並且在Web服務中進行了更改,但我的響應對象中沒有任何跡象。

我已確認作出POST請求時,服務器不會返回狀態的列表,它會從瀏覽器中手動調用時返回如下:

{ 
    "success": "Changes saved!" 
} 

我在一個虧損爲什麼我收到來自我的POST早期請求的響應。有什麼想法嗎?

回答

2

我想通了。原來,我不得不添加「X-要求,用」:「XMLHttpRequest的」,以請求頭:

configuration.HTTPAdditionalHeaders = [ 
      "X-Requested-With": "XMLHttpRequest" 
     ] 

現在我正確地從服務器獲取響應。