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

时间:2016-01-05 20:19:19

标签: swift alamofire

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

    }

}

2 个答案:

答案 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服务的确切请求。