说明
主要使用到了 Newtonsoft.Json
和 System.Net
两个命名空间。
Program.cs
static void Main(string[] args)
{
WebOpertor web = new WebOpertor("http://localhost:13055/");
dynamic get = web.Get("api/hello", null);
Console.WriteLine(get);
Console.WriteLine("-----");
dynamic get1 = web.Get("api/hello", new { id = "1" });
Console.WriteLine(get1);
Console.WriteLine("-----");
dynamic post = web.Post("api/hello", "aaa");
Console.WriteLine(post);
Console.ReadKey();
// output
// [
// "value1",
// "value2"
// ]
// -----
// get
// -----
// post
}
API
创建一个 web api 项目时自带的模板,用于测试是够了
//...
// GET api/<controller>
public IEnumerable<string> Get()
{
return new string[] { "value1", "value2" };
}
// GET api/<controller>/5
public string Get(int id)
{
return "get";
}
// POST api/<controller>
public string Post([FromBody]string value)
{
return "post";
}
WebOpertor.cs
private string _host { get; set; }
public WebOpertor(string host)
{
this._host = host;
}
public dynamic Post(string api, dynamic parma);
public dynamic Get(string api, dynamic parma);
private string EscapeUrl(string url, dynamic param);
Post
public dynamic Post(string api, dynamic parma)
{
byte[] bytes = Encoding.UTF8.GetBytes(parma);
string url = Path.Combine(this._host, api);
WebRequest request = WebRequest.Create(url);
request.Method = "Post";
request.ContentType = "application/x-www-form-urlencoded"; //System.Net.WebException: “远程服务器返回错误: (415) Unsupported Media Type。”
request.ContentLength = bytes.Length;
//Data
request.GetRequestStream().Write(bytes, 0, bytes.Length);
using (WebResponse response = request.GetResponse())
{
Stream stream = response.GetResponseStream();
string json = new StreamReader(stream).ReadToEnd();
try
{
return JsonConvert.DeserializeObject(json);//转化为对象
}
catch
{
return json;//无法转换,说明是 HTML (大概是吧...)
}
}
}
Get
public dynamic Get(string api, dynamic parma)
{
string url = EscapeUrl(Path.Combine(this._host, api), parma);
WebRequest request = WebRequest.Create(url);
request.Method = "Get";
using (WebResponse response = request.GetResponse())
{
//获取服务器返回内容
Stream stream = response.GetResponseStream();
string json = new StreamReader(stream).ReadToEnd();
try
{
return JsonConvert.DeserializeObject(json);
}
catch
{
return json;
}
}
}
/// <summary>
/// 将 URL 与匿名类组成一个标准的 GET 请求
/// </summary>
private string EscapeUrl(string url, dynamic param)
{
if (param == null)
return url;
List<string> listParam = new List<string>();
var properties = param.GetType().GetProperties();
foreach (var item in properties)
{
var val = item.GetValue(param, null);
if (val == null)
listParam.Add(item.Name + "=");
else
listParam.Add(item.Name + "=" + Uri.EscapeDataString(val.ToString()));
}
string ps = string.Join("&", listParam);
return url + "?" + ps;
}