.NET 2.0环境下无法使用Google Vision C# API,如何通过Web请求调用?
嘿,我来帮你把这个.NET 2.0环境下调用Google Vision API的Web请求代码补全并理顺——毕竟老框架确实得用点“复古”的写法😉
完整实现:用HttpWebRequest调用Google Vision API
你已经有了请求初始化的基础代码,接下来只需要补全请求体构造、请求发送和响应处理这几个关键步骤,下面是适配.NET 2.0的完整代码:
1. 先定义请求/响应的实体类(适配.NET 2.0)
因为.NET 2.0不支持dynamic,所以咱们得先定义和Google Vision API格式匹配的实体类,方便序列化和反序列化JSON:
// 顶层请求类 public class VisionApiRequest { public List<AnnotateImageRequest> requests { get; set; } } // 单张图片的标注请求 public class AnnotateImageRequest { public ImageData image { get; set; } public List<Feature> features { get; set; } } // 图片数据(用Base64编码) public class ImageData { public string content { get; set; } } // 要调用的API功能(比如OCR、标签检测) public class Feature { public string type { get; set; } // 可选值:TEXT_DETECTION, LABEL_DETECTION等 public int maxResults { get; set; } } // 响应实体类(可选,用来解析返回结果) public class VisionApiResponse { public List<AnnotateImageResponse> responses { get; set; } } public class AnnotateImageResponse { public List<TextAnnotation> textAnnotations { get; set; } } public class TextAnnotation { public string description { get; set; } }
2. 补全你的Web请求代码
接着你写的那段代码,把剩下的逻辑补全:
string apiKey = "XXXXXXXXXXX"; // 替换成你的Google Cloud API密钥 string webAddr = string.Format("https://vision.googleapis.com/v1/images:annotate?key={0}", apiKey); // 初始化请求(你已经写的部分) var httpWebRequest = (HttpWebRequest)WebRequest.Create(webAddr); httpWebRequest.ContentType = "application/json; charset=utf-8"; httpWebRequest.Method = "POST"; httpWebRequest.Timeout = 10000; // 设置10秒超时,按需调整 // --- 新增部分:准备请求体 --- // 1. 把本地图片转成Base64编码 string imageFilePath = @"C:\path\to\your\image.jpg"; // 替换成你的图片路径 byte[] imageBytes = File.ReadAllBytes(imageFilePath); string base64Image = Convert.ToBase64String(imageBytes); // 2. 构造请求对象(这里以OCR文本检测为例) var visionRequest = new VisionApiRequest { requests = new List<AnnotateImageRequest> { new AnnotateImageRequest { image = new ImageData { content = base64Image }, features = new List<Feature> { new Feature { type = "TEXT_DETECTION", maxResults = 1 } } } } }; // 3. 将请求对象序列化为JSON(.NET 2.0用JavaScriptSerializer,需要引用System.Web.Extensions) var serializer = new System.Web.Script.Serialization.JavaScriptSerializer(); string jsonBody = serializer.Serialize(visionRequest); // --- 完成请求发送 --- using (var streamWriter = new StreamWriter(httpWebRequest.GetRequestStream())) { streamWriter.Write(jsonBody); streamWriter.Flush(); } // --- 处理API响应 --- try { using (var httpWebResponse = (HttpWebResponse)httpWebRequest.GetResponse()) using (var streamReader = new StreamReader(httpWebResponse.GetResponseStream())) { string responseJson = streamReader.ReadToEnd(); // 解析响应为实体类(如果需要结构化数据) var visionResponse = serializer.Deserialize<VisionApiResponse>(responseJson); if (visionResponse.responses.Count > 0 && visionResponse.responses[0].textAnnotations != null) { Console.WriteLine("识别到的文本:"); Console.WriteLine(visionResponse.responses[0].textAnnotations[0].description); } // 直接打印原始响应也可以 // Console.WriteLine(responseJson); } } catch (WebException ex) { // 捕获并处理请求错误(比如密钥无效、图片格式不对、API未启用等) using (var errorResponse = (HttpWebResponse)ex.Response) using (var streamReader = new StreamReader(errorResponse.GetResponseStream())) { string errorDetails = streamReader.ReadToEnd(); Console.WriteLine("请求出错了:"); Console.WriteLine(errorDetails); } }
3. 适配.NET 2.0的关键注意事项
- JSON序列化依赖:
JavaScriptSerializer需要引用System.Web.Extensions程序集,如果你的项目没加,右键项目→添加引用→找到这个程序集就行。如果没法引用,也可以用Newtonsoft.Json的**.NET 2.0兼容版本**(比如NuGet上的6.0.8版本)来序列化/反序列化。 - API权限检查:确保你的Google Cloud API密钥已经启用了Google Vision API,并且没有设置错误的调用限制(比如IP限制)。
- Base64编码规范:
Convert.ToBase64String默认不会生成换行符,符合Google API的要求,不用额外处理。 - 异常处理:一定要捕获
WebException,因为API返回错误时会带详细的JSON错误信息,通过ex.Response能拿到这些信息,方便排查问题。
内容的提问来源于stack exchange,提问作者Enzo B.
相关产品推荐
相关产品推荐

