我正在尝试使用Alamofire(3.0)快速制作一个Route Builder,我已经成功完成了所有的GET请求,但是当我尝试发出POST请求时,我仍然得到了相同的响应。 GET方法。
我的API路线是:
/users //GET -> return list of users
/users //POST -> create new user with the parameters sent
当我使用Postman时,一切正常。
这是我的路由器代码:
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")
}
}
}
答案 0 :(得分:1)
原来这个问题是Alamofire.request()
生成的命令(curl -i -X POST ...)和我的Apache如何处理URL的尾随斜杠的组合。因此,当我尝试POST "http://192.168.0.106/users"
时,我正在重定向(301)到GET "http://192.168.0.106/users"
。
所以我必须在我的.htaccess中包含这行命令:
# Redirect Trailing Slashes...
RewriteCond %{REQUEST_URI} !(.*)/$
RewriteRule ^(.*)/$ /$1 [L,R=301]
并更改我的路由器代码,总是在末尾附加一个尾部斜杠:
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)/"
}
}
答案 1 :(得分:0)
这将生成JSON POST请求。您确定您的Web服务需要JSON请求吗?确保不要混淆Web服务返回带有请求格式的JSON响应这一事实。
如果您的网络服务需要标准的POST请求(即Content-Type
application/x-www-form-urlencoded
的请求),那么URL
也会使用.CreateUser
:
var URLRequest: NSMutableURLRequest {
let httpRequest = NSMutableURLRequest(URL: URL)
httpRequest.HTTPMethod = method.rawValue
switch self {
case .CreateUser (let userInfo):
return Alamofire.ParameterEncoding.URL.encode(httpRequest, parameters: userInfo).0
default:
return Alamofire.ParameterEncoding.URL.encode(httpRequest, parameters: (route.parameters ?? [ : ])).0
}
}
如果您对是否正确创建请求有疑问,我发现像Charles这样的工具可用于确认发送到Web服务的确切请求。