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 RequestAdapter - 修改 URL