使用Alamofire时出现responseSerializationFailed问题

3
import UIKit
import Alamofire
import SwiftyJSON

class LoginViewController: UIViewController {


    @IBOutlet weak var urlTextFiled: UITextField!
    @IBOutlet weak var emailTextFiled: UITextField!
    @IBOutlet weak var passwordTextFiled: UITextField!

    override func viewDidLoad() {
        super.viewDidLoad()
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()

    }

        guard let email = emailTextFiled.text, !email.isEmpty else {
            return
        }
        guard let password = passwordTextFiled.text, !password.isEmpty else {
            return
        }
        let db = "mohanad"
        let url = "http://176.58.117.249/web/session/authenticate"

        let parameters: [String: Any] = [
        "db": db,
        "login": email,
        "password": password ,
        ]

        Alamofire.request(url, method: .post, parameters: parameters, encoding: URLEncoding.default, headers: nil)
        .validate(statusCode: 200..<600)
        .responseJSON { response in

            switch response.result
            {
            case .failure(let error):
                print(error)

            case .success(let value):

                print(value)
            }

        }


    }

}

输出以下错误信息:

responseSerializationFailed(Alamofire.AFError.ResponseSerializationFailureReason.jsonSerializationFailed(Error Domain=NSCocoaErrorDomain Code=3840 "Invalid value around character 0." UserInfo={NSDebugDescription=Invalid value around character 0.}))

注:此处为技术内容,如需更详细的解释或润色,请提供更多上下文信息。

{"jsonrpc":"2.0","method":"call","params":{"db":"mohanad","login":"mohanad@amana.ps","password":"mohanad123"}} - Mohanad Hilles
你的服务器发送给我这个响应 Bad Request。看一下我的答复。 - AshvinGudaliya
2个回答

8

.responseJSON 替换为 .responseString,所以:

改为:

Alamofire.request(url, method: .post, parameters: parameters, encoding: URLEncoding.default, headers: nil).responseJSON
{ response in
      //....                
}

做:

Alamofire.request(url, method: .post, parameters: parameters, encoding: URLEncoding.default, headers: nil).responseString
{ response in
     //....       
}

相同的 :( responseSerializationFailed(Alamofire.AFError.ResponseSerializationFailureReason.jsonSerializationFailed(Error Domain=NSCocoaErrorDomain Code=3840 "Invalid value around character 0." UserInfo={NSDebugDescription=Invalid value around character 0.})) - Mohanad Hilles
您的服务器返回了以下内容: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN"><title>400 Bad Request</title> <h1>Bad Request</h1> <p>会话已过期(无效的CSRF令牌)</p> - Ayman Ibrahim
是的,打印服务器错误: 错误域=NSURLErrorDomain Code=-1002 "不支持的URL" UserInfo={NSUnderlyingError=0x600000252180 {Error Domain=kCFErrorDomainCFNetwork Code=-1002 "(null)"}, NSErrorFailingURLStringKey=www.amana.club/web/session/authenticate, NSErrorFailingURLKey=www.amana.club/web/session/authenticate, NSLocalizedDescription=不支持的URL} - Mohanad Hilles
我在头部添加了这个:let header: [String:String] = ["Content-Type" : "application/json"] - Mohanad Hilles
对我来说有效的方法是将.responseJSON替换为.response。 - Ahmed Elashker
显示剩余2条评论

2
请尝试以下内容。
参数:
let parameters: [String: Any] = [
        "jsonrpc":"2.0",
        "method":"call",
        "params": [
            "db": db,
            "login": "mohanad@amana‌​.ps",
            "password": "moh‌​anad123",
            ]
        ]

请求时请使用encoding: JSONEncoding.default,因为您需要传递原始值。

Alamofire.request(url, method: .post, parameters: parameters, encoding: JSONEncoding.default, headers: nil)
        .validate(statusCode: 200..<600)
        .responseJSON { response in

            switch response.result
            {
            case .failure(let error):
                if let data = response.data {
                    print("Print Server Error: " + String(data: data, encoding: String.Encoding.utf8)!)
                }
                print(error)

            case .success(let value):

                print(value)
            }

    }

您的API以这种格式提供数据

"<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 3.2 Final//EN\">\n<title>400 Bad Request</title>\n<h1>Bad Request</h1>\n<p>Session expired (invalid CSRF token)</p>\n"

打印服务器错误:<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN"><title>400 Bad Request</title> <h1>Bad Request</h1> <p>无效的JSON数据:'db=mohanad&login=mohanad%40amana.ps&password=mohanad123'</p> responseSerializationFailed(Alamofire.AFError.ResponseSerializationFailureReason.jsonSerializationFailed(Error Domain=NSCocoaErrorDomain Code=3840 "Invalid value around character 0." UserInfo={NSDebugDescription=Invalid value around character 0.})) - Mohanad Hilles
试试我的更新答案。你可以使用这种类型的参数,然后使用更新的答案。 {"jsonrpc":"2.0","method":"call","params":{"db":"mohanad","login":"mohanad@amana.ps","password":"mohanad123"}} - AshvinGudaliya
我使用了你的代码,但是出现了以下错误:打印服务器错误:<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN"><title>400 Bad Request</title> <h1>Bad Request</h1> <p>Invalid JSON data: 'db=mohanad&login=mohanad%40amana.ps&password=mohanad123'</p> AshvinGudaliya responseSerializationFailed(Alamofire.AFError.ResponseSerializationFailureReason.jsonSerializationFailed(Error Domain=NSCocoaErrorDomain Code=3840 "Invalid value around character 0." UserInfo={NSDebugDescription=Invalid value around character 0.})) - Mohanad Hilles
这是服务器端错误。你可以在Postman中调用你的Web服务,如果Postman返回成功结果,然后再在项目中调用。 - AshvinGudaliya
1
添加JSONEncoding.default对我有用!谢谢! - TharakaNirmana

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接