swift - 来自 swift 的 Appspot.com API

标签 swift google-cloud-platform google-translation-api

我正在开发一款 iOS 应用,它使用 Google Translate API 将日语句子翻译成英语。 我可以使用 curl 命令从 API 获取翻译后的数据,但现在我无法使用 Swift 获取数据。

以下是我使用的curl命令。

curl -X POST \
>   https://XXXXX.appspot.com/api/translate \
>   -H 'Postman-Token: XXXXX' \
>   -H 'cache-control: no-cache' \
>   -H 'content-type: multipart/form-data; boundary=----XXXXX' \
>   -F 'text=私はあなたが好きです。' \
>   -F target_lang=en \
>   -F text_lang=ja

但是,下面的 swift 代码在 result 中只有 nil

        let reqB: [String:Any] = ["text": text, "target_lang": "en", "text_lang": "ja"]
        let reqBody = try? JSONSerialization.data(withJSONObject: reqB)
        guard let reqUrl = URL(string: "https://XXXXX.appspot.com/api/translate") else {
            return
        }

        var req = URLRequest(url: reqUrl)
        req.httpMethod = "POST"
        req.httpBody = reqBody
        req.setValue("XXXXX", forHTTPHeaderField: "Postman-Token")
        req.setValue("no-cache", forHTTPHeaderField: "cache-control")
        req.setValue("multipart/form-data; boundary=----XXXXX", forHTTPHeaderField: "Content-Type")

        let session = URLSession(configuration: .default, delegate: nil, delegateQueue: OperationQueue.main)
        let task = session.dataTask(with: req, completionHandler: {
            (data , response ,error) in
            session.finishTasksAndInvalidate()

谁能帮帮我?

最佳答案

我通过 Alamofire4 解决了这个问题。 看来“multipartFormData”是这个问题的关键。

    let reqUrl = "XXX"
    let originalText = sendingText.data(using: .utf8)!
    let targetLang = "en".data(using: .utf8)!
    let textLang = "ja".data(using: .utf8)!

    Alamofire.upload(
        multipartFormData: { multipartFormData in
            multipartFormData.append(originalText, withName: "text", mimeType: "text/plain")
            multipartFormData.append(targetLang, withName: "target_lang", mimeType: "text/plain")
            multipartFormData.append(textLang, withName: "text_lang", mimeType: "text/plain")
    }, to: reqUrl) { (encodingResult) in
        switch encodingResult {
        case .success(let upload, _, _):
            upload.responseJSON { response in
                if !response.result.isSuccess {
                    print("# ERROR")
                } else {
                    print("# SUCCESS")
                    if let json = response.result.value as? [String: Any], let translatedText = json["translated_text"] as? String {
                        print(translatedText)

                }
            }
        case .failure(let encodingError):
            print(encodingError)
        }
    }

关于swift - 来自 swift 的 Appspot.com API,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53202224/

相关文章:

firebase - 新的 Firebase 身份验证计费如何运作?

sql - BigQuery 连接错误

android - NoSuchMethodError : No static method decodeBase64 错误

swift - 如何在spritekit中使用页面控件? (以编程方式)

Swift:如何在不重新加载数据的情况下重新加载 UITableViewCell 中的行高

google-cloud-platform - 列出 Google Cloud 上提供的所有机器类型

javascript - CK编辑器4,谷歌翻译也翻译我的MATHJAX公式,即使没有翻译

python - 类似于 python 的谷歌翻译的免费 API?

ios - 是否可以从 IOS 项目中导出 IOS 框架?

swift - Swift 中的多可选类型