https://www.cnblogs.com/cxd1008/p/6640015.html

今天来写一下后台C#代码如何访问webapi 这里使用HttpClient方法访问webapi也是很常用的方法。

因为我在是webapi项目里直接写的,为了方便就直接读取了当前地址,代码包括 webapi的所有用法【Getstring GetClass GetListClass Post put Delete】。

代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
//后台client方式GET提交
HttpClient myHttpClient = new HttpClient();
//提交当前地址的webapi
string url = "http://" + System.Web.HttpContext.Current.Request.Url.Host + ":" + System.Web.HttpContext.Current.Request.Url.Port.ToString();
myHttpClient.BaseAddress = new Uri(url);
//GET提交 返回string
HttpResponseMessage response = myHttpClient.GetAsync("api/ApiDemo/Get2").Result;
string result = "";
if (response.IsSuccessStatusCode)
{
    result = response.Content.ReadAsStringAsync().Result;
}
//return Content(JsonConvert.SerializeObject(result));
 
Product product = null;
//GET提交 返回class
response = myHttpClient.GetAsync("api/ProductsAPI/GetProduct/1").Result;
if (response.IsSuccessStatusCode)
{
    product = response.Content.ReadAsAsync<Product>().Result;
}
//return Content (JsonConvert.SerializeObject(product));
 
//put 提交 先创建一个和webapi对应的类           
var content = new FormUrlEncodedContent(new Dictionary<stringstring>()
    {
        {"Id","2"},
        {"Name","Name:"+DateTime.Now.ToString() },
        {"Category","111"},
        {"Price","1"}
     });
response = myHttpClient.PutAsync("api/ProductsAPI/PutProduct/2", content).Result;
if (response.IsSuccessStatusCode)
{
    result = response.Content.ReadAsStringAsync().Result;
}
 
 
//post 提交 先创建一个和webapi对应的类
content = new FormUrlEncodedContent(new Dictionary<stringstring>()
    {
        {"Id","382accff-57b2-4d6e-ae84-a61e00a3e3b5"},
        {"Name","Name" },
        {"Category","111"},
        {"Price","1"}
     });
response = myHttpClient.PostAsync("api/ProductsAPI/PostProduct", content).Result;
if (response.IsSuccessStatusCode)
{
    result = response.Content.ReadAsStringAsync().Result;
}
//delete 提交
response = myHttpClient.DeleteAsync("api/ProductsAPI/DeleteProduct/1").Result;
if (response.IsSuccessStatusCode)
{
    result = response.Content.ReadAsStringAsync().Result;
}
 
//GET提交 返回List<class>
response = myHttpClient.GetAsync("api/ProductsAPI/GetAllProducts").Result;
List<Product> listproduct = new List<Models.Product>();
if (response.IsSuccessStatusCode)
{
    listproduct = response.Content.ReadAsAsync<List<Product>>().Result;
}
return Content(JsonConvert.SerializeObject(listproduct));

  

/// <summary>
/// url请求
/// </summary>
/// <param name="type"></param>
/// <param name="paramData"></param>
/// <returns></returns>
private static string WebRequest(string method, string type, string paramData)
{
string apiUrl = "http://" + ConfigHelper.GetBaseUrl("url") + "/Session";
apiUrl = apiUrl.EndsWith("/") ? apiUrl : apiUrl + "/"; string postUrl = string.Empty;
if (type == "Get" || type == "Delete")
{
postUrl = apiUrl + method + "?" + paramData;
}
else
{
postUrl = apiUrl + method;
}
LogWriter.ToDebug(postUrl);
string ret = string.Empty; byte[] byteArray = System.Text.Encoding.UTF8.GetBytes(paramData);
System.Net.HttpWebRequest webReq = (System.Net.HttpWebRequest)System.Net.WebRequest.Create(new Uri(postUrl));
webReq.Method = type;
switch (type)
{
case "Post":
{
webReq.ContentLength = byteArray.Length;
webReq.ContentType = "application/json";
System.IO.Stream newStream = webReq.GetRequestStream();
newStream.Write(byteArray, 0, byteArray.Length); //写入参数
newStream.Close();
}
break;
case "Put":
{
webReq.ContentLength = byteArray.Length;
webReq.ContentType = "application/x-www-form-urlencoded";
System.IO.Stream newStream = webReq.GetRequestStream();
newStream.Write(byteArray, 0, byteArray.Length); //写入参数
newStream.Close();
}
break;
} using (System.Net.HttpWebResponse response = (System.Net.HttpWebResponse)webReq.GetResponse())
{
System.IO.StreamReader sr = new System.IO.StreamReader(response.GetResponseStream(), System.Text.Encoding.UTF8);
ret = sr.ReadToEnd();
sr.Close();
} return ret;
}

  

c#调用webapi post list
折腾了半天,最后用这种方式解决了。上面那种还是不会。
//请求路径
string url = "http://localhost:3063/api/Blog/SetTopNo"; //定义request并设置request的路径
WebRequest request = WebRequest.Create(url);
request.Method = "post"; //初始化request参数
string postData = "[{\"TopNo\": \"22\",\"CategoryId\": \"1\",\"BlogId\": \"1723\"}, {\"TopNo\": \"12\",\"CategoryId\": \"2\",\"BlogId\":\"1723\"}]"; //设置参数的编码格式,解决中文乱码
byte[] byteArray = Encoding.UTF8.GetBytes(postData); //设置request的MIME类型及内容长度
request.ContentType = "application/json";
request.ContentLength = byteArray.Length; //打开request字符流
Stream dataStream = request.GetRequestStream();
dataStream.Write(byteArray, 0, byteArray.Length);
dataStream.Close(); //定义response为前面的request响应
WebResponse response = request.GetResponse();

  

问题:c#后台调用webapi接口,后面用webrequest虽然解决了传复杂类型的问题,但是写起来麻烦,还是想用httpclient,经过打断点查看header,查阅资料,加班终于搞定

var postData = new
{
Title = title,
Content = JsonConvert.SerializeObject(contentJson),
PublishFlag = "0",//发布标记:1已发布,0未发布 跟游记保持一至
LongArticle = longArticle,//复杂类型
};
var content = new StringContent(JsonConvert.SerializeObject(postData));//用的StringContent 之前用的FormUrlEncodedContent
content.Headers.ContentType = new MediaTypeHeaderValue("application/json");//关键 HttpClient httpClient = GetUseHttpClient();
//编辑,新增接口不一样
var url = "api/Blog/PublishLongArticle";
if (request.blogid!=null&&request.blogid.Trim().Length > 0)
{
url = "api/Blog/EditLongArticle";
}
var apiResponse = httpClient.PostAsync(url, content).Result; if (apiResponse.IsSuccessStatusCode)

  

本文为博主原创文章,欢迎转载,但转载须注在明显位置注明【博客地址】和【原文地址】,否则将追究法律责任。http://www.cnblogs.com/cxd1008

WebApi(6) 后台C#调用WebApi的更多相关文章

  1. WebApi接口 - 如何在应用中调用webapi接口

    很高兴能再次和大家分享webapi接口的相关文章,本篇将要讲解的是如何在应用中调用webapi接口:对于大部分做内部管理系统及类似系统的朋友来说很少会去调用别人的接口,因此可能在这方面存在一些困惑,希 ...

  2. 调用webapi 错误:使用 HTTP 谓词 POST 向虚拟目录发送了一个请求,而默认文档是不支持 GET 或 HEAD 以外的 HTTP 谓词的静态文件。的解决方案

    第一次调用webapi出错如下: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http:// ...

  3. 跨域调用webapi

    web端跨域调用webapi   在做Web开发中,常常会遇到跨域的问题,到目前为止,已经有非常多的跨域解决方案. 通过自己的研究以及在网上看了一些大神的博客,写了一个Demo 首先新建一个webap ...

  4. Web API应用架构在Winform混合框架中的应用(3)--Winfrom界面调用WebAPI的过程分解

    最近一直在整合WebAPI.Winform界面.手机短信.微信公众号.企业号等功能,希望把它构建成一个大的应用平台,把我所有的产品线完美连接起来,同时也在探索.攻克更多的技术问题,并抽空写写博客,把相 ...

  5. 跨域调用webapi web端跨域调用webapi

    web端跨域调用webapi   在做Web开发中,常常会遇到跨域的问题,到目前为止,已经有非常多的跨域解决方案. 通过自己的研究以及在网上看了一些大神的博客,写了一个Demo 首先新建一个webap ...

  6. web端跨域调用webapi

    在做Web开发中,常常会遇到跨域的问题,到目前为止,已经有非常多的跨域解决方案. 通过自己的研究以及在网上看了一些大神的博客,写了一个Demo 首先新建一个webapi的程序,如下图所示: 由于微软已 ...

  7. QuickWebApi2:使用Lambda方式,完成对WebApi的开发和调用-文档的生成

    续 QuickWebApi:使用Lambda方式,完成对WebApi的开发和调用 上一篇完成了主要的功能,本次修订主要重构了对接口文档的生成规范,使之可读性更佳,甚至可以作为接口文档进行发布(当然,在 ...

  8. QuickWebApi:使用Lambada方式,完成对WebApi的开发和调用。

    QuickWebApi 目的:使用Lambada方式,完成对WebApi的开发和调用. 缘由:为了解耦服务和展现,将越来越多的使用WebApi提供各种服务:随着服务的细化,WebApi的接口将越来越多 ...

  9. 跨域学习笔记1--跨域调用webapi

    在做Web开发中,常常会遇到跨域的问题,到目前为止,已经有非常多的跨域解决方案. 通过自己的研究以及在网上看了一些大神的博客,写了一个Demo 首先新建一个webapi的程序,如下图所示: 由于微软已 ...

随机推荐

  1. 【JS】jQuery设置定时器,访问服务器(PHP示例)配合微信、支付宝原生支付,跳转web网页

    废话不多说,直接上代码: 把下面的js放在html的</body>即可 <!-- 设置页面定时器,3秒查询一次数据库该订单状态,ok就跳走 --xzz1115> <scr ...

  2. 在where子句中经常使用的运算符

    比较运算符 >   <   <=   >=   =    <> 大于.小于.大于(小于)等于.不等于 BETWEEN  ...AND... 显示在某一区间的值 IN ...

  3. 深入理解Android的密度独立性

    前言 安卓是一个只对硬件设备限制有很少限制的移动操作系统.生产商们几乎可以创造任何形状的.尺寸的和密度的屏幕的设备.设备可以有物理键盘和按钮或者只有虚 拟键盘和按钮.由于它的设备客制化的自由性给软件开 ...

  4. Tsung运行环境安装(转)

    转自:http://www.cnblogs.com/tsbc/p/4272974.html#_Toc372013359 tsung Tsung运行环境安装 检查安装一下依赖包,以免在安装的时候报错.( ...

  5. javascript 打印错误信息 catch err

    使用 console.log(err); 是无法打印出来的.默认只能打印出错误信息.如图 http.interceptors.response.use(response => { return ...

  6. 又是一年WWDC,暨回想去年之旅——Part III

    前言 无论这篇写到哪里,就以这篇作为结尾,结束这个流水回想系列文了. Computer History Museum 计算机历史博物馆(站点)是在Google旁边,參观Google之前的行程. 记得那 ...

  7. vim插件管理利器

    一.pathogen简介 通常情况下安装vim插件,通常是将所有的插件和相关的doc文件都安装在中一文件夹中,如将插件全部安装在/usr/share/vim/vim73/plugin/目录下,将帮助文 ...

  8. 如何使用VIM的列编辑模式 [转]

    如何使用VIM的列编辑模式? * windows 我使用的VIM FOR WINDOWS,一直都听说VIM有列编辑模式,一直没有使用过,试了几次都失败了.今天又因为工作需要,到网上查了一下,经过不断的 ...

  9. 安装wxWidgets遭遇的两大关卡

    早就想体验wxWidgets.这学期的C++课,课时还算充裕.关键是弟子们的实践能跟得上,我希望能让他们也浅尝一把GUI开发. MFC能够选.但既然IDE都用CodeBlocks了.还是选wxWidg ...

  10. Jmeter测试带加密参数的接口

    在做接口测试时,很多时候我们都会碰到带有加密参数的接口,这种接口一般来讲都会有统一的加密方法,找开发要就好,Jmeter怎么去测呢 1.整体结构如下所示: 2.操作步骤 (1)将加密方法打成jar包放 ...