说明

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

使用 C# 进行 HTTP 操作的更多相关文章

  1. 关于DOM的操作以及性能优化问题-重绘重排

     写在前面: 大家都知道DOM的操作很昂贵. 然后贵在什么地方呢? 一.访问DOM元素 二.修改DOM引起的重绘重排 一.访问DOM 像书上的比喻:把DOM和JavaScript(这里指ECMScri ...

  2. Sql Server系列:分区表操作

    1. 分区表简介 分区表在逻辑上是一个表,而物理上是多个表.从用户角度来看,分区表和普通表是一样的.使用分区表的主要目的是为改善大型表以及具有多个访问模式的表的可伸缩性和可管理性. 分区表是把数据按设 ...

  3. C# ini文件操作【源码下载】

    介绍C#如何对ini文件进行读写操作,C#可以通过调用[kernel32.dll]文件中的 WritePrivateProfileString()和GetPrivateProfileString()函 ...

  4. js学习笔记:操作iframe

    iframe可以说是比较老得话题了,而且网上也基本上在说少用iframe,其原因大致为:堵塞页面加载.安全问题.兼容性问题.搜索引擎抓取不到等等,不过相对于这些缺点,iframe的优点更牛,跨域请求. ...

  5. jquery和Js的区别和基础操作

    jqery的语法和js的语法一样,算是把js升级了一下,这两种语法可以一起使用,只不过是用jqery更加方便 一个页面想要使用jqery的话,先要引入一下jqery包,jqery包从网上下一个就可以, ...

  6. ASP.NET Aries 入门开发教程7:DataGrid的行操作(主键操作区)

    前言: 抓紧勤奋,再接再励,预计共10篇来结束这个系列. 上一篇介绍:ASP.NET Aries 入门开发教程6:列表数据表格的格式化处理及行内编辑 本篇介绍主键操作区相关内容. 1:什么时候有默认的 ...

  7. 如何在高并发环境下设计出无锁的数据库操作(Java版本)

    一个在线2k的游戏,每秒钟并发都吓死人.传统的hibernate直接插库基本上是不可行的.我就一步步推导出一个无锁的数据库操作. 1. 并发中如何无锁. 一个很简单的思路,把并发转化成为单线程.Jav ...

  8. 【翻译】MongoDB指南/CRUD操作(四)

    [原文地址]https://docs.mongodb.com/manual/ CRUD操作(四) 1 查询方案(Query Plans) MongoDB 查询优化程序处理查询并且针对给定可利用的索引选 ...

  9. 【翻译】MongoDB指南/CRUD操作(三)

    [原文地址]https://docs.mongodb.com/manual/ CRUD操作(三) 主要内容: 原子性和事务(Atomicity and Transactions),读隔离.一致性和新近 ...

  10. 【翻译】MongoDB指南/CRUD操作(二)

    [原文地址]https://docs.mongodb.com/manual/ MongoDB CRUD操作(二) 主要内容: 更新文档,删除文档,批量写操作,SQL与MongoDB映射图,读隔离(读关 ...

随机推荐

  1. CentOS7版本的新特性

    综述 XFS  比 EXT 4更适合大文件处理,但消耗的CPU资源是EXT4的两倍 XFS 最大支持单文件16TB ,EXT4:50TB 最小1GB/建议每个逻辑CPU 1GB 逻辑CPU:核数,而非 ...

  2. MySQL下做Master/Slave同步,延迟太大怎么办?

    slave的延迟是比较常见的,如果短暂的延迟后还能追上,一般就能接受了.   用innodb不是坏事,会减少一些slave中止的情况.如果是myisam的表,insert update delete操 ...

  3. [luoguP2870] [USACO07DEC]最佳牛线,黄金Best Cow Line, Gold(后缀数组)

    传送门 数据小的话贪心就行. 可以把这个串翻转再接到后面,再求后缀数组,求出 rank 数组就很简单了. ——代码 #include <cstdio> #include <iostr ...

  4. noip模拟赛 三部曲

    分析:子树上操作,要用到线段树+dfs序,关键就是子树内k还要增加,这个就不是很好办.可以求出在根节点+0后每个点会加多少,记为d[i],如果要对点x进行A操作,实际上只需要对子树加k - d[i]再 ...

  5. UE 高亮 一个或多个关键字的方法

    #######2014-11-20,11:13:06######### 一.高亮一个关键字 方法1: 选中该关键字, Ctrl + .   即可: 方法2: 选中该关键字, Shift  + 双击左键 ...

  6. js移除style属性

    这个属性是通过   div.style.color="red"   这种类似添加的,想要添加重置函数,使用div.removeAttribute("style" ...

  7. ZooKeeper配置文件常用配置项一览表(转)

     配置参数详解(主要是$ZOOKEEPER_HOME/conf/zoo.cfg文件) 参数名 说明 clientPort 客户端连接server的端口,即对外服务端口,一般设置为2181吧. data ...

  8. N天学习一个Linux命令之hostnamectl

    前言 安装了CentOS7,发现按照以前修改文件/etc/sysconfig/network HOSTNAME字段主机名的方式不生效了,查资料发现可以使用hostnamectl命令 用途 Contro ...

  9. PHP array_diff_key()

    定义和用法 array_diff_key() 函数返回一个数组,该数组包括了所有在被比较的数组中,但是不在任何其他参数数组中的键. 语法 array_diff_key(array1,array2,ar ...

  10. HDU 5288

    //枚举因子,查找和i最近的左右是i因子的点即可. #include <iostream> #include <cstdio> #include <algorithm&g ...