使用Alamofire处理未知内容类型的响应

时间:2015-03-02 18:29:46

标签: ios json swift content-type alamofire

我使用Alamofire向休息服务请求。如果请求成功,则服务器返回内容类型为JSON的{​​{1}}。但是如果请求失败,服务器将返回一个简单的application/json

所以,我不知道如何使用String处理它,因为我不知道响应的样子。我需要一个解决方案来处理不同的响应类型。

我可以使用此代码处理成功的请求:

Alamofire

这个代码我可以用来处理失败的请求:

request(.POST, wholeUrl, parameters: parameters, encoding: .Custom(encodingClosure))
            //.validate()
        .responseJSON {
            (request, response, data, error) -> Void in

                //check if error is returned
                if (error == nil) {
                    //this crashes if simple string is returned
                    JSONresponse = JSON(object: data!)
                }

3 个答案:

答案 0 :(得分:2)

不要指定响应类型,也不要注释.validate()。 检查错误,然后相应地进行

request(.POST, wholeUrl, parameters: parameters, encoding: .Custom(encodingClosure))
        .validate()
    .response {
        (request, response, data, error) -> Void in

            //check if error is returned
            if (error == nil) {
                //this is the success case, so you know its JSON
                //response = JSON(object: data!)
            }
            else {
                 //this is the failure case, so its a String
            }
     }

答案 1 :(得分:1)

我已经解决了我的问题:

request(.POST, wholeUrl, parameters: parameters, encoding: .Custom(encodingClosure))
    .validate()
.response {
    (request, response, data, error) -> Void in

        //check if error is returned
        if (error == nil) {
            var serializationError: NSError?
            let json: AnyObject? = NSJSONSerialization.JSONObjectWithData(data! as! NSData, options: NSJSONReadingOptions.AllowFragments, error: &serializationError)

            JSONresponse = JSON(object: json!)
        }
        else {
             //this is the failure case, so its a String
        }
 }

答案 2 :(得分:0)

快捷键4

如果期望在成功上使用JSON,并且在 error 上使用String,则应调用.validate()钩子并尝试如果请求失败,则将响应数据解析为字符串。

import Alamofire
import SwiftyJSON

...

Alamofire.request("http://domain/endpoint", method: .get, parameters: nil, encoding: JSONEncoding.default, headers: nil)
    .validate()
    .responseJSON(completionHandler: { response in
        if let error = response.error {
            if let data = response.data, let errMsg = String(bytes: data, encoding: .utf8) {
                print("Error string from server: \(errMsg)")
            } else {
                print("Error message from Alamofire: \(error.localizedDescription)")
            }
        } 
        guard let data = response.result.value else {
            print("Unable to parse response data")
            return
        }
        print("JSON from server: \(JSON(data))")
    })