Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 在Alamofire参数编码中发布请求,返回GET响应_Swift_Alamofire - Fatal编程技术网

Swift 在Alamofire参数编码中发布请求,返回GET响应

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

我正在尝试使用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 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方法离开吗?