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通过替换的方式删掉。