用.Net的HttpClient调用WebServices的接口

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接口为例:

csharp 复制代码
[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 };


}
csharp 复制代码
[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参数设置:(在请求后面加就可以)

csharp 复制代码
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参数设置:

csharp 复制代码
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#进阶版-序列化与反序列化 - 知乎

XmlSerializer读写xml

相关推荐
波波0072 天前
每日一题:中间件是如何工作的?
中间件·.net·面试题
无风听海2 天前
.NET 10之可空引用类型
数据结构·.net
码云数智-园园2 天前
基于 JSON 配置的 .NET 桌面应用自动更新实现指南
.net
无风听海2 天前
.NET 10 之dotnet run的功能
.net
岩屿2 天前
Ubuntu下安装Docker并部署.NET API(二)
运维·docker·容器·.net
码云数智-大飞2 天前
.NET 中高效实现 List 集合去重的多种方法详解
.net
easyboot2 天前
使用tinyply.net保存ply格式点云
.net
张人玉2 天前
WPF 多语言实现完整笔记(.NET 4.7.2)
笔记·.net·wpf·多语言实现·多语言适配
波波0072 天前
Native AOT 能改变什么?.NET 预编译技术深度剖析
开发语言·.net
Crazy Struggle3 天前
.NET 中如何快速实现 List 集合去重?
c#·.net