Alamofire 4错误请求'呼叫中的额外参数'

时间:2017-01-03 16:20:44

标签: swift alamofire

我已经更新到Xcode8,swift3和Alamofire 4,现在我在'alamofire.request'开头的下面一行中收到错误'额外参数'方法'

var pulseVoteEndpoint: String = "https://example.com/app1/votingapi/set_votes.json"

var pulseNewVote = ["votes":[["value":valueString,"uid":uidString,"entity_id":nidInt,"entity_type":"node","tag":"points","value_type":"points"]]]

Alamofire.request(pulseVoteEndpoint, method: .post, parameters: pulseNewVote, encoding: .json)
         .response { request, response, data, error in
             debugPrint(response)
             print(request)
             print (response)
             print (error)
         }

有什么想法吗?

谢谢

4 个答案:

答案 0 :(得分:2)

encoding的{​​{1}}参数需要request(...)属性,而不是static个案例。

我们可以看一下enumAlamofire/Source/Alamofire.swift

的静态request(...)方法的签名
Alamofire

第一个参数是符合协议public func request( _ url: URLConvertible, method: HTTPMethod = .get, parameters: Parameters? = nil, encoding: ParameterEncoding = URLEncoding.default, headers: HTTPHeaders? = nil) -> DataRequest { /* ... */ } 的参数,String is valid;到目前为止一切都很好。

第二个参数的类型是simply an enum URLConvertible是有效的案例,OK。

第三个参数应为.post类型,即a typealias for [String: Any]

Parameters

您提供的参数/// A dictionary of parameters to apply to a `URLRequest`. public typealias Parameters = [String: Any] 的类型为pulseNewVote,但仍应能够被预期的参数类型(Dictionary<String, Array<Dictionary<String, Any>>>)使用。所以这应该仍然没问题,即使你可能想通过明确地将Dictionary<String, Any>的类型注释为pulseNewVote来考虑帮助Swift:

[String: Any]

第四个参数,然而,编码不是var pulseNewVote: [String: Any] = ... ,而是一些enum类型符合的protocol ParameterEncoding。这些类型具有静态成员(返回struct的实例),在显式类型时可能看起来像self个案例,但必须包含显式类型

enum

因此,您需要将提供给第四个参数public struct JSONEncoding: ParameterEncoding { // MARK: Properties /// Returns a `JSONEncoding` instance with default writing options. public static var `default`: JSONEncoding { return JSONEncoding() } // ... } 的值替换为例如.jsonJSONEncoding.default。使用此修复程序,您对request的调用应如下所示:

Alamofire.request(pulseVoteEndpoint, method: .post, parameters: pulseNewVote, encoding: JSONEncoding.default)

您给出的错误(附加参数)来自reponse调用的完成处理程序。提供给response的调用的完成处理程序是一个以DefaultDataResponse为参数的函数(不是你尝试的4个不同的参数)。 DefaultDataResponse类型的实例包含公开成员requestresponsedataerror,您可以通过单个response参数访问(完成处理程序中的类型DefaultDataResponse)。在response调用此事实后调整完成处理程序(使用example from the Alamofire documentation,我们可以构建最终的requestresponse链式调用:

Alamofire.request(pulseVoteEndpoint, method: .post, parameters: pulseNewVote, encoding: JSONEncoding.default)
    .response { response in
    // note that these are all optionals, so
    // you might want to unwrap them first
    print(response.request)
    print(response.response)
    print(response.error)
}

答案 1 :(得分:1)

而不是.json进行编码,请尝试JSONEncoding.default

您的参数应该投放到:[String : Any]?

这是编译器的问题,错误地报告了额外参数的错误。

最后,您的行应如下所示:

Alamofire.request(pulseVoteEndpoint, method: .post, parameters: pulseNewVote as [String : Any]?, encoding: JSONEncoding.default)
         .response { request, response, data, error in
// rest of the code

答案 2 :(得分:0)

我有一个Xcode错误,导致此错误发生,因为不需要的时候,部分url字符串被强行打开。

以下是具有错误包装属性的呼叫:

Alamofire.request(baseUrl + "notes/\(note.id!)", method: .get, parameters: nil, encoding: JSONEncoding.default, headers: headers).responseJSON { [weak self] response in

这是消除错误的固定呼叫:

Alamofire.request(baseUrl + "notes/\(note.id)", method: .get, parameters: nil, encoding: JSONEncoding.default, headers: headers).responseJSON { [weak self] response in

答案 3 :(得分:0)

  

在我的情况下,问题出在headers参数中。它应该是   [String:String]

加上parameters参数应该为[String:Any]

我使用 Alamofire 4.8.2 如下解决了该编译错误:

let parameters = ["key":"value","key2":1] as [String:Any]
let headers = ["header_1":"value"] as [String:String]
let encoding:URLEncoding = URLEncoding.default

Alamofire.request("base_url",
                   method: .post,
                   parameters: parameters,
                   encoding: encoding,
                   headers: headers)