Swift 在Alamofire参数编码中发布请求,返回GET响应
我正在尝试使用Alamofire(3.0)在swift中创建一个路由生成器,我的所有GET请求都已成功,但当我尝试发出POST请求时,例如,我仍然会得到与GET方法相同的响应 我的API路线是:Swift 在Alamofire参数编码中发布请求,返回GET响应,swift,alamofire,Swift,Alamofire,我正在尝试使用Alamofire(3.0)在swift中创建一个路由生成器,我的所有GET请求都已成功,但当我尝试发出POST请求时,例如,我仍然会得到与GET方法相同的响应 我的API路线是: /users //GET -> return list of users /users //POST -> create new user with the parameters sent 当我使用邮递员时,一切都很好 这是我的路由器代码: import Foundation import
/users //GET -> return list of users
/users //POST -> create new user with the parameters sent
当我使用邮递员时,一切都很好
这是我的路由器代码:
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")
}
}
}
这将生成一个JSON POST请求。您确定您的web服务需要JSON请求吗?确保不要将web服务返回JSON响应与请求格式混为一谈 如果您的web服务需要标准POST请求(即
内容类型为application/x-www-form-urlencoded
)的请求),您也可以对.CreateUser
使用URL
:
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
}
}
如果您对请求是否正确创建有任何疑问,我发现类似的工具可以用于确认发送到web服务的准确请求。结果表明,问题是由Alamofire.request()
生成的命令组合(curl-I-X POST…)以及我的Apache如何处理URL的尾部斜杠。所以当我试图发布时“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)/"
}
}
你好,罗伯。它不起作用。我下载了Charles并检查了请求。当使用我的应用程序时,我使用GET作为方法,而使用Postman时,我使用POST作为方法。我使用Laravel5.2创建了我的web服务,我不知道这是否是一个相关的信息。然后,我建议除了您在代码示例中包含的内容之外,还有其他一些内容。当我执行Alamofire.request(UserRouter.CreateUser([“name”:“test”])时代码>,我得到了正确的POST
请求。这就是为什么我突然想到,您的服务可能真的期待application/x-www-form-urlencoded
请求。顺便说一句,在你的邮递员中,你发送了JSON请求并得到了JSON响应,还是请求application/x-www-form-urlencoded
?如果您的请求确实是JSON,那么我将删除此答案。我拍摄了这些请求的屏幕截图,第一个来自邮递员:。我真的不知道发生了什么事。(我认为你不应该删除你的答案,查尔斯是一个很好的提示)我的问题是请求的内容类型。Charles“Overview”选项卡向我们显示响应的内容类型。单击“请求”选项卡,查看原始内容或标题,确认邮递员的POST
请求的内容类型。与您的Alamofire请求进行比较和对比。在《邮递员》中,我尝试使用表单数据
和x-www-form-urlencoded
,两者都得到了预期的结果。我认为问题不在于内容类型,因为我的应用程序请求是以GET的形式到达我的web服务的。您知道如何调试来自Alamofire的请求,以便检查它是否作为POST方法离开吗?