说明

主要使用到了 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. 解决WP程序 重复打开出现 “正在加载...” 字样 解决方案

    在开发winphone程序时候 我们经常遇到调试.在调试的时候 可能会重复打开 debug一下.可是有时候 经常遇到 "正在加载...."字样.而且很慢.效率很低. 测试发现 在 ...

  2. 【MariaDB】MariaDB vs MySQL - 特性

    原文链接: https://mariadb.com/kb/en/mariadb-vs-mysql-features/ xiaomo译------ 支持更多的存储引擎 除了标配的MyISAM, BLAC ...

  3. CodeForces - 357D - Xenia and Hamming

    先上题目: D. Xenia and Hamming time limit per test 1 second memory limit per test 256 megabytes input st ...

  4. 20180530利用Maxwell组件实时监听Mysql的binlog日志

    转自:https://blog.csdn.net/qq_30921461/article/details/78320750 http://kafka.apache.org/quickstart htt ...

  5. hdu_1038_Biker's Trip Odometer_201311021643

    Biker's Trip Odometer Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Ot ...

  6. CODEVS——T 1036 商务旅行

    http://codevs.cn/problem/1036/  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond 题解       题目描述 Descript ...

  7. Linux环境变量设置中配置文件分析(/etc/profile,~/.bashrc等)(转)

    说明:在研究中发现,对于不同版本的Linux系统有着不同的文件,但是总的入口是不变的/etc/profile,下面只是展示加载顺序的研究过程,所以会有些系统没有这个文件等问题. 一.配置文件与作用域: ...

  8. mongodb之存储引擎

    前言 存储引擎是Mongodb管理数据存储主要的组件,Mongodb支持多种存储引擎,每种存储引擎适合特定的场景 WiredTiger 特性 1. version >= 3.2版本默认存储引擎2 ...

  9. 在win10下改变默认的输入法切换Ctrl+Space

    在win10下改变默认的输入法切换Ctrl+Space 学习了:https://www.zhihu.com/question/22288432 在win10下面,有两种风格的控制面板设置: 在输入法上 ...

  10. HDU5567/BestCoder Round #63 (div.2) A sequence1 水

    sequence1  Given an array a with length n, could you tell me how many pairs (i,j) ( i < j ) for a ...