swift - 如何使用 Alamofire 在 Swift 中编写 curl 命令?

标签 swift curl networking alamofire

我有以下 curl 命令,它在命令行上运行良好,但我无法在 Swift 中编写它。

 curl -u web:web -k -i -d '{ "email":"fb@test.com","fbId":"FBXXXFB","accessToken":"accessNow","familyName":"FamName","givenName":"given"}' -H "Content-Type: application/json;charset=UTF-8" -X POST 'https://xweb.test.herokuapp.com/olweb/auth/login/fb'

当我尝试在 Alamofire 中翻译它时,我总是从服务器收到错误。所以我假设身份验证工作正常但参数不正确,因为我需要向服务器发送 5 个参数。 我该怎么做呢?

这是代码片段:

func loginWithFacebook(loginEmail: String, facebookId: String,  accessToken: String,familyName: String, givenName: String, completionHandler: (AnyObject?, NSError?) -> ()) {

    //Basic HTTP auth
    let user = "web"
    let password = "web"

    //   let headers = ["Authorization": "Basic \(base64Credentials)"] not working
    //   let headers =  ["web": "web"] not working

    //example for a nested array query
    let parameters = [
            "loginEmail": loginEmail,
            "facebookId": facebookId,
            "accessToken": accessToken,
            "familyName": familyName,
            "givenName": givenName
    ]

    Alamofire.request(
        .POST,
        loginWithFacebook,
        parameters: parameters
        )
        .responseJSON { response in
            switch response.result {
            case .Success(let value):
                completionHandler(value, nil)
            case .Failure(let error):
                completionHandler(nil, error)
            }
        }
        .authenticate(user: user, password: password)
}

我按以下方式调用此方法:

self.restApi.loginWithFacebook(email, facebookId: facebookId, accessToken: accessToken, familyName: familyName, givenName: firstName) {responseObject, error in

        print("responseobject printed loginUserWithFacebook() ")
        print(responseObject)
        print("error printed")
        print(error)

        //get the JSON object
        let response = responseObject as? [String:AnyObject]
        print("response")
        print(response)

        //parse down the first layer of JSON object which is an NSDictionary (sometimes it is [AnyObject] )
        if let result = response!["result"]  as?  [String: AnyObject]
        {
            print("self.result.count after calling loginUserWithFacebook()")
            print(result.count)
            print(result)

          //  self.getProfileFromUser()
        }
    }

服务器的错误响应:

responseobject printed loginUserWithFacebook() 
Optional({
info = "Required fields missing.";
result =     {
};
})

最佳答案

在您的 cURL 请求中,正文是 JSON。但是,您的 Alamofire 代码将使用 URL 编码参数发送请求。尝试改用 JSON:

Alamofire.request(
    .POST,
    loginWithFacebook,
    parameters: parameters,
    encoding: .JSON
    )

另请注意,您的 cURL 请求使用键 emailfbId,但您的 Alamofire 代码使用 loginEmailfacebookId。如果您的服务器不支持两者,您可能还需要更改它们。

关于swift - 如何使用 Alamofire 在 Swift 中编写 curl 命令?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38873967/

相关文章:

c++ - 将一个 float 分成单个字节

html - 如何使用 WebKit 在 HTML 中显示更多 JSON 项目?

json - Golang post 返回 json 响应

ios - Swift 函数返回得不够快

ruby-on-rails - 如何使用 curl CLI 将文件上传到我的 ruby​​ on rails 应用程序?

node.js - 在 NodeJS 中将 Stream 输出传送到 Socket.IO

sockets - 在 C 中使用套接字如何将消息从 IPv6 发送到 IPv4?

c++ - 读句柄错误

arrays - 如何在 Swift 中用另一个数组中的元素替换数组?

swift - 如何以编程方式向我的 UILabel 添加约束