旷视Face++的Api学习

1、http处理类

 public static class HttpHelper4MultipartForm
    {
        
        public class FileParameter //文件类,之后会用于判断传输的是图片路径,还是图片base64编码,还是二进制格式
        {
            public byte[] File
            {
                get;
                set;
            }
            public string FileName
            {
                get;
                set;
            }
            public string ContentType
            {
                get;
                set;
            }
            public FileParameter(byte[] file) : this(file, null)
            {
            }
            public FileParameter(byte[] file, string filename) : this(file, filename, null)
            {
            }
            public FileParameter(byte[] file, string filename, string contenttype)
            {
                this.File = file;
                this.FileName = filename;
                this.ContentType = contenttype;
            }
        }
        private static readonly Encoding encoding = Encoding.UTF8;//确定传输编码
        /// 
        /// MultipartForm请求
        /// 
        /// 服务地址
        /// 
        /// 参数
        /// 
        public static HttpWebResponse MultipartFormDataPost(string postUrl, string userAgent, Dictionary postParameters)
        {
            string text = string.Format("----------{0:N}", Guid.NewGuid());//全局标识码,将会得到----------加上以分号分隔的全局标识码,如----------250,000为啥有这么多-,我也不知道
            string contentType = "multipart/form-data; boundary=" + text;//multipart类型
            byte[] multipartFormData = HttpHelper4MultipartForm.GetMultipartFormData(postParameters, text);
            return HttpHelper4MultipartForm.PostForm(postUrl, userAgent, contentType, multipartFormData);
        }

        private static HttpWebResponse PostForm(string postUrl, string userAgent, string contentType, byte[] formData)
        {
            HttpWebRequest httpWebRequest = WebRequest.Create(postUrl) as HttpWebRequest;
            if (httpWebRequest == null)
            {
                throw new NullReferenceException("request is not a http request");
            }

            httpWebRequest.Method = "POST";//post方式
            httpWebRequest.SendChunked = false;
            httpWebRequest.KeepAlive = true;
            httpWebRequest.Proxy = null;
            httpWebRequest.Timeout = Timeout.Infinite;
            httpWebRequest.ReadWriteTimeout = Timeout.Infinite;
            httpWebRequest.AllowWriteStreamBuffering = false;
            httpWebRequest.ProtocolVersion = HttpVersion.Version11;
            httpWebRequest.ContentType = contentType;
            httpWebRequest.CookieContainer = new CookieContainer();
            httpWebRequest.ContentLength = (long)formData.Length;

            try
            {
                using (Stream requestStream = httpWebRequest.GetRequestStream())
                {
                    int bufferSize = 4096;
                    int position = 0;
                    while (position < formData.Length)
                    {
                        bufferSize = Math.Min(bufferSize, formData.Length - position);
                        byte[] data = new byte[bufferSize];
                        Array.Copy(formData, position, data, 0, bufferSize);
                        requestStream.Write(data, 0, data.Length);
                        position += data.Length;
                    }
                    requestStream.Close();
                }
            }
            catch (Exception ex)
            {
                return null;
            }

            HttpWebResponse result;
            try
            {
                result = (httpWebRequest.GetResponse() as HttpWebResponse);
            }
            catch (WebException arg_9C_0)
            {
                result = (arg_9C_0.Response as HttpWebResponse);
            }
            return result;
        }
 public static byte[] getBytePicture(string path)
        {
            Bitmap bmp = new Bitmap(path); // 图片地址
            byte[] fileImage;
            using (Stream stream1 = new MemoryStream())
            {
                bmp.Save(stream1, ImageFormat.Jpeg);
                byte[] arr = new byte[stream1.Length];
                stream1.Position = 0;
                stream1.Read(arr, 0, (int)stream1.Length);
                stream1.Close();
                fileImage = arr;
            }
            return fileImage;
        }
        public static bool CheckValidationResult(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors errors)//检查验证结果,额,,,,我觉得这里应该有其它东西要写的
        {
            return true;
        }
        /// 
        /// 从表单中获取数据
        /// 
        /// 
        /// 
        /// 
        private static byte[] GetMultipartFormData(Dictionary postParameters, string boundary)
        {
            Stream stream = new MemoryStream();
            bool flag = false;
            foreach (KeyValuePair current in postParameters)
            {
                if (flag)
                {
                    stream.Write(HttpHelper4MultipartForm.encoding.GetBytes("\r\n"), 0, HttpHelper4MultipartForm.encoding.GetByteCount("\r\n"));
                }
                flag = true;
                if (current.Value is HttpHelper4MultipartForm.FileParameter)
                {
                    HttpHelper4MultipartForm.FileParameter fileParameter = (HttpHelper4MultipartForm.FileParameter)current.Value;
                    string s = string.Format("--{0}\r\nContent-Disposition: form-data; name=\"{1}\"; filename=\"{2}\"\r\nContent-Type: {3}\r\n\r\n", new object[]
                    {
                        boundary,
                        current.Key,
                        fileParameter.FileName ?? current.Key,
                        fileParameter.ContentType ?? "application/octet-stream"
                    });
                    stream.Write(HttpHelper4MultipartForm.encoding.GetBytes(s), 0, HttpHelper4MultipartForm.encoding.GetByteCount(s));
                    stream.Write(fileParameter.File, 0, fileParameter.File.Length);
                }
                else
                {
                    string s2 = string.Format("--{0}\r\nContent-Disposition: form-data; name=\"{1}\"\r\n\r\n{2}", boundary, current.Key, current.Value);//
                    stream.Write(HttpHelper4MultipartForm.encoding.GetBytes(s2), 0, HttpHelper4MultipartForm.encoding.GetByteCount(s2));
                }
            }
            string s3 = "\r\n--" + boundary + "--\r\n";
            stream.Write(HttpHelper4MultipartForm.encoding.GetBytes(s3), 0, HttpHelper4MultipartForm.encoding.GetByteCount(s3));
            stream.Position = 0L;
            byte[] array = new byte[stream.Length];
            stream.Read(array, 0, array.Length);
            stream.Close();
            return array;
        }
    }



GetMultipartFormData
表单中获取的数据实例(以detect举例)

--multipart/form-data; boundary=----------{Guid全局标识码}
Content-Disposition: form-data; name="api_id"

api_id的值"
--multipart/form-data; boundary=----------{Guid全局标识码}
Content-Disposition: form-data; name="api_secret"

api_secret的值"
--multipart/form-data; boundary=----------{Guid全局标识码}
Content-Disposition: form-data; name="其他参数"

其他参数的值"
--multipart/form-data; boundary=----------{Guid全局标识码}
Content-Disposition: form-data; name="image_file(图片类型)"; filename="图片名字??image_file(图片类型)"
Content-Type: 请求主体的内容是如何编码 ?? application/octet-stream

图片的二进制编码
--multipart/form-data; boundary=----------{Guid全局标识码}--

。。。//这里表示一个空行,必须有这一行


 //调用示例
 //参数字典
           

 Dictionary verifyPostParameters = new Dictionary();
            verifyPostParameters.Add("api_key", “你的apikey”);
            verifyPostParameters.Add("api_secret", "你的apisecret");
            verifyPostParameters.Add("return_landmark", "1");
            verifyPostParameters.Add("return_attributes", "gender,age,smiling,headpose,facequality,blur,eyestatus,emotion,ethnicity,beauty,mouthstatus,eyegaze,skinstatus");
            verifyPostParameters.Add("calculate_all", "1");


            byte[] fileImage = HttpHelper4MultipartForm.getBytePicture(@"C:\2.jpg");
            //添加图片参数
            verifyPostParameters.Add("image_file", new HttpHelper4MultipartForm.FileParameter(fileImage, "2.jpg", "application/octet-stream"));
            HttpWebResponse verifyResponse = HttpHelper4MultipartForm.MultipartFormDataPost("https://api-cn.faceplusplus.com/facepp/v3/detect", "", verifyPostParameters);
        
            Stream str = verifyResponse.GetResponseStream();
            StreamReader str1 = new StreamReader(str);
            string xx = str1.ReadToEnd();
            JObject ja = (JObject)JsonConvert.DeserializeObject(xx);//转换为jobject格式            FaceDeteClass result1 = ja.ToObject();
      textBox1.Text += ja.ToString();//将结果转换为string格式

json类生成方法,把string结果输入到这个网址https://www.bejson.com/convert/json2csharp/

然后可以生成c#类,准确率挺高的,就是里面一堆垃圾代码注释,得用word通过替换的方式删掉。

你可能感兴趣的:(旷视Face++的Api学习)