Alamofire参数编码中的POST请求返回GET响应 [英] POST requests in Alamofire Parameter Encoding returning GET responses
问题描述
我正在尝试使用Alamofire(3.0)快速制作一个Route Builder,并且已经成功完成了所有GET请求,但是例如,当我尝试发出POST请求时,我仍然得到与GET方法。
I'm trying to make a Route Builder in swift using Alamofire (3.0) and I have succeded for all my GET requests, but when I try to make a POST request, for example, I still get the same responses of the GET method.
我的API路由为:
/users //GET -> return list of users
/users //POST -> create new user with the parameters sent
当我使用Postman时,一切正常。
When I use Postman everything works fine.
这是我的路由器代码:
import Foundation
import Alamofire
enum UserRouter: URLRequestConvertible{
static let baseURL = NSURL(string: "http://192.168.0.106/users")!
case Users
case CreateUser([String: AnyObject])
case ReadUser(Int)
case UpdateUser(Int, [String: AnyObject])
case DestroyUser(Int)
var URL: NSURL { return UserRouter.baseURL.URLByAppendingPathComponent(route.path) }
var route: (path: String, parameters: [String: AnyObject]?) {
switch self{
case .Users:
return ("/", nil)
case .ReadUser(let userID):
return ("/\(userID)", nil)
case .CreateUser(let userInfo):
return ("/", userInfo)
case .UpdateUser(let userID, let userInfo):
return ("/\(userID)", userInfo)
case .DestroyUser(let userID):
return ("/\(userID)", nil)
}
}
var method: Alamofire.Method{
switch self{
case .Users:
return .GET
case .ReadUser:
return .GET
case .CreateUser:
return .POST
case .UpdateUser:
return .PUT
case .DestroyUser:
return .DELETE
}
}
var URLRequest: NSMutableURLRequest {
let httpRequest = NSMutableURLRequest(URL: URL)
httpRequest.HTTPMethod = method.rawValue
switch self{
case .CreateUser (let userInfo):
print("creating")
print(httpRequest.HTTPMethod) //Print: POST on CreateUser, like it should.
return Alamofire.ParameterEncoding.JSON.encode(httpRequest, parameters: userInfo).0
default:
return Alamofire.ParameterEncoding.URL.encode(httpRequest, parameters: (route.parameters ?? [ : ])).0
}
}
}
func testRoute(){
Alamofire.request(UserRouter.CreateUser(["name":"test"])).responseJSON{ (response) in
switch response.result{
case .Success(let data):
print (data) //Error here, printing GET response instead of my API response for creating users (POST).
case .Failure:
print("fail")
}
}
}
推荐答案
原来,问题是 Alamofire命令的组合。 request()
生成(curl -i -X POST ...)以及我的Apache如何处理URL的斜杠。因此,当我尝试 GET http:/ /192.168.0.106/users
。
Turned out that the problem was a combination of the command that Alamofire.request()
generates (curl -i -X POST...) and how my Apache was handling trailing slashes of the URL. So when I tried to POST "http://192.168.0.106/users"
I was being redirect (301) to a GET "http://192.168.0.106/users"
.
所以我必须在.htaccess文件中加入以下命令:
So I had to include this line of command in my .htaccess:
# Redirect Trailing Slashes...
RewriteCond %{REQUEST_URI} !(.*)/$
RewriteRule ^(.*)/$ /$1 [L,R=301]
并更改我的路由器代码,始终附加一个末尾的斜杠:
and change my Router's code, always appending a trailing slash at the end:
var route: String {
switch self{
case .Users:
return ""
case .ReadUser(let userID):
return "/\(userID)/"
case .CreateUser:
return "/"
case .UpdateUser(let userID):
return "/\(userID)/"
case .DestroyUser(let userID):
return "/\(userID)/"
}
}
这篇关于Alamofire参数编码中的POST请求返回GET响应的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!