我正在尝试构建一个C#库,该库将用作一组Google API的包装。使用Google Vision API时,我发现该API对于某些查询返回了空的响应集。例如,当我尝试在car.png上运行FACE_ANNOTATION时,我得到的响应是:
{
"responses": [
{}
]
}
我已经消除了所有基本问题,例如将图像存储在Google Cloud存储桶中,图像的公共访问权限,有效的API密钥以及从Google API仪表板启用API。
下面是我发出请求的代码段:
httpClient.DefaultRequestHeaders.Accept.Clear();
httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
// The API address to which we will make the HTTP POST query
String request_query = "v1/images:annotate?" + $"key={APIKey}";
HttpResponseMessage response = await httpClient.PostAsJsonAsync(request_query, imageRequests);
Stream stream = await response.Content.ReadAsStreamAsync();
StreamReader streamReader = new StreamReader(stream);
String response_str = streamReader.ReadToEnd();
Console.WriteLine(response_str);
if (response.IsSuccessStatusCode) {
try {
imageResponseList = JsonConvert.DeserializeObject<AnnotateImageResponseList>(response_str);
} catch (JsonSerializationException e) {
Debug.WriteLine(e.StackTrace);
}
}
这是发送到API的请求正文(在我上面的代码中称为imageRequests):
{
"requests": [
{
"image":
{
"content":"",
"source":
{
"imageUri":"gs://<google_cloud_bucket>/car.png"
}
},
"features":[
{
"type":0,
"maxResults":100,
"model":"builtin/stable"
}
],
"imageContext":null
}
]
}
现在,我知道已经有一个C#客户端可以直接使用,但是我正在从事的项目需要我通过HTTP请求访问REST API。
任何帮助将不胜感激。
答案 0 :(得分:0)
您尝试执行的操作API请求格式错误。
您正在指定content
和source
字段。 Vision API images.annotate documentation指定:
如果为图像同时提供内容和来源,则内容优先,并用于执行图像注释请求。
您指定的content
为空,API没有任何作用,因此响应也为空。删除content
可以避免此问题。
type
字段也有问题。在images.annotate documentation中尝试使用API时,建议在类型字段中输入以下内容:
期望以下其中一项:[“ TYPE_UNSPECIFIED”,“ FACE_DETECTION”,“ LANDMARK_DETECTION”,“ LOGO_DETECTION”,“ LABEL_DETECTION”,“ TEXT_DETECTION”,“ DOCUMENT_TEXT_DETECTION”,“ SAFE_SEARCH_DETECTION”,“ IMAGE_PROPERTIS”,“ ]。
您还可以将字段设置为类似"type": "0"
或"type": 0
的位置,以指向期望值数组上的特定位置,但是我认为其他选项更具描述性。 0
的值等于"TYPE_UNESPECIFIED"
,它也会产生一个空答案。
此请求对我有用:
{
"requests": [
{
"image": {
"source": {
"imageUri": "gs://<google_cloud_bucket>/car.png"
}
},
"features": [
{
"type": "FACE_DETECTION",
"maxResults": 100,
"model": "builtin/stable"
}
],
"imageContext": null
}
]
}
答案 1 :(得分:0)
请求json可以从BatchAnnotateImagesRequest对象进行序列化(.ToString()就足够了。)
对于响应,最好使用内置的
BatchAnnotateImagesResponse.Parser.ParseJson(response_str)
希望这会有所帮助。