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

      

    /// <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
  • 相关阅读:
    WPF窗体设计不符合微软自己的UX Guide
    NUnit测试WPF程序的一个小技巧
    Windows Vista中五花八门的菜单赏析
    忙碌文档
    怎样做才能算是一个UX良好的软件
    编写帮助文档经验总结
    [WPF Bug清单]之(7)——顽固的Error Template
    让NSIS生成的安装包在静默安装时从命令行窗口输出安装信息
    [WPF Bug清单]之(9)——消失的光标
    [提个醒] C#中yield return的小缺点
  • 原文地址:https://www.cnblogs.com/liuqiyun/p/9144816.html
Copyright © 2020-2023  润新知