打赏

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 = 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));

  

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
/// <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;
}

  

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
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,查阅资料,加班终于搞定

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
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
posted @   刘奇云  阅读(7652)  评论(6编辑  收藏  举报
编辑推荐:
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)
历史上的今天:
2017-06-06 递归循环组织机构
2017-06-06 C#中文件和byte[]互换问题
点击右上角即可分享
微信分享提示