说明

主要使用到了 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. JavaScript单元测试工具-Jest

    标注: 首先这并不是一篇完整的关于Jest的教程,只是个人在接触jest学习的一点随手笔记,大部分内容都是对官方文档的一些翻译. ----------------------------------- ...

  2. noip模拟赛 SAC E#1 - 一道中档题 Factorial

    题目背景 数据已修改 SOL君(炉石主播)和SOL菌(完美信息教室讲师)是好朋友. 题目描述 SOL君很喜欢阶乘.而SOL菌很喜欢研究进制. 这一天,SOL君跟SOL菌炫技,随口算出了n的阶乘. SO ...

  3. springCloud学习-高可用的分布式配置中心(Spring Cloud Config)

    1.简介 高可用的分布式配置中心,即将配置中心做成一个微服务,将其集群化,从而达到高可用.config-server和config-client向eureka-server注册,且将config-se ...

  4. Ubuntu 17.10安装phpMyAdmin数据库管理工具

      和Windows下各种双击安装直接使用的数据库管理工具不同,Linux下的数据库管理工具显得有些稍稍复杂.由于版权和收费限制,很多好用的数据库管理工具例如Data Grip和Navicat不能直接 ...

  5. Clojure:两步发送iOS推送通知(apns)

    首先在project.clj中,添加对notnoop 类库的引用:[com.notnoop.apns/apns "0.2.3"] 然后使用如下方法就可以发送推送消息了: (ns d ...

  6. HDU 4508

    祼的完全背包问题 #include <iostream> #include <cstdio> #include <cstring> #include <alg ...

  7. 阿伦 凯 Alan Kay 面向对象编程思想创始人

    The best way to predict the future is to invent it. 预测未来最好的办法就是创造它.

  8. Python自定义钉钉机器人发送自动化结果报告

    环境python3.5+jenkins # coding:utf-8 import urllib.request import json import sys import time import r ...

  9. Linux线程池在server上简单应用

    一.问题描写叙述 如今以C/S架构为例.client向server端发送要查找的数字,server端启动线程中的线程进行对应的查询.将查询结果显示出来. 二.实现方案 1. 整个project以cli ...

  10. DCloud-MUI:utils

    ylbtech-DCloud-MUI:utils 1.返回顶部 1.init mui框架将很多功能配置都集中在mui.init方法中,要使用某项功能,只需要在mui.init方法中完成对应参数配置即可 ...