通过 HttpClient 使用 Google Cloud AutoML 时收到 401 "Unauthorized" 错误
Receiving 401 "Unauthorized" error while using Google Cloud AutoML via HttpClient
我正在用 C# 编写一个 WPF 应用程序,它试图用 HttpClient
进行 Google Cloud AutoML API 调用。我能够与服务器取得联系,但总是得到 "Unauthorized" 响应。我搜索了 Whosebug 和 AutoML 文档,以获取有关如何正确地将 "CURL" 请求转换为我可以在我的 C# 应用程序中以编程方式执行的简单 HTTP 请求的任何提示,但没有找到任何提供足够指导的信息至此(因此我的问题)。
这是我正在为我的 HTTP 请求建模的 CURL 请求:
curl -X POST -H "Content-Type: application/json" \
-H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
https://automl.googleapis.com/v1beta1/projects/image-object-detection/locations/us-central1/models/MyProjectId:predict -d @request.json
此请求的某些元素我无法弄清楚如何转换为 C#,即 Authorization: Bearer
组件。我是否需要以某种方式找到一个令牌并将其添加到 header 或其他东西?如果是这样,我如何以字符串形式获取此令牌?这似乎是我真正坚持的。
这是到目前为止我实际拥有的 C# 代码。
public async Task<object> GetPrediction(string imagePath)
{
string apiKey = "MyApiKey";
string projectId = "MyProjectId";
HttpResponseMessage response;
byte[] img = File.ReadAllBytes(imagePath);
string jsonBody = "{\"payload\":{\"image\":{\"imageBytes\":\"" + Encoding.UTF8.GetString(imgBody) + "\"}}}";
string uri = $"https://automl.googleapis.com/v1beta1/projects/image-object-detection/locations/us-central1/models/{projectId}:predict?key={apiKey}";
string token = “MyToken”;
var client = new HttpClient();
var request = new HttpRequestMessage(HttpMethod.Post, uri);
request.Headers.TryAddWithoutValidation("Content-Type", "application/json");
request.Headers.Authorization = new AuthenticarionHeaderValue(“Bearer”, token);
request.Content = new StringContent(jsonBody, Encoding.UTF8, "application/json");
response = await client.SendAsync(request);
return Task.FromResult(response);
}
此代码基本上可以联系,然后我返回 401 "unauthorized" 状态代码。任何建议或指导将不胜感激,如果需要更多信息,我很乐意 post 更多。谢谢!
更新:
我修改了代码块以包含 from Nkosi,但我仍然看到相同的 401 状态代码。
我没有看到 Authorization
header 添加到请求
-H "Authorization: Bearer $(gcloud auth application-default print-access-token)"
就像在 cURL 示例中一样
在发送之前在请求上设置 Authorization
//...
request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", "{token-here}");
//...
我正在用 C# 编写一个 WPF 应用程序,它试图用 HttpClient
进行 Google Cloud AutoML API 调用。我能够与服务器取得联系,但总是得到 "Unauthorized" 响应。我搜索了 Whosebug 和 AutoML 文档,以获取有关如何正确地将 "CURL" 请求转换为我可以在我的 C# 应用程序中以编程方式执行的简单 HTTP 请求的任何提示,但没有找到任何提供足够指导的信息至此(因此我的问题)。
这是我正在为我的 HTTP 请求建模的 CURL 请求:
curl -X POST -H "Content-Type: application/json" \
-H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
https://automl.googleapis.com/v1beta1/projects/image-object-detection/locations/us-central1/models/MyProjectId:predict -d @request.json
此请求的某些元素我无法弄清楚如何转换为 C#,即 Authorization: Bearer
组件。我是否需要以某种方式找到一个令牌并将其添加到 header 或其他东西?如果是这样,我如何以字符串形式获取此令牌?这似乎是我真正坚持的。
这是到目前为止我实际拥有的 C# 代码。
public async Task<object> GetPrediction(string imagePath)
{
string apiKey = "MyApiKey";
string projectId = "MyProjectId";
HttpResponseMessage response;
byte[] img = File.ReadAllBytes(imagePath);
string jsonBody = "{\"payload\":{\"image\":{\"imageBytes\":\"" + Encoding.UTF8.GetString(imgBody) + "\"}}}";
string uri = $"https://automl.googleapis.com/v1beta1/projects/image-object-detection/locations/us-central1/models/{projectId}:predict?key={apiKey}";
string token = “MyToken”;
var client = new HttpClient();
var request = new HttpRequestMessage(HttpMethod.Post, uri);
request.Headers.TryAddWithoutValidation("Content-Type", "application/json");
request.Headers.Authorization = new AuthenticarionHeaderValue(“Bearer”, token);
request.Content = new StringContent(jsonBody, Encoding.UTF8, "application/json");
response = await client.SendAsync(request);
return Task.FromResult(response);
}
此代码基本上可以联系,然后我返回 401 "unauthorized" 状态代码。任何建议或指导将不胜感激,如果需要更多信息,我很乐意 post 更多。谢谢!
更新:
我修改了代码块以包含
我没有看到 Authorization
header 添加到请求
-H "Authorization: Bearer $(gcloud auth application-default print-access-token)"
就像在 cURL 示例中一样
在发送之前在请求上设置 Authorization
//...
request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", "{token-here}");
//...