【问题标题】:Missing a valid API key about Google Translation API Client issue?缺少有关 Google Translation API 客户端问题的有效 API 密钥?
【发布时间】:2018-08-29 00:18:03
【问题描述】:

我关注https://cloud.google.com/translate/docs/reference/libraries#client-libraries-usage-java开始java客户端演示。 我已经有set authentication json 文件到环境变量GOOGLE_APPLICATION_CREDENTIALS。但是,当我运行 java 示例代码时,我得到了 translateException。

Exception in thread "main" com.google.cloud.translate.TranslateException: The request is missing a valid API key.
at com.google.cloud.translate.spi.v2.HttpTranslateRpc.translate(HttpTranslateRpc.java:61)
at com.google.cloud.translate.spi.v2.HttpTranslateRpc.translate(HttpTranslateRpc.java:144)
at com.google.cloud.translate.TranslateImpl$4.call(TranslateImpl.java:113)
at com.google.cloud.translate.TranslateImpl$4.call(TranslateImpl.java:110)
Caused by: 
com.google.api.client.googleapis.json.GoogleJsonResponseException: 403 
Forbidden
{
  "code" : 403,
  "errors" : [ {
  "domain" : "global",
  "message" : "The request is missing a valid API key.",
  "reason" : "forbidden"
} ],
  "message" : "The request is missing a valid API key.",
  "status" : "PERMISSION_DENIED"
}

文档显示此 JSON 文件包含密钥信息。

示例代码如下所示

    // Instantiates a client
    Translate translate = TranslateOptions.getDefaultInstance().getService();
    // The text to translate
    String text = "Hello, world!";
    // Translates some text into Russian
    Translation translation =
        translate.translate(
            text,
            TranslateOption.sourceLanguage("en"),
            TranslateOption.targetLanguage("ru"));
    System.out.printf("Text: %s%n", text);
    System.out.printf("Translation: %s%n", translation.getTranslatedText());

我不知道如何设置 api-key。 在我为keycredentials 设置环境变量后,它仍然不起作用。

【问题讨论】:

  • 请编辑您的问题并包含您的代码。 API 密钥用于访问公共 API,与应用程序凭据不同。
  • TranslateOptions 中的 setApiKey 方法是 @Deprecated。那么如何用 GCP Console 中的自己的密钥替换它呢? @DalmTo
  • 假设您找到了一个 API 密钥,尝试在 GOOGLE_API_KEY 中设置它 您正在寻找一个公共 API 密钥。
  • 我在控制台找到了API key,但是不知道GOOGLE_API_KEY在哪里设置。
  • 它是一个环境变量,就像 GOOGLE_APPLICATION_CREDENTIALS 指向服务帐户 json 文件的位置一样。 GOOGLE_API_KEY 你设置的key的值

标签: java google-api google-translate google-api-java-client google-translator-toolkit


【解决方案1】:

要向 Google 翻译发出经过身份验证的请求,您必须使用凭据创建服务对象或使用 API 密钥。最简单的身份验证方法是使用Application Default Credentials。这些凭据是从您的环境中自动推断出来的,因此您只需要以下代码即可创建您的服务对象:

Translate translate = TranslateOptions.getDefaultInstance().getService();

我个人从来没有让它发挥作用。

此代码也可以与 API 密钥一起使用。默认情况下,在 GOOGLE_API_KEY 环境变量中查找 API 密钥。设置 API 密钥后,您可以通过调用由 TranslateOptions.getDefaultInstance().getService() 创建的翻译服务上的方法来进行 API 调用。

示例项目here

【讨论】:

  • 我在我的问题中发布了一张图片。我不确定这是否正确?或者我需要将它设置在Path 变量中。
【解决方案2】:

您可以尝试通过如下所示的服务帐户 json 文件进行身份验证

在节点中非常简单

 // Instantiates a client
 const translate = new Translate(
        {
                projectId: 'your project id', //eg my-project-0o0o0o0o'
                keyFilename: 'path of your service acount json file' //eg my-project-0fwewexyz.json
        }
    ); 

java 可以参考https://cloud.google.com/bigquery/docs/authentication/service-account-file

【讨论】:

  • 翻译是一个接口......不是一个类的家伙
【解决方案3】:

我能够通过运行让谷歌翻译工作 “gcloud auth 应用程序-默认登录” 在命令提示符下。在要求您使用您的谷歌帐户授权后,这会将凭据重新生成到默认位置。有关详细信息,请参阅https://github.com/GoogleCloudPlatform/google-cloud-java/tree/master/google-cloud-translate

【讨论】:

  • @user1694733 但是我收到了以下信息:“消息”:“您的应用程序已使用来自 translate.googleapis.com 不支持的 Google Cloud SDK 或 Google Cloud Shell 的最终用户凭据进行身份验证。我们建议大多数服务器应用程序改用服务帐户。有关服务帐户以及如何在您的应用程序中使用它们的详细信息,请参阅cloud.google.com/docs/authentication。",
【解决方案4】:

添加

System.setProperty("GOOGLE_API_KEY", "your key here");

之前

Translate translate = TranslateOptions.getDefaultInstance().getService();

干杯:)

【讨论】:

    【解决方案5】:
        {
          "code" : 403,
          "errors" : [ {
            "domain" : "global",
            "message" : "Requests from this Android client application <empty> are blocked.",
            "reason" : "forbidden"
          } ],
          "message" : "Requests from this Android client application <empty> are blocked.",
          "status" : "PERMISSION_DENIED"
        }
    

    以下方法我遵循 android 来解决它。我尝试使用私钥,但对我不起作用。所以我为此使用公钥

    System.setProperty("GOOGLE_API_KEY", "公钥"); val translate = TranslateOptions.getDefaultInstance().service

        translate?.let {
            val translation =  it.translate("Hola Mundo!",
                Translate.TranslateOption.sourceLanguage("es"),
                Translate.TranslateOption.targetLanguage("en"),
                Translate.TranslateOption.model("nmt"));
         val check =  translation.translatedText
            Log.e("inf",""+check)
        }
    

    【讨论】:

      猜你喜欢
      • 2018-11-07
      • 1970-01-01
      • 2020-10-31
      • 2018-07-05
      • 2021-06-14
      • 1970-01-01
      • 1970-01-01
      • 2012-07-02
      • 2021-10-23
      相关资源
      最近更新 更多