尝试通过REST API将图像发送到我的自定义AutoML模型时显示“(403)Forbidden”

时间:2018-08-12 02:43:04

标签: json rest google-cloud-platform google-cloud-ml automl

我在.NET Web应用程序中实现自定义AutoML模型时遇到问题,该模型允许识别通过REST API发送图像。我不断收到错误消息。

  

远程服务器返回错误:(403)禁止。

我有一张图片,并将其转换为一个名为imageBytesString的字节串,并创建了jsonRequest对象,如下所示:

string jsonRequest = "{\"payload\":{\"image\":{\"imageBytes\":\"" + imageBytesString + "\"},}}";`

然后我正在执行POST请求,如下所示:

WebRequest request = WebRequest.Create(@"https://automl.googleapis.com/v1beta1/projects/PROJECT_ID/locations/us-central1/models/MODEL_ID:predict");
request.Method = "POST";
request.ContentType = "application/json";
request.Headers.Add("Authorization", "Bearer GCLOUD_ACCESS_TOKEN");

using (var streamWriter = new StreamWriter(request.GetRequestStream()))
{
    streamWriter.Write(jsonRequest);
}

然后,当它达到request.GetResponse();时,如果没有其他信息就给我上述错误。

作为参考,以下是摘自我的自定义AutoML模型的PREDICT页面底部的摘录:

request.json:

{
  "payload": {
    "image": {
      "imageBytes": "YOUR_IMAGE_BYTE"
    },
  }
}

执行请求:

curl -X POST -H "Content-Type: application/json" \
  -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
  https://automl.googleapis.com/v1beta1/projects/PROJECT_ID/locations/us-central1/models/MODEL_ID:predict -d @request.json

谢谢

3 个答案:

答案 0 :(得分:1)

您引用的curl请求使用gcloud auth application-default print-access-token命令在标头中传递访问令牌。每次运行都会产生一个新令牌。令牌的有效时间通常为3600秒。您可以通过运行curl https://www.googleapis.com/oauth2/v1/tokeninfo?access_token=GCLOUD_ACCESS_TOKEN来检查自己。这将返回包含"expires_in"字段的有效负载。因此,将令牌作为GCLOUD_ACCESS_TOKEN环境变量传递后,令牌到期将导致403错误。您应该做的是创建具有正确权限的service account,下载带有凭据的json,并将GOOGLE_APPLICATION_CREDENTIALS设置为json的路径。选中下载凭据下的here,以获取.NET中的示例。

答案 1 :(得分:1)

我终于能够使它工作。

要解决此问题,必须解决2个问题。

首先;由于某种原因,当我最初创建服务帐户并输入命令gcloud auth activate-service-account --key-file="[/PATH/TO/KEY/FILE.json]时,它告诉我它可以工作,并且该服务帐户已添加到gcloud auth list列表中。但是再次检查后,它不存在了,所以我再次运行了。

第二;我通过以下命令获取访问令牌:

gcloud auth application-default print-access-token

相反,我尝试使用通过以下命令收到的访问令牌:

gcloud auth print-access-token

(其中没有application-default)。

完成上述两项操作后,我现在能够成功发送图像请求并接收预测响应。

但是,尽管如此,我似乎仍然每小时仍需要获取一个新的访问令牌。但这是我想的另一个问题。

答案 2 :(得分:1)

更好的解决方案是仅从同一项目中访问Auto ML端点(这样就不需要访问令牌)。

要从项目外部访问端点,请使用API​​网关(例如APIGEE或AppEngine),这些网关可以为您提供更好的控件

相关问题