使用 C# 进行 HTTP 操作
说明
主要使用到了 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;
}
使用 C# 进行 HTTP 操作的更多相关文章
- 关于DOM的操作以及性能优化问题-重绘重排
写在前面: 大家都知道DOM的操作很昂贵. 然后贵在什么地方呢? 一.访问DOM元素 二.修改DOM引起的重绘重排 一.访问DOM 像书上的比喻:把DOM和JavaScript(这里指ECMScri ...
- Sql Server系列:分区表操作
1. 分区表简介 分区表在逻辑上是一个表,而物理上是多个表.从用户角度来看,分区表和普通表是一样的.使用分区表的主要目的是为改善大型表以及具有多个访问模式的表的可伸缩性和可管理性. 分区表是把数据按设 ...
- C# ini文件操作【源码下载】
介绍C#如何对ini文件进行读写操作,C#可以通过调用[kernel32.dll]文件中的 WritePrivateProfileString()和GetPrivateProfileString()函 ...
- js学习笔记:操作iframe
iframe可以说是比较老得话题了,而且网上也基本上在说少用iframe,其原因大致为:堵塞页面加载.安全问题.兼容性问题.搜索引擎抓取不到等等,不过相对于这些缺点,iframe的优点更牛,跨域请求. ...
- jquery和Js的区别和基础操作
jqery的语法和js的语法一样,算是把js升级了一下,这两种语法可以一起使用,只不过是用jqery更加方便 一个页面想要使用jqery的话,先要引入一下jqery包,jqery包从网上下一个就可以, ...
- ASP.NET Aries 入门开发教程7:DataGrid的行操作(主键操作区)
前言: 抓紧勤奋,再接再励,预计共10篇来结束这个系列. 上一篇介绍:ASP.NET Aries 入门开发教程6:列表数据表格的格式化处理及行内编辑 本篇介绍主键操作区相关内容. 1:什么时候有默认的 ...
- 如何在高并发环境下设计出无锁的数据库操作(Java版本)
一个在线2k的游戏,每秒钟并发都吓死人.传统的hibernate直接插库基本上是不可行的.我就一步步推导出一个无锁的数据库操作. 1. 并发中如何无锁. 一个很简单的思路,把并发转化成为单线程.Jav ...
- 【翻译】MongoDB指南/CRUD操作(四)
[原文地址]https://docs.mongodb.com/manual/ CRUD操作(四) 1 查询方案(Query Plans) MongoDB 查询优化程序处理查询并且针对给定可利用的索引选 ...
- 【翻译】MongoDB指南/CRUD操作(三)
[原文地址]https://docs.mongodb.com/manual/ CRUD操作(三) 主要内容: 原子性和事务(Atomicity and Transactions),读隔离.一致性和新近 ...
- 【翻译】MongoDB指南/CRUD操作(二)
[原文地址]https://docs.mongodb.com/manual/ MongoDB CRUD操作(二) 主要内容: 更新文档,删除文档,批量写操作,SQL与MongoDB映射图,读隔离(读关 ...
随机推荐
- C# 通俗说 内存的理解
一.概念 堆栈是什么? 在说堆栈之前,先说说内存是神马? 内存:程序在运行的过程,电脑需要不断通过CPU进行计算,这个计算的过程会读取并产生运算的数据,这些数据需要一个存储容器存放.这个容器,这就是内 ...
- vue组件 $children,$refs,$parent的使用详解
1)$refs 首先你的给子组件做标记.demo :<firstchild ref="one"></firstchild> 然后在父组件中,通过this.$ ...
- Linux学习总结(13)——在阿里云的ubuntu上部署个人服务
作为一个IT界的人,一般都希望有一个独立的博客,或者一部独立的机器.所以我一直在找机会,拥有一台自己可以独立控制的机器,自己想干嘛干嘛.当然这在虚拟机或者自己的PC上面也可以实现,但是这跟一台一直开着 ...
- Java8新特性之forEach遍历
参考文章: https://www.cnblogs.com/billyu/p/6118008.html
- [bzoj3694]最短路_树链剖分_线段树
最短路 bzoj-3694 题目大意:给你一个n个点m条边的无向图,源点为1,并且以点1为根给出最短路树.求对于2到n的每个点i,求最短路,要求不经过给出的最短路树上的1到i的路径上的最后一条边. 注 ...
- OceanBase架构浅析(一)
简介 OceanBase是阿里集团研发的可扩展的关系数据库,实现了数千亿条记录.数百TB数据上的跨行跨表事务,截止到2012年8月,支持了收藏夹.直通车报表.天猫评价等OLTP和OLAP在线业务,线上 ...
- F1: A Distributed SQL Database That Scales GOOGLE F1 论文
http://research.google.com/pubs/pub41344.html http://research.google.com/pubs/pub36726.html
- Android:让Link始终保持在程序的WebView中跳转
在Android的WebView中,当点击调用网页的链接时,默认的动作是跳转到系统设定的默认浏览器中.如果想让链接始终在当前WebView中跳转的话,就需要添加以下代码: WebView webVie ...
- oracle加入联合主键
alter table tablename add constraint unionkeyname primary key (column1,column2); 上面语句中: tablename为要加 ...
- 【Geforce】关于如何在Geforce Experience中登录
相信不少人无法登录这个该死的Geforce Experience.这里提供几个解决方案: 1.在“服务”中启动运行 NVIDIA NetworkService Container 方式改为手动或者自动 ...