C#中使用HttpClient来Post数据的内容HttpContent的各种格式

本文介绍了网络传输中常见的四种数据格式:application/x-www-form-urlencoded、multipart/form-data、application/json和text/xml。重点讨论了JSON在RESTful API和前后端分离中的广泛应用,以及XML在SOAP协议中的使用。此外,还分析了C#中HttpClient如何处理这些内容,并探讨了Postman中的form-data和binary类型。总结了各种格式的特点和适用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

平时使用各种网络传输的时候基本上是以Json格式进行的, 所以对其他几种格式也是一知半解, 今天静下心对其好好梳理一番.

首先我借鉴了一篇文章(https://segmentfault.com/a/1190000014343759), 和大多数资料一样, 他将类型分为四大类

application/x-www-form-urlencoded,
multipart/form-data,
application/json,
text/xml.

我把他的介绍Copy了过来, 这几种确实挺常用的, 但是个人而言, 我用的最多的还是json, 而xml我几乎只在配置文件有直接接触.

做一个可能不专业的总结, 有错误请指正:

Json的使用主要是由于REST的兴起, 而且当下流行前后端分离, 后端使用轻量级的webapi, 几乎和json捆绑到一块了.

Xml的传输场景则是基于SOAP(Simple Object Access Protocol), 这个好像接触到的都是Java开发的.

一、以下是最常用的四种类型:

(1)、application/x-www-form-urlencoded
这应该是最常见的 POST 提交数据的方式了。浏览器的原生 <form> 表单,如果不设置 enctype 属性,那么最终就会以 application/x-www-form-urlencoded 方式提交数据。

<form action="form_action.asp" enctype="text/plain">
  <p>First name: <input type="text" name="fname" /></p>
  <p>Last name: <input type="text" name="lname" /></p>
  <input type="submit" value="Submit" />
</form>

(2)、multipart/form-data
这也是常见的post请求方式,一般用来上传文件,各大服务器的支持也比较好。所以我们使用表单 上传文件 时,必须让<form>表单的enctype属性值为 multipart/form-data.

(3)、application/json
application/json作为响应头并不陌生,实际上,现在很多时候也把它作为请求头,用来告诉服务端消息主体是序列化的JSON字符串,除了低版本的IE,基本都支持。除了低版本的IE都支持JSON.stringify()的方法,服务端也有处理JSON的函数,使用json不会有任何麻烦。

(4)、text/xml

二、个人对传输类型进行的分类

其实这个介绍我认为一点都不具备概括性, 开发的同学肯定都使用过一个叫做Postman的东西
在这里插入图片描述
Get请求都是通过URL进行传参的, 也就是我们途中看到的Params, 而Post请求除了可以通过Params来传参, 最关键的则是Body, URL携带的参数基本限定在字符串, 并且需要进行URL转码, 而Body里面则可以有各种格式.

当然none则是没有Body, 不作考虑, 拎出来两个特别的:

1、form-data, 也就是上文中介绍的multipart/form-data, 他通过一个叫做boundary的东西来隔绝键值对, 下面是截图:
在这里插入图片描述
在这里插入图片描述

2、binary, 这个看名字就能猜出一二, 这个是直接通过二进制流进行传输的, 这个也没啥好解释的.

剩下的, 我都归类到其他类型, 他们有一个共同的特性, Body内容是一长串字符串, 而在Header里面会有一个Content-Type的属性来告诉接收者这个字符串是怎么组织的.
在这里插入图片描述
但是这里面还有一个稍微特别一点的, 就是application/x-www-form-urlencoded, 他需要进行URL转码, 他和Get请求的URL转码是一个意思.

不同的是, Get请求直接拼接到URL上即可, 而该类型则是放到Body, 同时加一个Content-TypeHeader.

三、C#中HttpClient进行各种类型的传输

我们可以看到, 尽管PostAsync有四个重载函数, 但是接受的都是HttpContent, 而查看源码可以看到, HttpContent是一个抽象类
在这里插入图片描述

那我们就不可能直接创建HttpContent的实例, 而需要去找他的实现类, 经过一番研究, 发现了, 如下四个:

MultipartFormDataContent、FormUrlEncodedContent、StringContent、StreamContent

和上面的总结进行一个对比就能发现端倪:

MultipartFormDataContent=》multipart/form-data

FormUrlEncodedContent=》application/x-www-form-urlencoded

StringContent=》application/json

StreamContent=》binary

而和上面总结的一样FormUrlEncodedContent只是一个特殊的StringContent罢了, 唯一不同的就是在mediaType之前自己手动进行一下URL编码罢了(这一条纯属猜测, 逻辑上应该是没有问题的).

Blazor(基于WebAssembly的.NET框架)允许在C#中创建交互式的Web应用程序,其中包含对服务器端和客户端逻辑的支持。如果你想要在Blazor应用中点击按钮发送POST请求,你可以遵循以下步骤: 1. 创建组件:首先,在Blazor项目中创建一个新的 Razor 元素或页面,例如 `EditForm.razor`。 ```razor @page "/edit" @inject HttpClient httpClient <button @onclick="HandleClick">提交</button> <div id="response"></div> @code { private string responseText = ""; private async Task HandleClick() { var data = new { Key = "Value", AdditionalData = "WhateverYouWant" }; // 示例数据 var content = new StringContent(JsonSerializer.Serialize(data), Encoding.UTF8, "application/json"); var result = await httpClient.PostAsync("https://api.example.com/endpoint", content); if (result.IsSuccessStatusCode) { responseText = await result.Content.ReadAsStringAsync(); StateHasChanged(); // 更新UI } else { responseText = "请求失败,状态码:" + result.StatusCode; } } protected override void OnInitialized() { // 在这里添加初始化代码,如果需要 } } ``` 2. 异步处理:`HandleClick` 方法中使用了 `HttpClient` 来执行异步 POST 请求,确保数据序列化为 JSON 并设置正确的 Content-Type。 3. UI更新:当请求成功或失败时,响应文本存储在 `responseText` 中,并通过调用 `StateHasChanged()` 实现视图的自动刷新,显示最新的响应内容。 4. 可选:如果需要,可以在 `OnInitialized` 方法里做额外的初始化操作,比如认证或设置默认值。 **相关问题:** 1. Blazor中的`HttpClient`是什么? 2. 如何在Blazor中注入依赖项? 3. 怎样在Razor页面上绑定事件处理器到组件元素?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值