侧边栏壁纸
博主头像
亿元丁真博主等级

行动起来,活在当下

  • 累计撰写 10 篇文章
  • 累计创建 8 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录

HttpClient调用WebServices的接口

黎翰
2025-12-06 / 0 评论 / 1 点赞 / 5 阅读 / 12160 字

HttpClient调用WebServices的接口

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

1.启动一个WebServices项目

pis1.png

这里提供一个现成的Demo

NetWebServices: 基于.NetFramework 4.8 学习 WebServices,支持SOAP1.1/SOAP1.2/HTTP请求

可以用Postman等调用试一试

pis3.png

pis2.png

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

pis4.png

🍎 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

C#进阶版-序列化与反序列化 - 知乎


1

评论区