可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
I have migrated my project to Swift 3 (and updated Alamofire to latest Swift 3 version with pod 'Alamofire', '~> 4.0'
in the Podfile).
I now get an "Extra argument in call" error on every Alamofire.request. Eg:
let patientIdUrl = baseUrl + nextPatientIdUrl Alamofire.request(.POST, patientIdUrl, parameters: nil, headers: nil, encoding: .JSON)
Can anybody tell me why ?
回答1:
According to Alamofire documentation for version 4.0.0 URL request with HTTP method would be followings:
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)
So your url request will be:
Alamofire.request(patientIdUrl, method: .post, parameters: nil, encoding: JSONEncoding.default, headers: nil)
and a sample request will be:
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 }
Hope this helps!
回答2:
This one worked for me.
No need to remove encoding parameter
Swift 3.x / 4.x
Alamofire.request("https://yourServiceURL.com", method: .post, parameters: parameters, encoding: JSONEncoding.default, headers: nil).responseJSON { (response:DataResponse) in switch(response.result) { case .success(_): if let data = response.result.value{ print(response.result.value) } break case .failure(_): print(response.result.error) break } }
and make sure that the parameters are of type
[String:Any]?
In case of Get
Alamofire.request("https://yourGetURL.com", method: .get, parameters: ["":""], encoding: URLEncoding.default, headers: nil).responseJSON { (response:DataResponse) in switch(response.result) { case .success(_): if let data = response.result.value{ print(response.result.value) } break case .failure(_): print(response.result.error) break } }
Even works with
JSONEncoding.default
For Headers
If you are passing headers, make sure their type should be [String:String]
Go through the Parameter Encoding Link
https://github.com/Alamofire/Alamofire/blob/master/Documentation/Alamofire%204.0%20Migration%20Guide.md#parameter-encoding-protocol
回答3:
Post method Alamofire 4.0 with Swift 3.0 and xCode 8.0
Alamofire.request(URL, method: .post, parameters: PARAMS) .responseJSON { closureResponse in if String(describing: closureResponse.result) == "SUCCESS" { // Sucess code } else { // Failure Code } }
回答4:
My solution is if you are using headers, its type must be [String:String].
回答5:
I just resolved the same problem as you have. The problem is I have imported Alamofire in the header, so I just remove the Alamofire when call request. Like that:
request(.POST, patientIdUrl, parameters: nil, headers: nil, encoding: .JSON)
I hope it can help you.
回答6:
This error is up to parameters value. It has to be [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..
回答7:
I ran into this same Extra argument 'method' in call error when my URL variable was out of scope.
In your case, please make sure both baseUrl
and nextPatientIdUrl
are in scope when they are being used Alamofire.request(patientIdUrl,..)
method.
Hopefully this resolves your issue. Thanks You!
回答8:
For me this is working.
For GET Request
Alamofire.request("http://jsonplaceholder.typicode.com/todos/1/get").responseJSON { (response:DataResponse) in switch(response.result) { case .success(_): if response.result.value != nil{ print(response.result.value!) } break case .failure(_): print(response.result.error) break } }
For POST
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) in switch(response.result) { case .success(_): if response.result.value != nil{ print(response.result.value!) } break case .failure(_): print(response.result.error) break } }
Thanks @Rajan Maheswari.
回答9:
I fixed this issue with:
- Reorder parameters (url then method type).
- Change Encoding Enum to be "JSONEncoding.default" for example.
Note that: Alamofire methods signature change in Swift 3
回答10:
Two things that I found worth noting.
- Remove the first url label before its value. Use
Alamofire.request("https://yourServiceURL.com", method: .post,
instead of Alamofire.request(url: "https://yourServiceURL.com", method: .post,
. - Make sure the data type of the parameters is
[String: String]
. Declare it explicitly.
回答11:
I copy this code from Alamofire,create a URLRequest and used Alamofire.request(URLRequest) method, avoid this error
originalRequest = try URLRequest(url: url, method: method, headers: headers) let encodedURLRequest = try encoding.encode(originalRequest!, with: parameters)
回答12:
I fixed this issue this way:
Just remove extra parameters, just parameters
, encoding
and headers
, if these parameters are nil you can remove then and leave this way,
Alamofire.request(yourURLString, method: .post)