带有 Swift 3 的 Alamofire 4.3,POST 请求不适用于 URL 参数

Posted

技术标签:

【中文标题】带有 Swift 3 的 Alamofire 4.3,POST 请求不适用于 URL 参数【英文标题】:Alamofire 4.3 with Swift 3 , POST request does not working with URL Parameters 【发布时间】:2017-01-23 09:04:50 【问题描述】:

我正在尝试如下发送一个发布请求,我的路由器如下

enum ProfieRouter: URLRequestConvertible 

case loginUser(parameters: Parameters)
case resetPassword(parametrs: Parameters)

var method: HTTPMethod 

    switch self 

    case .loginUser:
        return .post

    case .resetPassword:
        return .post
    


var path: String 

    switch self 
    case .loginUser:
        return "app/api.php?request=login"

    case .resetPassword:
        return "app/api.php?request=forgettenPassword"
    


func asURLRequest() throws -> URLRequest 
    let BASEURL = "https://www.example.com/"
    let url = try BASEURL.asURL()
    var urlRequest = URLRequest(url: url.appendingPathComponent(path))
    urlRequest.httpMethod = method.rawValue


    switch self 

    case .loginUser(let parameters):
        urlRequest = try URLEncoding.default.encode(urlRequest, with: parameters)

    case .resetPassword(let parameters):
        urlRequest = try URLEncoding.default.encode(urlRequest, with: parameters)
    
    return urlRequest

这就是我从 ViewController 中调用它的方式,

@IBAction func signInButtonClicked(_ sender: Any) 

    let parameters: Parameters = [
        "email": "xxxxxx",
        "password": "xxxxxx"
    ]

    Alamofire.request(ProfieRouter.loginUser(parameters: parameters)).responseJSON response in


        switch response.result 
        case .success:
            print(response)

            break
        case .failure(let error):

            print(error)
        

    


但我得到以下错误,

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

请注意,当我使用 POSTMAN 和 Advanced REst Client 检查时,我的 API 响应是有效的。我已经尝试了几个关于以下错误的问题,但在我的情况下它们都不起作用。

请有人指出我在这里犯的错误。 谢谢。

【问题讨论】:

当你使用 POSTMAN 时,你是否使用任何 Http Request Header 值? 是的,我将 Content-Type 设置为 application/x-www-form-urlencoded,结果还是一样 您正在尝试使用 .request(url : sample)。而不是使用 Alamofire.request() 其中包含 **_ url:, method: , parameters encoding:, headers:) ** parameters. 我正在尝试使用 Alamofire.request(urlRequest: URLRequestConvertible)。我试过你提到的选项。有效。但我需要在这里应用路由器的概念 a) 你能把你用邮递员发的http正文贴出来吗 【参考方案1】:

试试这个..

像这样修改你的网络服务调用代码:

// Add default headers if needed.(As per your web-service requirement)
let headers: HTTPHeaders = [
    "Accept": "text/html",
    "Content-Type" : "application/x-www-form-urlencoded"
]

 Alamofire.request("Your URL", method: .post, parameters: parameters, encoding: URLEncoding.httpBody, headers: headers).validate().responseJSON  (response) in

  debugPrint(response)

希望对你有帮助。

【讨论】:

感谢您的时间和精力,但正如我所提到的,我想在这里通过 URLRequestConvertible 应用路由器概念

以上是关于带有 Swift 3 的 Alamofire 4.3,POST 请求不适用于 URL 参数的主要内容,如果未能解决你的问题,请参考以下文章

带有 XML 响应和正文的 SOAP 请求 swift 3,Alamofire

Swift 3 的 ObjectMapper 和 Alamofire 问题 Alamofire 4 的 Alamofire 版本

在 Swift 3.0 (Alamofire 4.4.0) 中的一些请求后,Alamofire 停止工作

使用 Alamofire 4 (Swift 3) 下载文件的路径

使用 Swift 3 和 Alamofire 4 后没有得到响应

Alamofire swift 库版本 4.4 未安装在 swift 3.0.2 项目中