using System;
using System.Collections.Generic;
using System.IO;
using System.Net;
using System.Text;
namespace Common
{
public static class HttpHelper
{
public static string PostJson(string url, string json, Dictionary<string, string> headers = null)
{
var request = (HttpWebRequest)WebRequest.Create(url);
request.Method = "POST";
request.ContentType = "application/json";
if (headers != null)
{
foreach (var header in headers)
{
if (string.Equals(header.Key, "Accept", StringComparison.OrdinalIgnoreCase))
{
request.Accept = header.Value;
}
else if (string.Equals(header.Key, "User-Agent", StringComparison.OrdinalIgnoreCase))
{
request.UserAgent = header.Value;
}
else if (string.Equals(header.Key, "Content-Type", StringComparison.OrdinalIgnoreCase))
{
request.ContentType = header.Value;
}
else
{
request.Headers[header.Key] = header.Value;
}
}
}
byte[] postBytes = Encoding.UTF8.GetBytes(json);
using (Stream stream = request.GetRequestStream())
{
stream.Write(postBytes, 0, postBytes.Length);
}
using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
{
using (StreamReader sr = new StreamReader(response.GetResponseStream()))
{
return sr.ReadToEnd();
}
}
}
public static string PostMutipartFormData(string url, string jsonData, List<Files> files, Dictionary<string, string> headers = null)
{
var request = (HttpWebRequest)WebRequest.Create(url);
request.Method = "POST";
request.KeepAlive = true;
request.Accept = "application/json";
if (headers != null)
{
foreach (var header in headers)
{
if (string.Equals(header.Key, "Accept", StringComparison.OrdinalIgnoreCase))
{
request.Accept = header.Value;
}
else if (string.Equals(header.Key, "User-Agent", StringComparison.OrdinalIgnoreCase))
{
request.UserAgent = header.Value;
}
else if (string.Equals(header.Key, "Content-Type", StringComparison.OrdinalIgnoreCase))
{
request.ContentType = header.Value;
}
else
{
request.Headers[header.Key] = header.Value;
}
}
}
string boundary = "---" + DateTime.Now.Ticks.ToString("x");
request.ContentType = "multipart/form-data;boundary=" + boundary;
string retMsg = string.Empty;
using (Stream requestStream = request.GetRequestStream())
using (StreamWriter write = new StreamWriter(requestStream))
{
write.WriteLine($"--{boundary}");
write.WriteLine($"Content-Disposition: form-data;name=\"refundDatasas\"");
write.WriteLine($"Content-Type:application/json");
write.WriteLine(jsonData);
write.Flush();
foreach (var file in files)
{
var bt = Encoding.UTF8.GetBytes(file.fileStream);
write.WriteLine($"--{boundary}");
write.WriteLine($"Content-Disposition: form-data;name=\"files\";filename=\"{file.fileName}\"");
write.WriteLine($"Content-Type: " + GetMimeType(file.fileName));
write.WriteLine();
write.Flush();
requestStream.Write(bt, 0, bt.Length);
write.WriteLine();
write.Flush();
}
write.WriteLine($"--{boundary}-");
write.Flush();
}
try
{
using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
{
Console.WriteLine($"Status:{response.StatusCode}");
using (StreamReader reader = new StreamReader(response.GetResponseStream()))
{
var responseBody = reader.ReadToEnd();
retMsg = responseBody;
Console.WriteLine($"Response:{responseBody}");
}
}
}
catch (WebException ex)
{
if (ex.Response is HttpWebResponse errorResponse)
{
Console.WriteLine($"HTTP Error:{errorResponse.StatusCode}");
using (var reader = new StreamReader(errorResponse.GetResponseStream()))
{
var responseBody = reader.ReadToEnd();
retMsg = responseBody;
Console.WriteLine($"Error details:{responseBody}");
}
}
else
{
Console.WriteLine($"Network Error:{ex.Message}");
}
}
return retMsg;
}
private static string GetMimeType(string fileName)
{
var extension = Path.GetFileName(fileName).ToLowerInvariant();
switch (extension)
{
case ".png": return "image/png";
case ".jpg":
case ".jpeg": return "image/jpeg";
case ".pdf": return "application/pdf";
default: return "application/octet-stream";
}
}
}
}