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. 王立平--svnserver搭建

    1.下载 2.安装打开. 3.新建存储库. ---------------------------------- 4.新建用户. watermark/2/text/aHR0cDovL2Jsb2cuY3 ...

  2. 多对多关系数据库表 java描述

    多对多关系 需要建立一张新表存放它们的对应数据 sql语句 create table teacher( id int primary key, name ), ,) ); create table s ...

  3. CRC文件解压缩问题

    CRC问题一般有三种可能1.你的硬盘出现坏道2.你的硬盘数据线受损3.还可能是主板和内存的问题 硬盘坏道的表现硬盘使用久了就可能出现各种各样的问题,而硬盘“坏道”便是这其中最常见的问题.硬盘出现坏道除 ...

  4. Eclipse怎样连接并打开oracle等数据库?

    http://jingyan.baidu.com/article/a501d80cea3ed4ec630f5e2f.html

  5. linux实现ssh免密码登录

    linux实现ssh免密码登录 本地系统执行 ssh-keygen -t rsa 命令,生成密钥文件 在相应的目录下查看生成的密钥文件,其中:id_rsa为私钥文件,id_rsa.pub为公钥文件 本 ...

  6. struts2异常处理机制

    一.处理一般异常(javaBean异常) struts2进行异常处理首先需要添加exception拦截器,而默认拦截器栈已经加入了这个拦截器,所以不用特意的声明.在Struts 2框架中,采用声明式异 ...

  7. wget镜像网站并且下载到指定目录 2012-06-20 19:40:56

    wget镜像网站并且下载到指定目录 2012-06-20 19:40:56 分类: Python/Ruby wget -r -p -np -k -P /tmp/ap http://www.exampl ...

  8. 每日英语:Rethinking How We Watch TV

    To understand how much television could soon change, it helps to visit an Intel Corp. division here ...

  9. HDU 1863 畅通工程 克鲁斯卡尔算法

    畅通工程 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submis ...

  10. C++之extern关键字

    extern关键字 extern extern关键字的作用就是告诉编译器,它修饰的变量或者函数在别处定义. extern "C" 代码一: cppExample.h #ifndef ...