首页 > 解决方案 > 在没有 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 调用的任何建议:

标签: swiftcurlwebspheretranslationibm-watson

解决方案


推荐阅读