在C#客户端开发中,调用返回或接收XML格式的接口时,RestSharp是高效便捷的HTTP请求工具,它简化了请求构建、发送和响应的处理流程,不需要开发者手动处理底层的HTTP协议细节。使用RestSharp发送XML请求,核心是要正确设置请求的内容类型,同时将业务数据序列化为符合接口要求的XML格式。

环境准备
首先需要在项目中安装RestSharp依赖,如果你使用的是Visual Studio,可以通过NuGet包管理器搜索RestSharp进行安装,也可以在包管理器控制台执行以下命令:
Install-Package RestSharp
安装完成后,在代码文件中引入对应的命名空间:
using RestSharp; using System.Xml.Serialization; using System.IO;
构建XML请求数据
XML接口通常要求请求体是符合特定结构的XML字符串,我们可以先定义对应的C#实体类,再通过XML序列化得到需要的XML内容。比如接口要求的请求XML结构如下:
<?xml version="1.0" encoding="utf-8"?> <Request> <UserId>1001</UserId> <UserName>测试用户</UserName> <OperateType>query</OperateType> </Request>
对应的C#实体类定义如下,使用XmlRoot和XmlElement特性指定XML节点名称:
[XmlRoot("Request")]
public class QueryRequest
{
[XmlElement("UserId")]
public int UserId { get; set; }
[XmlElement("UserName")]
public string UserName { get; set; }
[XmlElement("OperateType")]
public string OperateType { get; set; }
}
接下来实现XML序列化方法,将实体对象转换为XML字符串:
public string SerializeToXml<T>(T obj)
{
XmlSerializer serializer = new XmlSerializer(typeof(T));
using (StringWriter writer = new StringWriter())
{
serializer.Serialize(writer, obj);
return writer.ToString();
}
}
使用RestSharp发送XML请求
完成数据准备后,就可以构建RestSharp请求并发送。核心步骤是设置请求方法、请求地址、Content-Type为application/xml,然后将序列化后的XML字符串作为请求体传入。
public string CallXmlInterface()
{
// 创建RestClient,设置接口基地址
var client = new RestClient("http://ipipp.com/api/query");
// 创建请求,指定请求方法为POST
var request = new RestRequest(Method.POST);
// 设置请求内容类型为XML
request.AddHeader("Content-Type", "application/xml");
// 构建请求数据实体
QueryRequest reqData = new QueryRequest
{
UserId = 1001,
UserName = "测试用户",
OperateType = "query"
};
// 序列化得到XML字符串
string xmlBody = SerializeToXml(reqData);
// 添加请求体
request.AddParameter("application/xml", xmlBody, ParameterType.RequestBody);
// 执行请求获取响应
IRestResponse response = client.Execute(request);
if (response.IsSuccessful)
{
return response.Content;
}
else
{
throw new Exception($"请求失败,状态码:{response.StatusCode},错误信息:{response.ErrorMessage}");
}
}
响应XML解析
接口返回的XML响应同样可以通过反序列化转换为C#实体,先定义响应对应的实体类:
[XmlRoot("Response")]
public class QueryResponse
{
[XmlElement("Code")]
public int Code { get; set; }
[XmlElement("Message")]
public string Message { get; set; }
[XmlElement("Data")]
public string Data { get; set; }
}
实现XML反序列化方法,将响应内容转换为实体对象:
public T DeserializeFromXml<T>(string xml)
{
XmlSerializer serializer = new XmlSerializer(typeof(T));
using (StringReader reader = new StringReader(xml))
{
return (T)serializer.Deserialize(reader);
}
}
调用示例如下:
try
{
string responseXml = CallXmlInterface();
QueryResponse result = DeserializeFromXml<QueryResponse>(responseXml);
Console.WriteLine($"响应状态码:{result.Code},消息:{result.Message},数据:{result.Data}");
}
catch (Exception ex)
{
Console.WriteLine($"接口调用异常:{ex.Message}");
}
常见问题说明
- 如果接口要求XML不包含声明头<?xml version="1.0" encoding="utf-8"?>,可以在序列化时设置
XmlSerializerNamespaces去掉默认命名空间:public string SerializeToXmlWithoutDeclaration<T>(T obj) { XmlSerializer serializer = new XmlSerializer(typeof(T)); XmlSerializerNamespaces ns = new XmlSerializerNamespaces(); ns.Add("", ""); using (StringWriter writer = new StringWriter()) { serializer.Serialize(writer, obj, ns); return writer.ToString(); } } - 如果接口使用GBK等编码,需要手动设置请求和响应的编码格式,避免中文乱码问题。
- 发送GET请求携带XML参数时,需要将XML参数拼接在URL后或者作为查询参数传递,具体根据接口要求调整。