Alamofire 响应与请求不匹配

Posted

技术标签:

【中文标题】Alamofire 响应与请求不匹配【英文标题】:Alamofire response not matching request 【发布时间】:2016-01-21 05:12:00 【问题描述】:

我在通过 Alamofire 向我的 API 发出 POST 请求时遇到问题,GET 可以正常工作,但是每当我在检查响应时发出 POST 时,我都会得到最后一个 GET 的结果。

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 的较早请求中得到响应。有什么想法吗?

【问题讨论】:

【参考方案1】:

我想通了。原来我必须在请求头中添加“X-Requested-With”:“XMLHttpRequest”:

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

现在我可以从服务器正确地得到响应了。

【讨论】:

以上是关于Alamofire 响应与请求不匹配的主要内容,如果未能解决你的问题,请参考以下文章

请求 Alamofire

Alamofire RequestAdapter - 修改 URL

AlamoFire 图像内存问题

发送 Alamofire JSON 数组 Swift

如何在 Swift 3 中使用 Alamofire 在 POST 请求中将给定的 JSON 作为参数发送?

记录alamofire上传图片请求和响应