gpt4 book ai didi

swift - Alamofire 参数编码中的 POST 请求返回 GET 响应

转载 作者:行者123 更新时间:2023-11-28 06:51:56 25 4
gpt4 key购买 nike

我正在尝试使用 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")
}

}

}

最佳答案

原来问题是 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)/"
}

}

关于swift - Alamofire 参数编码中的 POST 请求返回 GET 响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34620515/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com