using Newtonsoft.Json; using Newtonsoft.Json.Linq; using System; using System.Collections.Generic; using System.Linq; using System.Net; using System.Net.Http; using System.Text; using System.Threading.Tasks; namespace ConsoleApp3 { class Program { static void Main(string[] args) { } /// <summary> /// PostAsync接口传参和接口不传参 /// </summary> /// <returns></returns> public static string TestPostAsync() { var SSOUrl = ""; string url = "api/BusinessMenuApi/CheckUrlPermission"; //创建HttpClient(注意传入HttpClientHandler) var handler = new HttpClientHandler() { AutomaticDecompression = DecompressionMethods.GZip }; var urlInfo = new UrlInfos { ModuleId = "", Url = "", BusinessCode = "" }; var token = ""; using (var http = new HttpClient(handler)) { http.BaseAddress = new Uri(SSOUrl); http.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Bearer", token); var content = new StringContent(Newtonsoft.Json.JsonConvert.SerializeObject(urlInfo), Encoding.UTF8, "application/json"); var response = http.PostAsync(url, content).Result;//传参使用 // var response = http.PostAsync(url, null).Result;//不传参使用 //确保HTTP成功状态值 response.EnsureSuccessStatusCode(); //await异步读取最后的JSON(注意此时gzip已经被自动解压缩了,因为上面的AutomaticDecompression = DecompressionMethods.GZip) var result = response.Content.ReadAsStringAsync().Result; var json = JsonConvert.DeserializeObject<dynamic>(result); bool success = json.Success; if (success) { JArray jo = json.Result; string jos = jo.ToString(); JArray jo2 = json.Error; string jos2 = jo2.ToString(); return jos; } else { return string.Empty; } } } } public class UrlInfos { /// <summary> /// 菜单Id /// </summary> public string ModuleId { get; set; } /// <summary> /// 菜单地址 /// </summary> public string Url { get; set; } /// <summary> /// 业务系统Code /// </summary> public string BusinessCode { get; set; } /// <summary> /// 菜单是否从SSO获取 /// </summary> public bool IsMeunFromSSO { get; set; } } }
using Newtonsoft.Json; using Newtonsoft.Json.Linq; using System; using System.Collections.Generic; using System.Linq; using System.Net; using System.Net.Http; using System.Text; using System.Threading.Tasks; namespace ConsoleApp3 { class Program { static void Main(string[] args) { } /// <summary> /// GetAsync接口传参和接口不传参 /// </summary> /// <returns></returns> public static string TestPostAsync() { var SSOUrl = ""; string url = "api/BusinessMenuApi/CheckUrlPermission/content="; //创建HttpClient(注意传入HttpClientHandler) var handler = new HttpClientHandler() { AutomaticDecompression = DecompressionMethods.GZip }; var urlInfo = new UrlInfos { ModuleId = "", Url = "", BusinessCode = "" }; var token = ""; using (var http = new HttpClient(handler)) { http.BaseAddress = new Uri(SSOUrl); http.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Bearer", token); var content = new StringContent(Newtonsoft.Json.JsonConvert.SerializeObject(urlInfo), Encoding.UTF8, "application/json"); var response = http.GetAsync(url + content).Result;//传参使用 //var response = http.GetAsync(url).Result;//不传参使用 //确保HTTP成功状态值 response.EnsureSuccessStatusCode(); //await异步读取最后的JSON(注意此时gzip已经被自动解压缩了,因为上面的AutomaticDecompression = DecompressionMethods.GZip) var result = response.Content.ReadAsStringAsync().Result; var json = JsonConvert.DeserializeObject<dynamic>(result); bool success = json.Success; if (success) { JArray jo = json.Result; string jos = jo.ToString(); JArray jo2 = json.Error; string jos2 = jo2.ToString(); return jos; } else { return string.Empty; } } } } public class UrlInfos { /// <summary> /// 菜单Id /// </summary> public string ModuleId { get; set; } /// <summary> /// 菜单地址 /// </summary> public string Url { get; set; } /// <summary> /// 业务系统Code /// </summary> public string BusinessCode { get; set; } /// <summary> /// 菜单是否从SSO获取 /// </summary> public bool IsMeunFromSSO { get; set; } } }
2020-07-13补充
项目中调用的三方接口需要在调用接口时添加Authorization的Digest Auth认证,需要加username和password,不然接口访问会报401错误
如下是postman中可以这样测试
https://blog.csdn.net/JENREY/article/details/86521391
代码中解决方式
var handler = new HttpClientHandler() { AutomaticDecompression = DecompressionMethods.GZip, Credentials = new NetworkCredential("用户名", "密码") };
这里修改一下就可以了。
分享一种WebClient调用post和get的方式包含摘要认证方法
调用:
string sUrl = "http://localhost:8023/VIID/Dispositions"; var paramData = ""; var result = Request(sUrl, "POST", paramData, "test", "123456");
public static string Request(string sUrl, string sMethod, string sEntity,string username, string password) { var sMessage = ""; try { using (System.Net.WebClient client = new System.Net.WebClient()) { if (!string.IsNullOrEmpty(username) && !string.IsNullOrEmpty(password))//是否采用摘要认证 { client.Credentials = CreateAuthenticateValue(sUrl, username, password); } WebHeaderCollection customerHeader = new WebHeaderCollection(); customerHeader.Add(HttpRequestHeader.Accept, "application/json,application/*+json"); customerHeader.Add(HttpRequestHeader.ContentType, "application/*+JSON;charset=UTF-8"); client.Headers = customerHeader; Uri url = new Uri(sUrl); byte[] bytes = Encoding.UTF8.GetBytes(sEntity); byte[] buffer; switch (sMethod.ToUpper()) { case "GET": buffer = client.DownloadData(url); break; case "POST": buffer = client.UploadData(url, "POST", bytes); break; default: buffer = client.UploadData(url, "POST", bytes); break; } return Encoding.UTF8.GetString(buffer); } } catch (WebException ex) { sMessage = ex.Message; var rsp = ex.Response as HttpWebResponse; var httpStatusCode = rsp.StatusCode; var authenticate = rsp.Headers.Get("WWW-Authenticate"); return ""; } catch (Exception ex) { sMessage = ex.Message; return ""; } } /// <summary> /// 摘要认证 /// </summary> /// <param name="sUrl"></param> /// <param name="username"></param> /// <param name="password"></param> /// <returns></returns> private static CredentialCache CreateAuthenticateValue(string sUrl, string username, string password) { CredentialCache credentialCache = new CredentialCache(); credentialCache.Add(new Uri(sUrl), "Digest", new NetworkCredential(username, password)); return credentialCache; }
扩展