WebApiClientCore简约调用百度AI接口
WebApiClientCore
WebApiClient.JIT/AOT的netcore版本,集高性能高可扩展性于一体的声明式http客户端库,特别适用于微服务的restful资源请求,也适用于各种畸形http接口请求。
百度AI
百度AI目前相当开放(至少在使用上),如果不是高并发请求场景,一般免费使用即可。鉴于其提供的.net sdk比较先进(laji),使用Dictionary类型替代模型参数,以及使用万能的JObject类型做为返回值类型的设计,正常人都无法体会其中精髓。试看以下的api原型,想必大家都想找找没有文档说明吧?我觉得这sdk更像是一个httpUtil,只提供了一个 object Send( object )方法。
public JObject Detect(string image, string imageType, Dictionary<string, object> options = null);
小牛试刀
今天我们抛开官方SDK,使用WebApiClientCore请求我们感兴趣的人脸检测接口,虽然只有一个接口,但我会尽量按高规格的设计质量来调用这个接口,让朋友们了解WebApiClientCore的魅力之处。首先,我们先阅读官方文档:Api文档.人脸检测,根据文档内容,大概有以下知识块:
- access_token获取与使用
- access_token的过期与刷新
- 请求参数模型
- 正确的响应结果模型
- 人脸识别错误码
模型设计
请求参数模型
为了使用方便,我们将图片类型、人脸类型设计为枚举类型,注意实际请求时,传输的是枚举的键名,而不是值。
/// <summary>
/// 表示待人脸检测的图片
/// </summary>
public class DetectImage
{
/// <summary>
/// 图片信息
/// </summary>
public string Image { get; set; }
/// <summary>
/// 图片信息
/// </summary>
[JsonConverter(typeof(JsonStringEnumConverter))]
public ImageType Image_type { get; set; }
/// <summary>
/// 最多处理人脸的数目
/// </summary>
[Range(1, 10)]
public int? Max_face_num { get; set; } = 1;
/// <summary>
/// 人脸的类型
/// </summary>
[JsonConverter(typeof(JsonStringEnumConverter))]
public FaceType Face_type { get; set; }
/// <summary>
/// 图像类型
/// </summary>
public enum ImageType
{
/// <summary>
/// 图片的base64值
/// </summary>
BASE64,
/// <summary>
/// 图片的 URL地址
/// </summary>
URL,
/// <summary>
/// 人脸图片的唯一标识
/// </summary>
FACE_TOKEN
}
/// <summary>
/// 人脸的类型
/// </summary>
public enum FaceType
{
/// <summary>
/// 生活照
/// </summary>
LIVE,
/// <summary>
/// 身份证芯片照
/// </summary>
IDCARD,
/// <summary>
/// 带水印证件照
/// </summary>
WATERMARK,
/// <summary>
/// 证件照片
/// </summary>
CERT
}
}
响应模型
通过PostMan预请求,我们发现官方文档里提到的响应内容,实际上只是完整响应内容的里面的Result值而已(官方文档有点不靠谱) 。
/// <summary>
/// 响应内容
/// </summary>
/// <typeparam name="T"></typeparam>
public class Response<T>
{
/// <summary>
/// 错误码
/// </summary>
public int Error_code { get; set; }
/// <summary>
/// 错误信息
/// </summary>
public string Error_msg { get; set; }
/// <summary>
/// 结果值
/// </summary>
public T Result { get; set; }
}
/// <summary>
/// 表示检测结果
/// </summary>
public class DetectResult
{
/// <summary>
/// 人脸数量
/// </summary>
public int Face_num { get; set; }
/// <summary>
/// 人脸列表
/// </summary>
public FaceItem[] Face_list { get; set; }
/// <summary>
/// 人脸
/// </summary>
public class FaceItem
{
public string Face_token { get; set; }
public FaceLocation Location { get; set; }
public int Face_probability { get; set; }
public FaceAngle Angle { get; set; }
/// <summary>
/// 位置
/// </summary>
public class FaceLocation
{
public double Left { get; set; }
public double Top { get; set; }
public int Width { get; set; }
public int Height { get; set; }
public int Rotation { get; set; }
}
/// <summary>
/// 角度
/// </summary>
public class FaceAngle
{
public double Yaw { get; set; }
public double Pitch { get; set; }
public double Roll { get; set; }
}
}
}
接口声明
应用请求与响应模型
/// <summary>
/// 百度人脸相关接口
/// </summary>
public interface IBaiduFaceApi
{
/// <summary>
/// 图像的人脸检测
/// </summary>
/// <param name="detectImage">待检测图像</param>
/// <returns></returns>
[HttpPost("rest/2.0/face/v3/detect")]
ITask<Response<DetectResult>> DetectAsync([JsonContent] DetectImage detectImage);
}
应用请求日志
为了方便调试,我们需要将实际请求内容输出到日志组件,这里为接口应用[LoggingFilter]。
/// <summary>
/// 百度人脸相关接口
/// </summary>
[LoggingFilter]
public interface IBaiduFaceApi
{
/// <summary>
/// 图像的人脸检测
/// </summary>
/// <param name="detectImage">待检测图像</param>
/// <returns></returns>
[HttpPost("rest/2.0/face/v3/detect")]
ITask<Response<DetectResult>> DetectAsync([JsonContent] DetectImage detectImage);
}
应用access_token
access_token我们可以做为一个切面处理,WebApiClientCore.Extensions.OAuths扩展包专门处理这个切面,由于百度的access_token不是标准的放到Authorization请求头,而是放到access_token的query参数,所以我们需要继承ClientCredentialsTokenAttribute来实现自定义token应用特性。
/// <summary>
/// token应用特性
/// </summary>
class AccessTokenAttribute : ClientCredentialsTokenAttribute
{
protected override void UseTokenResult(ApiRequestContext context, TokenResult tokenResult)
{
context.HttpContext.RequestMessage.AddUrlQuery("access_token", tokenResult.Access_token);
}
}
/// <summary>
/// 百度人脸相关接口
/// </summary>
[AccessToken]
[LoggingFilter]
public interface IBaiduFaceApi
{
/// <summary>
/// 图像的人脸检测
/// </summary>
/// <param name="detectImage">待检测图像</param>
/// <returns></returns>
[HttpPost("rest/2.0/face/v3/detect")]
ITask<Response<DetectResult>> DetectAsync([JsonContent] DetectImage detectImage);
}
接口注册与配置
接口注册
services.AddHttpApi<IBaiduFaceApi>(c =>
{
c.HttpHost = new Uri("https://aip.baidubce.com/");
});
token提供者配置
百度返回的token有refreshToken值,但文档里没有提到怎么刷新token,尝试使用token请求地址去刷新token会失败,所以这里直接配置禁用使用refreshToken的功能,强迫时间到期之后,重新去申请一次token。
services.AddClientCredentialsTokenProvider<IBaiduFaceApi>(c =>
{
c.Endpoint = new Uri("https://aip.baidubce.com/oauth/2.0/token");
c.UseRefreshToken = false;
c.Credentials.Client_id = "API Key";
c.Credentials.Client_secret = "Secret Key";
});
接口调用
将IBaiduFaceApi注入到我们的服务,即可调用
public class FaceService
{
private readonly IBaiduFaceApi baiduFaceApi;
public FaceService(IBaiduFaceApi baiduFaceApi)
{
this.baiduFaceApi = baiduFaceApi;
}
public async Task DetectAsync()
{
var img = new DetectImage
{
Face_type = DetectImage.FaceType.IDCARD,
Image = "http://xxx.jpg",
Image_type = DetectImage.ImageType.URL
};
var result = await baiduFaceApi.DetectAsync(img);
}
}
现在,我们已经拿到正常的结果,顺便查看请求日志确认请求是否正确。
POST /rest/2.0/face/v3/detect?access_token=省略值 HTTP/1.1
Host: aip.baidubce.com
User-Agent: WebApiClientCore/1.0.6.0
Accept: application/json; q=0.01, application/xml; q=0.01
Content-Type: application/json; charset=utf-8
{"image":"http://xxx.jpg","image_type":"URL","max_face_num":1,"face_type":"IDCARD"}
HTTP/1.1 200 OK
Connection: keep-alive
Date: Thu, 23 Jul 2020 02:05:58 GMT
Content-Type: application/json
Content-Length: 328
{"error_code":0,"error_msg":"SUCCESS","log_id":2599254579794,"timestamp":1595469958,"cached":0,"result":{"face_num":1,"face_list":[{"face_token":"97071a7f306483fea94d0766cfeb120c","location":{"left":34.54,"top":74.23,"width":101,"height":101,"rotation":0},"face_probability":1,"angle":{"yaw":-0.92,"pitch":6.68,"roll":-3.72}}]}}
结束语
以上为WebApiClientCore在百度Ai请求的一个小例子,当然WebApiClientCore还有好多功能,点击项目链接,带你GET到N种使用技能,不求star,只求提供良好建议。
WebApiClientCore简约调用百度AI接口的更多相关文章
- 使用百度ai接口加图灵机器人完成简单web版语音对话
app文件 from flask import Flask, request, render_template, jsonify, send_file from uuid import uuid4 i ...
- django--调用百度AI接口实现人脸注册登录
面部识别----考勤打卡.注册登录.面部支付等等...感觉很高大上,又很方便,下面用python中的框架--django完成一个注册登录的功能,调用百度AI的接口,面部识别在网上也有好多教程,可以自己 ...
- js调用百度地图接口
原文:js调用百度地图接口 这是前几天公司做的新项目,上面需要用到地图的数据.第一次做这类型的东西没啥思路,咱们经理说,这东西简单,截个图存文件夹里调整好尺寸,数据库里存上图片的地址动态调用就行了.心 ...
- Winform调用百度地图接口简单示例
1.首先用一个html文件调用百度地图接口(主要注册一个序列号): <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitiona ...
- [初识]使用百度AI接口,图灵机器人实现简单语音对话
一.准备 1.百度ai开放平台提供了优质的接口资源https://ai.baidu.com/ (基本免费) 2.在语音识别的接口中, 对中文来说, 讯飞的接口是很好的选择https://www.xf ...
- Excel催化剂开源第25波-Excel调用百度AI,返回AI结果
现成的这些轮子,无需调用网页,直接本地离线即可生成). 当然在AI时代,少不了各种AI接口的使用场景,普通开发者只需聚焦在自己的业务场景上,这些AI底层技术,只需类似水煤电一般去BAT这些大厂那里去消 ...
- Winform调用百度地图接口
using System; using System.IO; using System.Collections.Generic; using System.ComponentModel; using ...
- 人工智能-调百度AI接口+图灵机器人
1.登陆百度AI的官网 1.注册:没有账号注册 2.创建应用 3.创建应用 4.查看应用的ID 5.Python代码 from aip import AipSpeech APP_ID = " ...
- 基于flask和百度AI接口实现前后端的语音交互
话不多说,直接怼代码,有不懂的,可以留言 简单的实现,前后端的语音交互. import os from uuid import uuid4 from aip import AipSpeech from ...
随机推荐
- Downloadmanager实现app实现的升级下载使用
1.app升级下载现在不推荐使用downloadmanager下载: 原因有下面的几个方面: (1)三星note系列部分手机需要手动打开这个权限才能用这个功能,而有些国产手机更加nb了直接个阉割了(d ...
- python加载json文件
主要是加载进来,之后就没难度了 import json path = 'predict2.json' file = open(path, "rb") fileJson = json ...
- dart快速入门教程 (4)
4.流程控制 4.1.分支结构 1.if语句 void main() { int score = 80; if (score >= 90) { print('优秀'); } else if (s ...
- 【数位dp+状压】XHXJ 's LIS
题目 define xhxj (Xin Hang senior sister(学姐)) If you do not know xhxj, then carefully reading the enti ...
- SpringBoot2.x入门:快速创建一个SpringBoot应用
前提 这篇文章是<SpringBoot2.x入门>专辑的第2篇文章,使用的SpringBoot版本为2.3.1.RELEASE,JDK版本为1.8. 常规的套路会建议使用Spring官方提 ...
- JavaScript图形实例:Koch曲线
Koch曲线的构造过程是:取一条长度为L0的直线段,将其三等分,保留两端的线段,将中间的一段改换成夹角为60度的两个等长直线:再将长度为L0/3的4个直线段分别进行三等分,并将它们中间的一段均改换成夹 ...
- 以api文档为中心--前后端分开发离新思维
api文档编写好像很简单,其实不是.一个良好的api文档,需要就有以下内容:接口详细描述,接口参数详细描述,接口返回结果详细描述,容易理解的范例.这些内容其实是不少的,编写过程中还非常单调乏味.再加上 ...
- [POJ3613] Cow Relays(Floyd+矩阵快速幂)
解题报告 感觉这道题gyz大佬以前好像讲过一道差不多的?然鹅我这个蒟蒻发现矩阵快速幂已经全被我还给老师了...又恶补了一遍,真是恶臭啊. 题意 给定一个T(2 <= T <= 100)条边 ...
- HDU - 5970 题解
题目链接 HDU - 5970 分析 很显然\(f(x,y)\)与\(f(x+y*k,y)\)的结果相同,因为它们在第一次取模后会变成相同的式子 我们再看一下数据的范围,突破口肯定在\(m\)那里 那 ...
- 配置类需要标注@Configuration却不知原因?那这次就不能给你涨薪喽
专注Java领域分享.成长,拒绝浅尝辄止.关注公众号[BAT的乌托邦]开启专栏式学习,拒绝浅尝辄止.本文 https://www.yourbatman.cn 已收录,里面一并有Spring技术栈.My ...