Alamofire参数编码中的POST请求返回GET响应 [英] POST requests in Alamofire Parameter Encoding returning GET responses

查看:227
本文介绍了Alamofire参数编码中的POST请求返回GET响应的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试使用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的斜杠。因此,当我尝试 POST http://192.168.0.106/users 时,我被重定向(301)到 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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆