swift - 在没有 SDK 的情况下使用 Swift 调用 IBM Watson Translation API
问题描述
我想从 Swift 向Watson Translation 服务提交翻译请求,但不想使用 Swift SDK。(IBM 计划停止对 SDK 的 Pod 和 Carthage 支持,因为它表示它无法解决许多问题,但除此之外,一个完整的 SKDK 似乎有点矫枉过正)。过去,我通过发布请求访问了其他 Watson 服务。但是,我在文档中找不到任何关于在没有SDK 的情况下使用翻译服务的示例。
但是,有 curl 示例,因此如果您可以从终端窗口调用 API,则应该可以使用一些 Swift 代码调用它,但是,我对 curl 的了解不足,无法将其转换为 Swift 调用。
任何人都可以建议如何通过 get 或 post https 调用来执行此操作,或者为我指明正确的方向吗?
这是IBM 翻译文档中的 curl :
curl -X POST --user "apikey:{apikey}" --header "Content-Type: application/json" --data '{"text": ["Hello, world.", "How are you?"], "model_id":"en-es"}' "{url}/v3/translate?version=2018-05-01"
该 url 似乎是指一个服务端点,例如:
https://api.us-south.language-translator.watson.cloud.ibm.com/v3/translate?version=2018-05-01 and the API key is the one given to the user.
编辑:
将卷曲放入 reqbin 并选择 Raw 给出:
POST /instances/~/v3/translate?version=2018-05-01 HTTP/1.1
Authorization: Basic xxx-xxx-xxx-xxx-xxx
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"}
我的问题是如何将其转换为标头中的 Post 请求等等。
这是我正在尝试调整的后调用的一些样板代码。它在 Swift 中编译和运行,但是,由于请求的格式不正确,API 不允许授权(返回 401 错误)。
感谢您提供有关如何将 CURL 转换为 Post 请求的任何建议。
带有样板代码的方法:
func postPhraseToTranslate (message:String,completion:@escaping (_ response:MyTranslation
let watsonurl: String = "https://api.us-south.language-translator.watson.cloud.ibm.com/v3/translate?version=2018-05-01 "
let parameters = ["text":message]
guard let parametersJson = try? JSONSerialization.data(withJSONObject: parameters, options: .prettyPrinted) else {//open 2
//print("")
return
}
let username = "xxx-xxx"
let password = "xxx-xxx-xxx-xxx-xxx-xxx-xxx"
let authString = username + ":" + password
guard let authData = authString.data(using: .ascii) else {//open 2
return
}//close 2
let authValue = "Basic " +
authData.base64EncodedString(options: Data.Base64EncodingOptions(rawValue: 0))
let url = URL(string: watsonurl)!
var request = URLRequest(url: url)
request.setValue( authValue, forHTTPHeaderField: "Authorization")
request.setValue("application/json", forHTTPHeaderField: "Content-Type")
request.httpMethod = "POST"
request.httpBody = parametersJson
let task = URLSession.shared.dataTask(with: request) { //open 2
data, response, error in
guard let data = data, error == nil else {
// print("network error=\(error)")
return
}
print("got back the translation")
task.resume()
}
感谢有关如何将 CURL 转换为 Swift Get 或 Post 调用的任何建议:
解决方案
推荐阅读
- apache-storm - 在 Storm 2.2.0 中使用 Flux.main() 以本地模式运行拓扑
- html - 如何在包含在 CDATA 中的 HTML 格式的 XML 字符串中使用主题颜色属性
- php - 无法从本地网络访问 wamp
- sql - 将数据透视到新的列名 - Oracle SQL
- r - R中的x轴标签ggplot2
- swift - 连续语句必须用“;”分隔 迅速
- mysql - 在 mysql 中使用 join 和 DATEDIFF() 创建视图
- botframework - 如何配置 bot 框架 C# slack 适配器以使用多个工作区?
- reactjs - Draft.js 标头未正确呈现
- node.js - 不同端口上的节点服务器和客户端?