使用 C# 进行 HTTP 操作

说明

主要使用到了 Newtonsoft.JsonSystem.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;
}

转载于:https://www.cnblogs.com/yeshiyu/p/7296410.html

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值