WebApi(6) 后台C#调用WebApi
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 = newHttpClient();//提交当前地址的webapistringurl = "http://"+ System.Web.HttpContext.Current.Request.Url.Host + ":"+ System.Web.HttpContext.Current.Request.Url.Port.ToString();myHttpClient.BaseAddress = newUri(url);//GET提交 返回stringHttpResponseMessage response = myHttpClient.GetAsync("api/ApiDemo/Get2").Result;stringresult = "";if(response.IsSuccessStatusCode){    result = response.Content.ReadAsStringAsync().Result;}//return Content(JsonConvert.SerializeObject(result));Product product = null;//GET提交 返回classresponse = myHttpClient.GetAsync("api/ProductsAPI/GetProduct/1").Result;if(response.IsSuccessStatusCode){    product = response.Content.ReadAsAsync<Product>().Result;}//return Content (JsonConvert.SerializeObject(product));//put 提交 先创建一个和webapi对应的类           varcontent = newFormUrlEncodedContent(newDictionary<string, string>()    {        {"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 = newFormUrlEncodedContent(newDictionary<string, string>()    {        {"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 = newList<Models.Product>();if(response.IsSuccessStatusCode){    listproduct = response.Content.ReadAsAsync<List<Product>>().Result;}returnContent(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)
WebApi(6) 后台C#调用WebApi的更多相关文章
- WebApi接口 - 如何在应用中调用webapi接口
		很高兴能再次和大家分享webapi接口的相关文章,本篇将要讲解的是如何在应用中调用webapi接口:对于大部分做内部管理系统及类似系统的朋友来说很少会去调用别人的接口,因此可能在这方面存在一些困惑,希 ... 
- 调用webapi 错误:使用 HTTP 谓词 POST 向虚拟目录发送了一个请求,而默认文档是不支持 GET 或 HEAD 以外的 HTTP 谓词的静态文件。的解决方案
		第一次调用webapi出错如下: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http:// ... 
- 跨域调用webapi
		web端跨域调用webapi 在做Web开发中,常常会遇到跨域的问题,到目前为止,已经有非常多的跨域解决方案. 通过自己的研究以及在网上看了一些大神的博客,写了一个Demo 首先新建一个webap ... 
- Web API应用架构在Winform混合框架中的应用(3)--Winfrom界面调用WebAPI的过程分解
		最近一直在整合WebAPI.Winform界面.手机短信.微信公众号.企业号等功能,希望把它构建成一个大的应用平台,把我所有的产品线完美连接起来,同时也在探索.攻克更多的技术问题,并抽空写写博客,把相 ... 
- 跨域调用webapi   web端跨域调用webapi
		web端跨域调用webapi 在做Web开发中,常常会遇到跨域的问题,到目前为止,已经有非常多的跨域解决方案. 通过自己的研究以及在网上看了一些大神的博客,写了一个Demo 首先新建一个webap ... 
- web端跨域调用webapi
		在做Web开发中,常常会遇到跨域的问题,到目前为止,已经有非常多的跨域解决方案. 通过自己的研究以及在网上看了一些大神的博客,写了一个Demo 首先新建一个webapi的程序,如下图所示: 由于微软已 ... 
- QuickWebApi2:使用Lambda方式,完成对WebApi的开发和调用-文档的生成
		续 QuickWebApi:使用Lambda方式,完成对WebApi的开发和调用 上一篇完成了主要的功能,本次修订主要重构了对接口文档的生成规范,使之可读性更佳,甚至可以作为接口文档进行发布(当然,在 ... 
- QuickWebApi:使用Lambada方式,完成对WebApi的开发和调用。
		QuickWebApi 目的:使用Lambada方式,完成对WebApi的开发和调用. 缘由:为了解耦服务和展现,将越来越多的使用WebApi提供各种服务:随着服务的细化,WebApi的接口将越来越多 ... 
- 跨域学习笔记1--跨域调用webapi
		在做Web开发中,常常会遇到跨域的问题,到目前为止,已经有非常多的跨域解决方案. 通过自己的研究以及在网上看了一些大神的博客,写了一个Demo 首先新建一个webapi的程序,如下图所示: 由于微软已 ... 
随机推荐
- ubuntu 14.04为/检查磁盘时发生严重错误的解决方法
			http://jingyan.baidu.com/article/0aa22375bbffbe88cc0d6419.html 
- myeclipse2014安装jad反编译插件
			myeclipse上默认不能查看class文件,需要查看的话安装反编译插件 安装步骤: 准备图中框里的两个文件 1. [net.sf.jadclipse_3.3.0.jar]文件拷贝到如下路径([D: ... 
- 关注C++细节——C++11新标准之decltype的使用注意
			c++11新特性--decltype decltype是C++11加入的一个新的keyword,目的是选择并返回操作数的数据类型,重要的是,在此过程中编译器分析表达式并得到它的类型,却不实际计算表达式 ... 
- 支付宝钱包手势密码破解实战(root过的手机可直接绕过手势密码)
			/* 本文章由 莫灰灰 编写,转载请注明出处. 作者:莫灰灰 邮箱: minzhenfei@163.com */ 背景 随着移动互联网的普及以及手机屏幕越做越大等特点,在移动设备上购物.消费已是 ... 
- vue组件调用(用npm安装)
			vue用webpack打包方式新建项目,注意刚开始可以先关闭路由和代码错误检测功能 1.建立了一个Hi.vue的组件 <template> <div>Hi~~{{msg}}-- ... 
- OC06 -- 字典
			一. 创建不可变字典的方式: //字典的字面量,前key后value NSDictionary *dic =@{@"1":@"2",@"3" ... 
- 【Android】13.0 第13章 创建和访问SQLite数据库—本章示例主界面
			分类:C#.Android.VS2015: 创建日期:2016-02-26 一.简介 Android 内置了三种数据存取方式:SQLite数据库.文件.SharedPreferences. 这一章我们 ... 
- queue for max elem, pop, push
			queue for max elem, pop, push 个人信息:就读于燕大本科软件project专业 眼下大三; 本人博客:google搜索"cqs_2012"就可以; 个人 ... 
- :-1: error: [debug/moc_gotocelldialog.cpp] Error 2
			环境:Qt5.3 问题描述: 我将一个已经做好可以运行的小程序拷贝了一下,放在另一个目录下打开,却无法运行,提示上面的错误,而且原程序也无法运行了.不知道为什么,还没有答案... 
- CentOS6.4下Docker应用环境的部署配置
			http://blog.chinaunix.net/uid-619485-id-4973941.html *********************************************** ... 
