我正在尝试在没有 SDK 的情况下使用 Swift 访问 IBM Watson Translation 服务)。我可以使用 curl 使用以下命令从命令行访问它:
curl -X POST --user "apikey:MYLONGAPIKEY" --header "Content-Type: application/json" --data '{"text": ["Hello, world.", "How are you?"], "model_id":"en-es"}' "https://api.us-east.language-translator.watson.cloud.ibm.com/instances/9b5fbfbf-3715-4690-822d-abfbb68e96ff/v3/translate?version=2018-05-01"
我正在尝试将上述 curl 请求转换为 Swift 中的 URLrequest,但出现身份验证错误:
这是我当前的 Swift 代码,它给出了 401 身份验证错误。
let url = URL(string: https://api.us-east.language-translator.watson.cloud.ibm.com/instances/9b5fbfbf-3715-4690-822d-abfbb68e96ff/v3/translate?version=2018-05-01)
let authstring = "apikey:" + myLongKey
var request = URLRequest(url: url!)
request.addValue("application/json", forHTTPHeaderField: "Accept")//sets mime type
request.addValue(authstring, forHTTPHeaderField: "Authorization")
request.httpMethod = "POST"
let task = URLSession.shared.dataTask(with: request) { data, response, error in
guard error == nil else {
print("error reaching watson is: ",error!)
return
}
guard let data = data else {
print("Data is empty")
return
}
//convert to json and so something
}
task.resume()
}
编辑:
该问题可能与在授权字符串前添加 Basic 相关。根据 reqbin,上面的 curl 转换为以下(工作)http 请求,所以我想我的问题相当于将以下内容转换为 SWIFT 请求:
POST /instances/9b5fbfbf-3715-4690-822d-abfbb68e96ff/v3/translate?version=2018-05-01 HTTP/1.1
Authorization: Basic LONG_KEY_DIFFERENT_FROM_MY_LONG_KEY
Host: api.us-east.language-translator.watson.cloud.ibm.com
Content-Type: application/json
Content-Length: 63
{"text": ["Hello, world.", "How are you?"], "model_id":"en-es"}
这里是 reqbin 中的 Python(reqbin 不支持 Swift):
import requests
from requests.structures import CaseInsensitiveDict
url = "https://api.us-east.language-translator.watson.cloud.ibm.com/instances/9b5fbfbf-3715-4690-822d-abfbb68e96ff/v3/translate?version=2018-05-01"
headers = CaseInsensitiveDict()
headers["Content-Type"] = "application/json"
headers["Authorization"] = "Basic LONG_KEY_DIFFERENT_FROM_MY_LONG_KEY"
data = '{"text": ["Hello, world.", "How are you?"], "model_id":"en-es"}'
resp = requests.post(url, headers=headers, data=data)
print(resp.status_code)
我做错了什么?
预先感谢您的任何建议。