HttpClient调用WebServices的接口
前提:有一些老的WebServices(历史遗留)提供了Http的调用,可以直接HttpClient调用,另一些则只可以用SOAP调用,对于可以用http调用的直接使用httpclient发送请求。
1.启动一个WebServices项目

这里提供一个现成的Demo
NetWebServices: 基于.NetFramework 4.8 学习 WebServices,支持SOAP1.1/SOAP1.2/HTTP请求
可以用Postman等调用试一试


2.另起一个项目用HttpClient调用
webServices的返回都是XML,如果要使用一般需要解析其内容,可以使用
System.Xml.XmlSerializer来解析,以第一个返回字符串的webservices接口为例:
[HttpGet]
public StandResult<List<WebServiceUser>> HttpGet_WebServices()
{
HttpClient httpClient = new HttpClient();
httpClient.BaseAddress = new Uri("https://localhost:44371/WebService1.asmx/GetAllUsers");
Task<HttpResponseMessage> task = httpClient.GetAsync(httpClient.BaseAddress);
HttpResponseMessage response = task.Result;
//这个字符串就是XML文件的内容
string result = response.Content.ReadAsStringAsync().Result;
//拿到HttpRespone然后解析
StringReader stringReader = new StringReader(result);
//把Xml反序列化解析成实体
XmlSerializer xmlSerializer = new XmlSerializer(typeof(WebServiceDO));
var xmlstring = xmlSerializer.Deserialize(stringReader) as WebServiceDO;
//里面嵌套的JSON可以再解析返回或者另做处理
List<WebServiceUser> webServiceUsers = JsonConvert.DeserializeObject<List<WebServiceUser>>(xmlstring.JsonContext);
if(webServiceUsers != null)
return new StandResult<List<WebServiceUser>>() { _value = 0, _data = webServiceUsers };
else
return new StandResult<List<WebServiceUser>>() { _value = 0 };
}[XmlRoot("string",Namespace = "http://tempuri.org/")]
public class WebServiceDO
{
[XmlText]
public string JsonContext { get; set; }
}
public class WebServiceUser
{
public int UserID { get; set; }
public string UserName { get; set; }
public string UserEmail { get; set; }
public int UserAge { get; set; }
}
🍎 Tips:
HttpClient的Get参数设置:(在请求后面加就可以)
using System;
using System.Net.Http;
using System.Threading.Tasks;
public class GetRequestExample
{
public async Task GetWithQueryStringAsync()
{
using (HttpClient client = new HttpClient())
{
// 方法A:手动构建URL
string name = "张三";
int age = 25;
string url = $"http://api.example.com/users?name={Uri.EscapeDataString(name)}&age={age}";
// 方法B:使用字典构建(更规范)
var parameters = new Dictionary<string, string>
{
["name"] = "张三",
["age"] = "25",
["page"] = "1",
["pageSize"] = "20",
["search"] = "关键字 测试"
};
string queryString = BuildQueryString(parameters);
string url2 = $"http://api.example.com/users{queryString}";
// 发送GET请求
HttpResponseMessage response = await client.GetAsync(url2);
if (response.IsSuccessStatusCode)
{
string result = await response.Content.ReadAsStringAsync();
Console.WriteLine(result);
}
}
}
// 构建查询字符串的辅助方法
private string BuildQueryString(Dictionary<string, string> parameters)
{
if (parameters == null || parameters.Count == 0)
return string.Empty;
var queryItems = parameters
.Where(p => !string.IsNullOrEmpty(p.Value))
.Select(p => $"{Uri.EscapeDataString(p.Key)}={Uri.EscapeDataString(p.Value)}");
return "?" + string.Join("&", queryItems);
}
// 更简单的构建方法(使用FormUrlEncodedContent)
private string BuildQueryStringSimple(Dictionary<string, string> parameters)
{
using (var content = new FormUrlEncodedContent(parameters))
{
return "?" + content.ReadAsStringAsync().Result;
}
}
}HttpClient的Post参数设置:
using System.Text;
using System.Text.Json;
public class PostRequestExample
{
// 定义数据模型
public class User
{
public string Name { get; set; }
public string Email { get; set; }
public int Age { get; set; }
public List<string> Hobbies { get; set; }
}
public async Task PostJsonAsync()
{
using (HttpClient client = new HttpClient())
{
// 准备要发送的数据
var user = new User
{
Name = "张三",
Email = "zhangsan@example.com",
Age = 25,
Hobbies = new List<string> { "篮球", "音乐", "编程" }
};
// 方法A:手动序列化JSON
string json = JsonSerializer.Serialize(user);
var content = new StringContent(json, Encoding.UTF8, "application/json");
// 方法B:使用扩展方法(需要安装 Microsoft.AspNet.WebApi.Client 包)
// var content = new StringContent(
// JsonConvert.SerializeObject(user),
// Encoding.UTF8,
// "application/json"
// );
// 发送POST请求
string url = "http://api.example.com/users";
HttpResponseMessage response = await client.PostAsync(url, content);
if (response.IsSuccessStatusCode)
{
string responseJson = await response.Content.ReadAsStringAsync();
Console.WriteLine($"创建成功: {responseJson}");
// 反序列化响应
var createdUser = JsonSerializer.Deserialize<User>(responseJson);
}
}
}
// 传递简单键值对对象
public async Task PostSimpleJsonAsync()
{
using (HttpClient client = new HttpClient())
{
var data = new
{
username = "zhangsan",
password = "123456",
rememberMe = true
};
string json = JsonSerializer.Serialize(data);
var content = new StringContent(json, Encoding.UTF8, "application/json");
HttpResponseMessage response = await client.PostAsync(
"http://api.example.com/login",
content
);
}
}
}System.Xml.XmlSerializer解析规则参考:
System.Xml.Serialization.XmlSerializer 类 - .NET | Microsoft Learn
评论区