如何使用 HttpClient.PostAsync 发送 XML 内容?

Posted

技术标签:

【中文标题】如何使用 HttpClient.PostAsync 发送 XML 内容?【英文标题】:How to send XML content with HttpClient.PostAsync? 【发布时间】:2014-08-17 18:42:42 【问题描述】:

我正在努力实现this rest api:

public async Task<bool> AddTimetracking(Issue issue, int spentTime)

    // POST /rest/issue/issue/timetracking/workitem
    var workItem = new WorkItem(spentTime, DateTime.Now);
    var httpContent = new StringContent(workItem.XDocument.ToString());
    var requestUri = string.Format("01issue/2/timetracking/workitem", url, YoutrackRestUrl, issue.Id);
    var respone = await httpClient.PostAsync(requestUri, httpContent);
    if (!respone.IsSuccessStatusCode)
    
        throw new InvalidUriException(string.Format("Invalid uri: 0", requestUri));
    

    return respone.IsSuccessStatusCode;

workItem.XDocument 包含以下元素:

<workItem>
  <date>1408566000</date>
  <duration>40</duration>
  <desciption>test</desciption>
</workItem>

我收到来自 API 的错误:Unsupported Media Type

我真的不知道如何解决这个问题,非常感谢帮助。我如何使用HttpClient 通过 HTTP POST URI 编组 XML 文件?

【问题讨论】:

您将日期计算为秒,但链接中的示例使用毫秒。 @L.B,将其更改为毫秒,没有运气。我想我对 HttpContent 做错了。不幸的是,谷歌对我帮助不大 PS:当我使用完全相同的参数设置 Firefox 海报时,它可以工作。从 C# 中尝试的运气并没有那么好。 bas,下载fiddler,看看firefox和你的代码有什么区别.. @L.B,谢谢你的提示,我明天试试。 【参考方案1】:

您可能希望在 StringContent 中设置 mediaType,如下所示:

var httpContent = new StringContent(workItem.XDocument.ToString(), Encoding.UTF8, "text/xml");

var httpContent = new StringContent(workItem.XDocument.ToString(), Encoding.UTF8, "application/xml");

【讨论】:

text/xml 在我的例子中 我知道这个答案已经有好几年了,但在我的情况下媒体类型也需要是“text/xml”。【参考方案2】:

你可以使用

var respone = await httpClient.PostAsXmlAsync(requestUri, workItem);

https://msdn.microsoft.com/en-us/library/system.net.http.httpclientextensions_methods

【讨论】:

看起来比接受的答案更好的解决方案 asp.net core 3.1没有这个方法【参考方案3】:

要使用 Matt Frear 的解决方案,您可能需要添加 NuGet 包: Microsoft.AspNet.WebApi.Client

这引入了扩展方法,因此您可以使用:

var respone = await httpClient.PostAsXmlAsync<WorkItem>(requestUri, workItem);

这适用于较新的 .Net 5,因此假设适用于 asp.net core 3.1。

【讨论】:

以上是关于如何使用 HttpClient.PostAsync 发送 XML 内容?的主要内容,如果未能解决你的问题,请参考以下文章

如何正确使用 HttpClient PostAsync 参数?

HttpClient.PostAsync 崩溃应用。如何捕捉异常?

网络条件差时如何处理文件HttpClient.PostAsync文件上传?

如何将对象传递给 HttpClient.PostAsync 并序列化为 JSON 主体?

如何使用 C# HttpClient PostAsync 显示上传进度

如何在 C# 中将 HttpClient PostAsync() 与线程池一起使用?