当微软牛津计划遇到微信App——服务实现部分

本文介绍了如何在微信App中结合微软牛津计划API,实现人脸识别服务。通过封装API客户端,实现了Face/Detect和Face/Verify功能,利用MongoDB存储结果以减少重复请求。同时,优化了控制器以提高效率。
摘要由CSDN通过智能技术生成

作者:王豫翔,微软连续多年多个方向的MVP,目前主要关注大数据、云技术和人工智能。在编程道路上遵循自己的“三少”“三多”原则:少讨论概念,少争论特征、少议论模型;多写代码、多做测试、多做应用。
本文为《程序员》原创文章,未经允许不得转载,更多精彩文章请订阅2016年《程序员》

微软牛津计划(Project Oxford)提供了一系列机器学习API,包含计算机视觉、语音识别和语言理解等认知服务。本文承接上期(当微软牛津计划遇到微信App ——微信实现部分),继续为大家讲解它能为微信开发带来的有趣功能。

封装微软牛津计划API客户端

牛津计划的API是由一个基础URL、服务名称、参数组成的服务,我们的ProjecToxfordClientHelper就是计划将牛津API的实现进行封装,为我们不同的APIController提供服务。KEY可以通过注册牛津开发计划来获得。

public ProjecToxfordClientHelper()
{
    client = new HttpClient();
    var queryString = HttpUtility.ParseQueryString(string.Empty);
    client.DefaultRequestHeaders.Add("ContentType", "application/json");
    client.DefaultRequestHeaders.Add("Ocp-Apim-Subscription-Key", KEY);
}

接下来,我们要实现两种POST的提交,一种是提交流参数,一种是提交字符串参数。

实现提交字符串参数的POST:

public async Task<projectoxfordresponsemodels> PostAsync(string querkey, object body, Dictionary<string, string=""> querystr = null)
{
    var queryString = HttpUtility.ParseQueryString(string.Empty);
    if (querystr != null)
    {
        foreach (var entry in querystr)
        {
            queryString[entry.Key] = entry.Value;
        }
    }
    var uri = string.Format("{0}/{1}?{2}", serviceHost, querkey, queryString);
    var jsonStr = Newtonsoft.Json.JsonConvert.SerializeObject(body);
    byte[] byteData = Encoding.UTF8.GetBytes(jsonStr);

    HttpResponseMessage response;
    using (var content = new ByteArrayContent(byteData))
    {
        content.Headers.ContentType = new MediaTypeHeaderValue("application/json");
        response = await client.PostAsync(uri, content);
        var msg = await response.Content.ReadAsStringAsync();
        return new ProjecToxfordResponseModels(msg, response.StatusCode);
    }
}</string,></projectoxfordresponsemodels>

所谓的字符串参数就是将实现Fields的对象以JSON格式序列化,然后POST给牛津API。

var jsonStr = Newtonsoft.Json.JsonConvert.SerializeObject(body);
byte[] byteData = Encoding.UTF8.GetBytes(jsonStr);

所以要记得content的内容类型要定义为:

content.Headers.ContentType = new MediaTypeHeaderValue("application/json");

那类似图片这些流文件不能采用这个方法,所以我们重载了一个方法。

public async Task<projectoxfordresponsemodels> PostAsync(string querkey, byte[] body, Dictionary<string, string=""> querystr = null)
{
    var queryString = HttpUtility.ParseQueryString(string.Empty);
    if (querystr != null)
    {
        foreach (var entry in querystr)
        {
            queryString[entry.Key] = entry.Value;
        }
    }

    var uri = string.Format("{0}/{1}?{2}", serviceHost, querkey, queryString);

    HttpResponseMessage response;
    using (var content = new ByteArrayContent(body))
    {
        content.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream");
        response = await client.PostAsync(uri, content);
        var msg = await resp
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值