Alamofire Swift 3.0 调用中的额外参数
Posted
技术标签:
【中文标题】Alamofire Swift 3.0 调用中的额外参数【英文标题】:Alamofire Swift 3.0 Extra argument in call 【发布时间】:2016-09-14 12:46:52 【问题描述】:我已将我的项目迁移到 Swift 3(并在 Podfile 中使用 pod 'Alamofire', '~> 4.0'
将 Alamofire 更新到最新的 Swift 3 版本)。
我现在在每个 Alamofire.request 上都会收到“调用中的额外参数”错误。例如:
let patientIdUrl = baseUrl + nextPatientIdUrl
Alamofire.request(.POST, patientIdUrl, parameters: nil, headers: nil, encoding: .JSON)
谁能告诉我为什么?
【问题讨论】:
错误信息说,你向请求方法传递了太多参数。帮助自己的最简单方法是在文档中查找实际签名。 当然我已经检查了签名 - 这是正确的。那就是问题所在。似乎是 Xcode 8 报告了一个无效错误。 然后重新键入方法以获取带有代码完成的实际语法。我怀疑第二个参数需要一个标签。 无论有无标签,它都会给出完全相同的错误。 Xcode 是否在该行显示一个小三角形 (^) 来告诉您哪个参数导致了错误? 【参考方案1】:根据Alamofire 使用 HTTP 方法的版本 4.0.0 URL 请求的文档如下:
Alamofire.request("https://httpbin.org/get") // method defaults to `.get`
Alamofire.request("https://httpbin.org/post", method: .post)
Alamofire.request("https://httpbin.org/put", method: .put)
Alamofire.request("https://httpbin.org/delete", method: .delete)
所以你的 url 请求将是:
Alamofire.request(patientIdUrl, method: .post, parameters: nil, encoding: JSONEncoding.default, headers: nil)
一个示例请求将是:
Alamofire.request(url, method: .post, parameters: param, encoding: JSONEncoding.default, headers: [AUTH_TOKEN_KEY : AUTH_TOKEN])
.responseJSON response in
print(response.request as Any) // original URL request
print(response.response as Any) // URL response
print(response.result.value as Any) // result of response serialization
希望这会有所帮助!
【讨论】:
有效吗?在使用这个Alamofire.request(url, method: .post, parameters: nil, headers: nil, encoding: JSONEncoding.default)
时,我仍然在调用中遇到额外参数的错误
你的意思是Alamofire.request(url!, method: .post, parameters: parameters, encoding: nil, headers: nil)
还是这个Alamofire.request(url!, method: .post, parameters: parameters, headers: nil)
还有错误。甚至这一行也显示相同的错误Alamofire.request(url!, method: .post, parameters: nil, headers: nil, encoding: JSONEncoding.default)
您使用的是 Alamofire 4.0.0 版吗?您可以从 url 中删除可选符号 (!) 吗?
@Abdullah Md.Zubair,@Rajan Maheshwari 我用你上面的答案试过了,我的代码是 func POST(url _url: String, params: [String : AnyObject]) -> Future这个对我有用。 无需移除encoding参数
Swift 5.x 更新
Alamofire 使用 Swift 5 中引入的 Result
类型。此外,Alamofire.request
已更改为 AF.request
,现在将使用 .success
读取其开关 response.result
值和.failure
AF.request("https://yourServiceURL.com", method: .get, parameters: [:], encoding: URLEncoding.default, headers: ["":""]).responseJSON (response) in
switch response.result
case let .success(value):
print(value)
case let .failure(error):
print(error)
Swift 3.x / 4.x
Alamofire.request("https://yourServiceURL.com", method: .post, parameters: parameters, encoding: JSONEncoding.default, headers: nil).responseJSON (response:DataResponse<Any>) in
switch(response.result)
case .success(_):
if let data = response.result.value
print(response.result.value)
break
case .failure(_):
print(response.result.error)
break
并确保 参数 是
类型[String:Any]?
如果获取
Alamofire.request("https://yourGetURL.com", method: .get, parameters: ["":""], encoding: URLEncoding.default, headers: nil).responseJSON (response:DataResponse<Any>) in
switch(response.result)
case .success(_):
if let data = response.result.value
print(response.result.value)
break
case .failure(_):
print(response.result.error)
break
甚至可以与
一起使用JSONEncoding.default
对于标题
如果您要传递标头,请确保其类型应为 [String:String]
通过Parameter Encoding Link
https://github.com/Alamofire/Alamofire/blob/master/Documentation/Alamofire%204.0%20Migration%20Guide.md#parameter-encoding-protocol
【讨论】:
@jimijon 和帖子一样。检查我更新的答案并尝试任何获取 URL。将参数留空为["":""]
好的,只是错误中的“红鲱鱼”。如果任何其他参数,headers et 是错误的,那么它会给出这个奇怪的错误。
@Error404 编码取决于服务器端的 API 类型。如果它接受的 post 参数不是原始形式,那么您必须使用 URLEncoding.default
。如果它接受原始形式的 post 参数,那么你必须选择 JSONEncoding.default
在 GET
你不需要它们中的任何一个。如果它接受参数作为表单数据多部分表单,那么您必须使用 alamofire 的multipart
功能
@RajanMaheshwari 抱歉,我的意思是参数的顺序(用于 Alamofire.request 调用)。一定和你做的一模一样。
你是对的,标题应该是 [String:String]。谢谢你的帮助。【参考方案3】:
使用 Swift 3.0 和 xCode 8.0 发布方法 Alamofire 4.0
Alamofire.request(URL, method: .post, parameters: PARAMS)
.responseJSON closureResponse in
if String(describing: closureResponse.result) == "SUCCESS"
// Sucess code
else
// Failure Code
【讨论】:
【参考方案4】:我的解决方案是,如果您使用标头,其类型必须是 [String:String]。
【讨论】:
【参考方案5】:此错误取决于参数值。它必须是 [String: String]
let url = URL(string: "http://yourURLhere")!
let params: [String: String] = ["name": "oskarko", "email": "youremail@here.com", "sex": "male"]
Alamofire.request(url, method: .post, parameters: params, encoding: URLEncoding.default, headers: nil).validate(statusCode: 200..<600).responseJSON() response in
switch response.result
case .success:
var result = [String:String]()
if let value = response.result.value
let json = JSON(value)
case .failure(let error):
print("RESPONSE ERROR: \(error)")
【讨论】:
【参考方案6】:我刚刚解决了和你一样的问题。问题是我在标题中导入了 Alamofire,所以我只是在调用请求时删除了 Alamofire。像这样:
request(.POST, patientIdUrl, 参数: nil, headers: nil, 编码: .JSON)
希望对你有帮助。
【讨论】:
【参考方案7】:当我的URL 变量超出范围 时,我遇到了同样的Extra argument 'method' in call 错误。
在您的情况下,请确保 baseUrl
和 nextPatientIdUrl
在使用 Alamofire.request(patientIdUrl,..)
方法时都在范围内。
希望这可以解决您的问题。谢谢你!
【讨论】:
【参考方案8】:func API()
if Reachability.isConnectedToNetwork()
let headers = ["Vauthtoken":"Bearer \(apiToken)"]
print(headers)
// let parameter = ["iLimit":"10","iOffset":"0","iThreadId":"1"]
ApiUtillity.sharedInstance.showSVProgressHUD(text: "Loding...")
Alamofire.request(ApiUtillity.sharedInstance.API(Join: "vehicle/CurrentVehicleLists"), method:.get, parameters:nil, headers: headers).responseJSON response in
switch response.result
case .success:
print(response)
ApiUtillity.sharedInstance.dismissSVProgressHUD()
let dictVal = response.result.value
let dictMain:NSDictionary = dictVal as! NSDictionary
let statusCode = dictMain.value(forKey: "status") as! Int
if(statusCode == 200)
else if statusCode == 401
else
case .failure(let error):
print(error)
ApiUtillity.sharedInstance.dismissSVProgressHUD()
else
ApiUtillity.sharedInstance.dismissSVProgressHUD()
ApiUtillity.sharedInstance.showErrorMessage(Title: "Internet Connection", SubTitle: "Internet connection Faild", ForNavigation: self.navigationController!)
【讨论】:
【参考方案9】:对我来说这是有效的。
对于 GET 请求
Alamofire.request("http://jsonplaceholder.typicode.com/todos/1/get").responseJSON (response:DataResponse<Any>) in
switch(response.result)
case .success(_):
if response.result.value != nil
print(response.result.value!)
break
case .failure(_):
print(response.result.error)
break
发帖
let parameters = NSDictionary(object: "nara", forKey: "simha" as NSCopying)
Alamofire.request("http://jsonplaceholder.typicode.com/posts", method: HTTPMethod.post, parameters: parameters as? Parameters, encoding: JSONEncoding.default, headers: nil).responseJSON (response:DataResponse<Any>) in
switch(response.result)
case .success(_):
if response.result.value != nil
print(response.result.value!)
break
case .failure(_):
print(response.result.error)
break
感谢@Rajan Maheswari。
【讨论】:
【参考方案10】:我解决了这个问题:
-
重新排序参数(网址然后方法类型)。
例如将 Encoding Enum 更改为“JSONEncoding.default”。
注意:Swift 3 中的 Alamofire 方法签名更改
【讨论】:
【参考方案11】:我发现有两件事值得注意。
-
删除其值之前的第一个 url 标签。采用
Alamofire.request("https://yourServiceURL.com", method: .post,
而不是Alamofire.request(url: "https://yourServiceURL.com",
method: .post,
。
确保参数的数据类型为[String:
String]
。明确声明。
【讨论】:
【参考方案12】:我从 Alamofire 复制此代码,创建一个 URLRequest 并使用 Alamofire.request(URLRequest) 方法,避免此错误
originalRequest = try URLRequest(url: url, method: method, headers: headers)
let encodedURLRequest = try encoding.encode(originalRequest!, with: parameters)
【讨论】:
【参考方案13】:我通过这种方式解决了这个问题:
去掉多余的参数就行了,只去掉parameters
、encoding
和headers
,如果这些参数都是nil你可以去掉然后这样离开,
Alamofire.request(yourURLString, method: .post)
【讨论】:
【参考方案14】:如果你已经在本地添加了 Alamofire 文件,那么在请求之前不要使用“Alamofire”
let apipath = “your api URL”
request(apipath, method: .post, parameters: parameters, encoding: URLEncoding.default, headers: nil).responseJSON response in switch(response.result)
case .success(_):
do
let JSON = try JSONSerialization.jsonObject(with: response.data! as Data, options:JSONSerialization.ReadingOptions(rawValue: 0))
guard let JSONDictionary: NSDictionary = JSON as? NSDictionary else
print("Not a Dictionary")
return
print("Post Response : \(JSONDictionary)")
catch let JSONError as NSError
print("\(JSONError)")
break
case .failure(_):
print("failure Http: \(String(describing: response.result.error?.localizedDescription))")
break
【讨论】:
以上是关于Alamofire Swift 3.0 调用中的额外参数的主要内容,如果未能解决你的问题,请参考以下文章
如何使用参数 swift 3.0 Alamofire 4.0 调用邮政服务?
在 Swift 3.0 (Alamofire 4.4.0) 中的一些请求后,Alamofire 停止工作
使用 Alamofire 的 swift 3.0 中的 URL 问题
Swift 2.0 + Alamofire 3.0 - 缓慢加载 JSON