HttpClient系列~StringContent与FormUrlEncodedContent

知识点

本文是一个很另类的文章,在项目中用的比较少,但如果项目中真的出现了这种情况,我们也需要知道如何去解决,对于知识点StringContent和FormUrlEncodedContent我们应该了解的多一点,FormUrlEncodedContent是以键/值对的形式进行POST数据的提供,同时要求服务端以x-www-form-urlencoded的方式去接收数据!而StringContent是ByteArrayContent的一个子集,也是MultipartFormDataContent的一个子集,在进行大数据传输时,我们需要使用这种方法,如果传递的是字符串,可以采用StringContent,如果是二进制流,可以使用ByteArrayContent,而这两种方式都可以对外以MultipartFormDataContent的形式体现,而在服务端要以mutipart/form-data的方式来接收数据!

再深一点

multipart/form-data: 就是http请求中的multipart/form-data,它会将表单的数据处理为一条消息,以标签为单元,用分隔符分开。既可以上传键值对,也可以上传文件。当上传的字段是文件时,会有Content-Type来表名文件类型;content-disposition,用来说明字段的一些信息;由于有boundary(分隔符号)隔离,所以multipart/form-data既可以上传文件,也可以上传键值对,它采用了键值对的方式,所以可以上传多个文件。

x-www-form-urlencoded:会将表单数据转成键/值对进行传递,有大小的限制,一般是2M。

Raw:可以上传任何格式文本,你需要显示的说明content-type,如text/plain,text/html,text/json,text/xml等。

Binary:一般上传文件流,它相当于content-type为application/octet-stream的情况。

从上面的介绍不难发现,raw和binary方式都属于multipart/form-data,只不过是两种不同的体现而以。

DotNet平台为WebAPI传递大数据

对于普通方式的HttpClient(x-www-form-urlencoded)有时已经不能满足我们的需要了,所以必须上multipart/form-data,即在HttpClient构建时,采用StringContent的内容类型,下面是在客户端构建一个HttpClient的方式,以服务端(webapi restful)传递一个大大的JSON对象!

 

复制代码
          var list = new List<TestApiModel>();entity.Category = new Category { Title = "北京" };entity.OrderList = new List<OrderList> {new OrderList{Price=1,ProductName="tel",Address=new Address {Province="印度"}},new OrderList{Price=100,ProductName="tv",Address=new Address {Province="日本"}},new OrderList{Price=999,ProductName="pc",Address=new Address {Province="美国"}}};for (int i = 0; i <= 100; i++)list.Add(entity);var handler = new HttpClientHandler(){AutomaticDecompression = System.Net.DecompressionMethods.GZip};using (var http = new HttpClient(handler)){var body = entity.ToNameValueCollection();var content = new StringContent(list.ToJson(), Encoding.UTF8, "text/json");var responseResult = http.PostAsync(UriAddress, content).Result;}
复制代码

 

如果客户端采用了这种StringContent的方式,那么在设计WebApi时只有两种选择,第一种就是使用JSON强类型(类对象)的参数,第二种就是不写参数(空),如果使用string类型的参数,那这个接口无法被找到,即出现的结果是404的状态码!下面看一下服务端的数据处理,也是很简单!

复制代码
    public async Task<HttpResponseMessage> Post()//没有参数表示使用raw,form-data方式进行传输{try{var data =await Request.Content.ReadAsStringAsync();var entity = Lind.DDD.Utils.SerializeMemoryHelper.DeserializeFromJson<IEnumerable<TestApiModel>>(data);
}
//.......

}
 
复制代码

上面代码从请求上下文中拿到了这个大数据的字符串,然后通过反序列化得到了下面的结果:

 

当然,对于非常友好的webapi来说,你完全可以在方法参数上显示的使用强类型,这种api框架会帮助我们进行序列化的操作,真的很友好!

这行list对象已经被架构进行了序列化操作

通过本篇文章,让我们更清楚的认识到了POST请求的几种方式,以及他们与服务端(api)如何去结合,对于java,.net平台,这些方法都是同样适用的!

来自:https://www.cnblogs.com/lori/p/5919306.html

转载于:https://www.cnblogs.com/topguntopgun/p/10823767.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/411537.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Javascript乱弹设计模式系列(1) - 观察者模式(Observer)

前言 博客园谈设计模式的文章很多&#xff0c;我也受益匪浅&#xff0c;包括TerryLee、吕震宇等等的.NET设计模式系列文章&#xff0c;强烈推荐。对于我&#xff0c;擅长于前台代码的开发&#xff0c;对于设计模式也有一定的了解&#xff0c;于是我想结合Javascript来设计前台方…

【JS】JS中数值型字符串相加变成拼接字符串的解决方法

一、问题描述 数值型的字符串&#xff0c;通过、 运算符连接后&#xff0c;变成了字符串拼接&#xff0c;而不是数值计算。 先上图&#xff1a; 二、错误原因 这是由于JS中、 运算符既是算术运算符&#xff0c;也是字符串的连接符> 的运算规则是&#xff1a;如果把数字与字符…

安卓JAVA调用lua_android中java与lua的相互调用

Android Studio Lua环境配置开发环境1. Android Studio 3.52. java sdk: 1.8.03.android sdk&#xff1a;28配置环境添加lua支持语法支持插件&#xff0c;打开android studio -> File -> Settings三方库选择参考文章&#xff1a;https://gameinstitute.qq.com/community/…

用ajax(vb.net) 实现dropdownlist二级无刷新联动~!

说说vb.net ajaxpro 实现dropdownlist二级无刷新联动~&#xff01;Code<div class"div_RSL"> <asp:DropDownList ID"DropDownList1" runat"server" DataSourceID"proID" DataTextField"proName"AutoPostBack"…

SQLserver被js注入的全库替换SQL

CodeDECLARE fieldtype sysnameSET fieldtypenvarchar--替换处理DECLARE hCForEach CURSOR GLOBALFOR--要替换的列的数据类型SELECT NUPDATE QUOTENAME(o.name)N set QUOTENAME(c.name)REPLACE(QUOTENAME(c.name),<script srchttp://cn.daxia123.cn/cn.js></script>…

《高性能网站建设指南》勘误

《高性能网站建设指南》勘误 P5&#xff08;第1章&#xff09;倒数第1段倒数第3行原文&#xff1a;如果你遵从所有适用于你的网站的规则&#xff0c;你的页面的加载速度会提高20%~25%&#xff0c;用户体验也将得到改善。修改&#xff1a;如果你遵从所有适用于你的网站的规则&am…

Delphi 与 DirectX 之 DelphiX(35): TDIB.Saturation();

本例效果图:代码文件:unit Unit1;interfaceusesWindows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,Dialogs, DIB, StdCtrls;typeTForm1 class(TForm)DXPaintBox1: TDXPaintBox;Button1: TButton;Button2: TButton;procedure Button1Click(Sender: T…

RabbitMQ基本概念(三)-Centos7下安装RabbitMQ3.6.1

如果你看过前两章对RabbitMQ已经有了一定了解&#xff0c;现在已经摩拳擦掌&#xff0c;来吧动手吧&#xff01; 用什么系统 本文使用的是Centos7&#xff0c;为了保证对linux不太熟悉的伙伴也能轻松上手&#xff08;避免折在安装的路上&#xff09;&#xff0c;下面是我的系统…

pom添加mysql依赖tomcat崩溃_Spring Boot + Mybatis + Spring MVC环境配置(一) :Spring Boot初始化,依赖添加...

最近在搭建一个Spring Boot Mybatis Spring MVC的环境&#xff0c;折腾来折腾去&#xff0c;两三天才搞定&#xff0c;记录下大概过程和遇到的错误看一下Spring Boot官方的介绍&#xff1a;Spring Boot让开发者省去了大多数Spring的配置&#xff0c;让其只需要关注主要的开发…

Jmeter脚本增强之参数化(多方式实现)(6)

参数化的场景&#xff1a; ①在插入记录时&#xff0c;数据库对某些字段唯一限制&#xff0c;这时需要参数化&#xff08;不能传固定参数&#xff09; ②在压测过程中&#xff0c;需要使用不同的用户登录&#xff0c;模拟真实的使用场景&#xff08;避免数据库查询缓存&#xf…

docker学习二

一 部署Mysql 搜索镜像 docker search mysql拉取镜像 docker pull centos/mysql-57-centos7 创建Mysql 容器 docker run -di --namedocker_mysql -p 33306:3306 -e MYSQL_ROOT_PASSWORDroot centos/mysql-57-centos733306是宿主机的端口&#xff0c;3306是docker的端口&#xf…

new关键字对类成员的阻断

昨天终于对new关键字对类成员的阻断作用有了比较清晰的认识&#xff0c;“对类成员的阻断”是王涛大哥在其作品《你必须知道的.NET》的说法&#xff0c;昨天在园里看到一位前辈戏称之为“封印咒术”&#xff0c;我感觉这个说法很贴切。比如Sons类继承自Fathers类&#xff0c;在…

LOJ 2979 「THUSCH 2017」换桌——多路增广费用流

题目&#xff1a;https://loj.ac/problem/2979 原来的思路&#xff1a; 优化连边。一看就是同一个桌子相邻座位之间连边、相邻桌子对应座位之间连边。 每个座位向它所属的桌子连边。然后每个人建一个点&#xff0c;向若干桌子连边。 因为连边的桌子是区间&#xff0c;所以线段树…

java如何实现红包雨,一个简单的红包雨实现

效果图如下&#xff1a;我的视频 1_20170207191503.gif这个简单动画的主要思路&#xff1a; 将多个 红包View 通过 属性动画 从屏幕顶端 飘落到 屏幕底部。只不过在飘落的动画过程中&#xff0c;加入了一些随机路线 Path。主要涉及到的知识点&#xff1a;1.Path 和 PathMeasure…

【原】基于Windows Media Player, 写自己的播放器【有源码,可下载整个工程】

最近有客户问我&#xff0c;怎么把Windows Media Player 嵌套在自己的项目中。 以前我在Delphi下玩过Windows Media Player&#xff0c;可是在Microsoft Visual Studio 2008 没有测试过。 到网上搜索了一把&#xff0c;果然得到很多例子。 其中CSDN上有个例子写的不错&#xff…

Oracle数据库php短连接,PHP 连接 Oracle

起因由于项目的数据库需要用客户购买的Oracle数据库&#xff0c;所以需要php安装oci扩展。运行环境php : 7.2系统: windows10oracle: 11gR2安装相关环境由于php的oci8扩展还是需要使用到oracle的一些包&#xff0c;所以先下载这一些。下载完成后解压缩这个压缩包&#xff0c;并…

计算机考研文章精选[转载]

今天在网上看到了一篇超全的计算机考研文章集合&#xff0c;里面有很多曾经看过&#xff0c;挺经典的&#xff0c;于是忍不住收藏下来&#xff0c;希望对那些即将报考计算机研究生和工作了仍不放弃考研的朋友有所帮助 计算机考研常见问题解答 地址&#xff1a;http://ww…

PHP鼠标滑过变色命令,WordPress鼠标悬停变色的修改方法

原创内容&#xff0c;转载请注明出处&#xff1a;https://www.myzhenai.com.cn/post/3253.html关键词&#xff1a;wordpress 鼠标 悬停 变色我总是觉得我两个WordPress博客的主题里使用的鼠标悬停变色的颜色不太喜欢&#xff0c;就是当鼠标划过或停留在某一个链接上的时候&…

圆面积异常

package zengliang;import java.util.*;public class Suv {public static void main(String[] args) {// TODO 自动生成的方法存根try{double r,s;final double PI 3.14;Scanner scnew Scanner(System.in);System.out.println("输入圆的半径&#xff1a;");r sc.ne…

SpringBoot学习笔记(9)----SpringBoot中使用关系型数据库以及事务处理

在实际的运用开发中&#xff0c;跟数据库之间的交互是必不可少的&#xff0c;SpringBoot也提供了两种跟数据库交互的方式。 1. 使用JdbcTemplate 在SpringBoot中提供了JdbcTemplate模板类&#xff0c;JdbcTemplate提供的方法进行增删改查的操作。 首先需要在pom文件中添加依赖:…