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

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

牛津计划的API是由一个基础Url、服务名称、参数组成为的服务,大多是POST(我还没有完全看完),这些参数多是字符串,但也有流格式(比如上传图片什么的),我们的ProjecToxfordClientHelper就是计划将牛津API的实现进行封装,为我们不同的APIController提供服务。
我们先定义一些基本的字段

private const string serviceHost = "https://api.projectoxford.ai/face/v1.0";
private const string KEY = "";
private HttpClient client;
private static string photofolder = System.Configuration.ConfigurationManager.AppSettings["ProjecToxfordPhotos"];

serviceHost就是牛津的API,KEY你可以通过注册牛津开发计划来获得,photofolder是保持我们需要上传图所在的位置。
我们在构造函数中初始化HttpClient,为HttpClient添加两个必须的头标识。

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);
    }
}

所谓的字符串参数就是将实现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 response.Content.ReadAsStringAsync();
        return new ProjecToxfordResponseModels(msg, response.StatusCode);
    }
}

看下参数,流格式的内容需要以Byte数组的方式进行传递,但实际的处理中没有什么太大的不同,如果传递的是Byte数组就直接处理,否则先序列化为Byte数组,但是要注意的是,流媒体的json的编码是不同的,

Created with Raphaël 2.1.0 开始 is byte array? byetArray To Content is byte array? application/octet-stream End application/json JSON SerialzeObj getBytes yes no yes no

我们再提供一个帮助处理牛津API返回值的方法

public HttpResponseMessage CreateHttpResponseMessage(HttpRequestMessage request, ProjecToxfordResponseModels result)
{
    if (result.StatusCode == HttpStatusCode.OK)
    {
 return request.CreateResponse(HttpStatusCode.OK, result.Message);
    }
    else
    {
 return request.CreateErrorResponse(result.StatusCode, result.Message);
    }
}

你可能感兴趣的:(api)