iOS/IBM Cloud/Swift:Post 到 Watson API 使用 AlamoFire
iOS/IBM Cloud/Swift: Post to Watson API using AlamoFire
我正在尝试通过以下代码使用 AlamoFire post 到 Watson 音调分析器 API。它不断收到 401 错误,这显然意味着授权失败。然而,相同的 userid/password 信息可以通过 curl 请求找到。所以问题似乎不在于 userid/password,而是在于我如何形成 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
上面的代码有什么问题?
我没有使用过 AlamoFire,但查看它们 documentation for making a request the authentication 的处理方式与您的代码不同。
用户名/密码不是常规参数,但您需要将它们作为身份验证传递header。文档有相应的示例。这可以解释 401,因为没有身份验证传递给 Watson。
未测试,但像这样的东西应该可以工作:
Alamofire.request(url)
.authenticate(user: username, password: password)
.responseJSON { response in
print(response.request)
print(response.response)
print(response.result)
}
我正在尝试通过以下代码使用 AlamoFire post 到 Watson 音调分析器 API。它不断收到 401 错误,这显然意味着授权失败。然而,相同的 userid/password 信息可以通过 curl 请求找到。所以问题似乎不在于 userid/password,而是在于我如何形成 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
上面的代码有什么问题?
我没有使用过 AlamoFire,但查看它们 documentation for making a request the authentication 的处理方式与您的代码不同。
用户名/密码不是常规参数,但您需要将它们作为身份验证传递header。文档有相应的示例。这可以解释 401,因为没有身份验证传递给 Watson。
未测试,但像这样的东西应该可以工作:
Alamofire.request(url)
.authenticate(user: username, password: password)
.responseJSON { response in
print(response.request)
print(response.response)
print(response.result)
}