使用 swift 在 Alamofire 中使用 CURL 命令

Posted

技术标签:

【中文标题】使用 swift 在 Alamofire 中使用 CURL 命令【英文标题】:CURL command in Alamofire with swift 【发布时间】:2016-07-25 07:58:26 【问题描述】:

我有以下工作 curl 命令,我需要使用 Alamofire 在 Swift 中运行。

curl -k -i -d ' "user": "displayName":"My Test" ,"email":"test@xxtest.com","pwd":"test","roles":["stu"]' -H "Content-Type: application/json;charset=UTF-8" -u web:web -X POST 'https://test.herokuapp.com/xtest/auth/register'

我使用 Alamofire 在 Swift 中尝试了以下方法。我的印象是我 -u web:web 错误,但我无法确认。 控制台给了我以下我不明白的错误:

print response object
  nil
print error
  Optional(Error Domain=NSCocoaErrorDomain Code=3840 "Invalid value around character 0." UserInfo=NSDebugDescription=Invalid value around character 0.)

有人能指出这里有什么问题吗?谢谢。

这是将 CURL 命令翻译成 Swift 的函数

func registerNewStudent(displayName: String, email: String, password: String, completionHandler: (AnyObject?, NSError?) -> ()) 

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

    let credentialData = "\(user):\(password)".dataUsingEncoding(NSUTF8StringEncoding)!
    let base64Credentials = credentialData.base64EncodedStringWithOptions([])

    let headers = ["Authorization": "Basic \(base64Credentials)"]

//example for a nested array query
  let parameters = [
        "user": [
            "displayName": displayName,
            "email": email,
            "pwd": password,
            "roles":["stu"]
        ]
    ]

    Alamofire.request(
        .POST,
        registerURL,
        headers: headers,
        parameters: parameters
        )
        .responseJSON  response in
            switch response.result 
            case .Success(let value):
                completionHandler(value, nil)
            case .Failure(let error):
                completionHandler(nil, error)
            
    

我是这样调用这个函数的:

func okButtonTapped(sender: UIButton) 

   let displayNameText = displayNameInput.text
    let emailText = emailInput.text
    let passwordText = passwordInput.text

    restApi.registerNewStudent(displayNameText!,emailInput: emailText!, passwordInput: passwordText!) responseObject, error in
        // use responseObject and error here

        print("print response object")
        print(responseObject)
        print("print error")
        print(error)
    

来自 CURL 调用的响应:

"result":"email":"trrrrrest@xxtest.com","display_name":"My Test","pwd":"test","fb_id":null,"roles":["stu"]

【问题讨论】:

【参考方案1】:

我可以从这里解决它:http://www.ceus-now.com/curl-d-to-alamofire/

在 JSON 响应之后添加以下行(不是之前)。

    .authenticate(user: "web", password: "web")

所以方法看起来像:

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

【讨论】:

以上是关于使用 swift 在 Alamofire 中使用 CURL 命令的主要内容,如果未能解决你的问题,请参考以下文章

如何在swift中使用alamofire上传图库图片

使用 PHP 在 Swift 5 中使用 Alamofire 接收图像上传

在 swift 中使用 alamofire 将参数作为原始数据发送

在 swift 中使用 Alamofire 取消 api 请求

POST 请求在 swift3 中无法使用 alamofire

Swift 4:如何使用 Alamofire 在参数中发布文件?