代码之家  ›  专栏  ›  技术社区  ›  user6631314

ios/ibm cloud/swift:使用alamofire发布到watson api

  •  1
  • user6631314  · 技术社区  · 6 年前

    我试图通过以下代码使用alamofire发布到watson音调分析器api。它总是得到一个401错误,这显然意味着授权失败。但是,相同的用户id/密码信息可用于curl请求的find。所以问题似乎不在于用户id/密码,而在于我如何形成alamofire请求。

     func postToWatson () {
            print("post to watson called")
            let url: String =  "https://gateway.watsonplatform.net/tone-analyzer/api/v3/tone?version=2016-05-19"
            let message = "All you need is love"
            var parameters = [
               "username":"my-lengthy-username",
                "password":"my-ugly-password"]
            parameters["text"] = message
            Alamofire.request(url, parameters: parameters)
                .responseJSON { response in
                    print(response.request)
                    print(response.response)
                    print(response.result)
            }
        }
    

    以下是我通过上述打印命令从api得到的信息:

    Optional(https://gateway.watsonplatform.net/tone-analyzer/api/v3/tone?version=2016-05-19&password=xxxxxx&text=All%20you%20need%20is%20love&username=xxxxxxxxxxxx)
    Optional(<NSHTTPURLResponse: 0x1740396a0> { URL: https://gateway.watsonplatform.net/tone-analyzer/api/v3/tone?version=2016-05-19&password=xxxxxx&text=All%20you%20need%20is%20love&username=xxxxxxxxxxxx } { status code: 401, headers {
        Connection = close;
        "Content-Encoding" = gzip;
        Date = "Wed, 30 May 2018 17:23:30 GMT";
        "Strict-Transport-Security" = "max-age=31536000;";
        "Www-Authenticate" = "Basic realm=\"IBM Watson Gateway(Log-in)\"";
        "X-Backside-Transport" = "OK OK,FAIL FAIL";
        "X-DP-Transit-ID" = "gateway02-1020566241";
        "X-DP-Watson-Tran-ID" = "gateway02-1020566241";
        "X-Global-Transaction-ID" = ffea405d5b0ede123cd49ae1;
        "x-dp-local-file" = true;
    } })
    SUCCESS
    

    上面的代码怎么了?

    1 回复  |  直到 6 年前
        1
  •  0
  •   data_henrik    6 年前

    我没用过阿拉莫菲尔,但看看他们的 documentation for making a request the authentication 处理方式与代码不同。

    用户名/密码不是常规参数,但您需要将它们作为身份验证头传递。医生有样本。这就解释了401,因为没有认证被传递给沃森。

    没有经过测试,但类似这样的东西应该可以工作:

     Alamofire.request(url)
        .authenticate(user: username, password: password)
        .responseJSON { response in
                    print(response.request)
                    print(response.response)
                    print(response.result)
    }