使用 Urlsession 将 Curl 请求转换为 Swift Urlrequest

时间:2021-04-04 15:38:05

标签: swift curl ibm-watson urlsession

我正在尝试在没有 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)

我做错了什么?

预先感谢您的任何建议。

0 个答案:

没有答案