缺少有关Google Translation API客户端问题的有效API密钥?

时间:2018-03-20 08:57:47

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

我按照https://cloud.google.com/translate/docs/reference/libraries#client-libraries-usage-java开始java客户端演示。 我已将set 身份验证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设置环境变量后,它仍然无效。

enter image description here

6 个答案:

答案 0 :(得分:2)

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

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

我个人从来没有这样做过。

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

示例项目here

答案 1 :(得分:1)

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

答案 2 :(得分:0)

您可以尝试通过服务帐户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
        }
    ); 

您可以将参考文献https://cloud.google.com/bigquery/docs/authentication/service-account-file用于Java

答案 3 :(得分:0)

添加

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

之前

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

干杯:)

答案 4 :(得分:0)

curl命令会发生相同的事情

c:\MT\Curl\bin>curl -X POST -H "key=xxxxxxxxxxxxxx" -H
"Content-Type: application/json; charset=utf-8" -d @request.json https://texttos
peech.googleapis.com/v1/text:synthesize
{
  "error": {
    "code": 403,
    "message": "The request is missing a valid API key.",
    "status": "PERMISSION_DENIED"
  }
}

答案 5 :(得分:0)

    {
      "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 translation = 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)
    }