使用 System.Net.Http.Json 简化 HttpClient 的使用

使用 System.Net.Http.Json 简化 HttpClient 的使用

Intro

从 .NET Core 3.1 开始,微软添加了一个 System.Net.Http.Json 的扩展,可以用来简化 HttpClient 的使用,看到在很多项目里还并未开始使用,所以想向大家介绍一下

Sample

PostAsJson/PutAsJson

PostAsJson sample:

const string url = "http://localhost:5000/api/values";
using var httpClient = new HttpClient();using var response = await httpClient.PostAsJsonAsync(url, new Category()
{Id = 1,Name = "Test"
});
response.EnsureSuccessStatusCode();

PutAsJson:

using var response = await httpClient.PutAsJsonAsync(url, new Category()
{Id = 1,Name = "Test"
});
response.EnsureSuccessStatusCode();

简单来说就是会把一个对象变成 JSON request body

目前支持 Post 和 Put 方法 默认的序列化方式和 ASP.NET Core 是一致的,会变成 camalCase, 例如

4fec051695dbb8114f9391dedfd54cfd.png


如果要自定义序列化,可以传入一个 JsonSerializerOptions,如:

using var response = await httpClient.PostAsJsonAsync(url, new Category()
{Id = 1,Name = "Test"
}, new JsonSerializerOptions());
response.EnsureSuccessStatusCode();
e051de8a80837d82428b017bb723a493.png

可以看到这个例子中的 body 和之前有所不同了,这正是因为我们使用了自定义的 JsonSerializerOptions

GetFromJsonAsync

var result = await httpClient.GetFromJsonAsync<ResultModel>(url);
ArgumentNullException.ThrowIfNull(result);
Console.WriteLine($"{result.Status}: {result.ErrorMsg}");

和上面的 AsJson 相对应,这个是从 Response body 到一个对象,同样地也支持自定义 JsonSerializerOptions,可以自己尝试一下

ReadFromJsonAsync

using var response = await httpClient.PutAsJsonAsync(url, new Category()
{Id = 1,Name = "Test"
});
response.EnsureSuccessStatusCode();
var result = await response.Content.ReadFromJsonAsync<ResultModel>();
ArgumentNullException.ThrowIfNull(result);
Console.WriteLine($"{result.Status}: {result.ErrorMsg}");

直接从 HttpContent 中读取 json 对象

JsonContent.Create

using var content = JsonContent.Create(new Category() { Id = 1, Name = "Test" });
using var response = await httpClient.PostAsync(url, content);
response.EnsureSuccessStatusCode();

从一个对象构建 HttpContent ,同样支持自定义序列化

MoreSample

使用前后的一些对比:

f7fd95ac6122dfa06b2042acd17de8dc.png

a8e63c07270af1c356604ef1ba66dbf4.png

b7c657f472e64db0f8d1e595cba0145d.png

More

JSON现在已经非常的普遍了,这一扩展可以使得 HttpClient 处理 JSON 更为简单,而且从 .NET 6 开始已经包含在了框架中,不需要再手动引用 nuget 包了

在 .NET 7 中会增加一个 PatchAsJsonAsync 的扩展方法,目前发布的 Preview 1 已经可用,使用方法类似于 PostAsJsonAsync/PutAsJsonAsync,HttpMethod 是 Patch

另外觉得应该有一个类似于 GetFromJsonAsyncDeleteFromJsonAsync,提了一个 issue,感兴趣的可以关注一下:https://github.com/dotnet/runtime/issues/65617

如果返回的 response 状态码不是 2xx,GetFromJsonAsync 会抛异常,如果是不合法的 JSON 也会抛出异常

References

  • https://github.com/dotnet/runtime/issues/65617

  • https://github.com/dotnet/runtime/tree/main/src/libraries/System.Net.Http.Json/src/System/Net/Http/Json

  • https://github.com/WeihanLi/SamplesInPractice/blob/master/HttpClientTest/JsonExtensionSample.cs

  • https://github.com/OpenReservation/ReservationServer/commit/d07f9dc5ae292dd748d7f7a879898009c198d70d

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

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

相关文章

MySQL的四种不同查询的分析

1.前置条件&#xff1a;本次是基于小数据量&#xff0c;且数据块在一个页中的最理想情况进行分析&#xff0c;可能无具体的实际意义&#xff0c;但是可以借鉴到各种复杂条件下&#xff0c;因为原理是相同的,知小见大&#xff0c;见微知著&#xff01;打开语句分析并确认是否已经…

乐观锁的概念

乐观锁&#xff1a; 大多数是基于数据版本&#xff08;version&#xff09;的记录机制实现的。即为数据增加一个版本标识&#xff0c;在基于数据库表的版本解决方案中&#xff0c;一般是通过为数据库表添加一个“version”字段开实现读取数据时&#xff0c;将此版本号一同读出&…

.NET6之MiniAPI(十八):OpenAPI swagger

从本篇开始&#xff0c;介绍一些很不错的三方库&#xff0c;来丰富MiniAPI的使用。在创建MiniAPI项目时&#xff0c;模板提供了一个是否启用OpenAPI的选项&#xff0c;足见这个三方库的优势和强大。OpenAPI为我们测试API提供了强大的支持&#xff0c;调用API的开发人员&#xf…

查看linux内存还剩多少g,Linux 查看存储空间、内存以及清除内存

查看存储空间&#xff1a;zdsubuntu ~ $ df -hl文件系统 容量 已用 可用 已用% 挂载点udev 972M 0 972M 0% /devtmpfs 199M 6.3M 192M 4% /run/dev/sda1 23G 5.3G 17G 25% /tmpfs 992M 212K 991M 1% /dev/shmtmpfs 5.0M 4.0K 5.0M 1% /run/locktmpfs 992M 0 992M 0% /sys/fs/cg…

Android之ndk-build出现c:28:51: error: ‘get_string‘ undeclared here (not in a function)解决办法

1 problem ndk-build error: get_string undeclared here (not in a function) 2 resolve jstring get_strstring(JNIEnv* env, jobject thiz) {return (*env)->NewStringUTF(env, "I am chenyu, 动态注册JNI"); }jint add_int(JNIEnv* env, jobject jobj, ji…

c/c++与java------之JNI学习(一)

一、java 调用c/c 步骤&#xff1a; 1、在java类中创建一个native关键字声明的函数 2、使用javah生成对应的.h文件 3、在c/c中实现对应的方法 4、使用vs2012创建一个win32空白项目&#xff0c;将jdk中的jni.h和jni_md.h文件拷贝到工程中&#xff0c;修改项目属性为&#xff08;…

BeetleX服务网关授权配置

很多应用服务都需要授权访问&#xff0c;为了更好地统一处理这种授权验证&#xff0c;服务网关提供了JWT验证插件用于解决这问题。网关的JWT验证插件默认是关闭的&#xff0c;只有当开启后网关才会对请求进行拦截验证处理。开启开启JWT验证需要在插件管理里开启Webapi JWT验证插…

关于Spring的事务Transactional,锁同步,并发线程

Spring事务传播机制和数据库隔离级别 在标准SQL规范中定义了4个事务隔离级别&#xff0c;不同隔离级别对事务处理不同 。 未授权读取&#xff08;Read Uncommitted&#xff09;&#xff1a; 也称 未提交读。允许脏读取但不允许更新丢失&#xff0c;如果一个事务已经开始写数据则…

linux 编译指cpu内核,linux内核编译与配置

linux是如何组成的&#xff1f;答&#xff1a;linux是由用户空间和内核空间组成的为什么要划分用户空间和内核空间&#xff1f;答&#xff1a;有关CPU体系结构&#xff0c;各处理器可以有多种模式&#xff0c;而LInux这样的划分是考虑到系统的安全性&#xff0c;比如X86可以有4…

Linux下的压缩与解压缩

tar命令zip命令unzip命令gzip命令bzip2命令tar命令&#xff1a;压缩和解压缩tar格式的文件格式&#xff1a;tar [主选项辅选项] 文件或目录【主选项告诉tar要做什么事&#xff0c;是必须要有的&#xff0c;辅选项是辅助使用的&#xff0c;和通常的选项一样&#xff0c;可选】主…

Android之JNI动态注册native方法和JNI数据简单使用

1、爆结果照片 2、介绍JNI注册方式 JVM 查找 native 方法有两种方式: 1)、按照 JNI 规范的命名规则(静态注册) 2) 、调用 JNI 提供的 RegisterNatives 函数,将本地函数注册到 JVM 中(动态注册) 静态注册的实现可以参考我的这篇博客 http://blog.csdn.net/u01…

保存现场数据和状态:onSaveInstanceState\onRestoreInstanceState\onCreate()

当某个activity变得“容易”被系统销毁时&#xff0c;该activity的onSaveInstanceState就会被执行&#xff0c;除非该activity是被用户主动销毁的&#xff0c;例如当用户按BACK键的时候。 注意上面的双引号&#xff0c;何为“容易”&#xff1f;言下之意就是该activity还没有被…

setTimeout(function(){}, 0);

1 for (var i 0; i < 3; i) { 2 setTimeout(function() { 3 console.log(i); 4 }, 0); 5 console.log(i); 6 } 结果是&#xff1a; 0 1 2 3 3 3 分析&#xff1a; 1、在实践中&#xff0c;setTimeout 会在其完成当前任何延迟事件的事件处理器的执行&am…

Linux怎么查询全部容器时间,linuxea:如何单单修改docker容器的系统时间

一般情况下&#xff0c;我们仅仅需要修改容器的时间与我们宿主机的实际实际一致即可&#xff0c;我们知道&#xff0c;默认情况下docker容器是不允许访问系统时钟&#xff0c;但是有一款开源的软件使这样的需求变成了可能。此lib拦截用于检索当前时间和日期的所有系统调用&…

关闭系统索引(转)

转自“http://jingyan.baidu.com/article/d621e8daeaaa392865913f0a.html” 关闭系统索引 Windows索引服务是为文件、电子邮件和其他内容提供内容索引、属性缓存和搜索结果。 Windows系统在安装完成后&#xff0c;会逐步创建特定文件、文件夹和其它目标的索引&#xff0c;例如开…

Android之ndk中JNIENV env->NewStringUTF (*env)->NewStringUTF

JNIEnv是指向可用JNI函数表的接口指针&#xff0c;原生代码通过JNIEnv接口指针提供的各种函数来使用虚拟机的功能。JNIEnv是一个指向线程-局部数据的指针&#xff0c;而线程-局部数据中包含指向线程表的指针。实现原生方法的函数将JNIEnv接口指针作为它们的第一个参数。 原生代…

最佳新秀Java(22)——再次了解泛型

仿制药Java SE 1.5新功能。通用自然是参数化类型。即操作数据类型被指定为一个参数。这样的参数类型可以在课堂上使用、创建的接口和方法&#xff0c;他们被称为通用类、、泛型方法。Java语言引入泛型的优点是安全简单。规则和限制1、泛型的类型參数仅仅能是类类型&#xff08;…

如何编译 dotnet/aspnetcore 源代码

前言最近&#xff0c;准备为 dotnet/aspnetcore 修改 issue&#xff0c;但是在 clone 代码后&#xff0c;发现要编译成功&#xff0c;远没有想象中那么容易。因此&#xff0c;将整个过程进行记录&#xff0c;以供大家参考。以下操作都是在 Windows 10 下完成。0.环境准备详见官…

查看Linux进程CPU过高具体的线程堆栈(不中断程序)

转自&#xff1a;http://blog.csdn.net/mergerly/article/details/47731305 1、TOP命令&#xff0c;找到占用CPU最高的进程 [plain] view plaincopy $ top top - 20:11:45 up 850 days, 1:18, 3 users, load average: 1.04, 1.01, 0.99 Tasks: 61 total, 1 running, …

linux 编译工具链,Linux工具链for TKStudio下载_Linux工具链for TKStudio官方下载-太平洋下载中心...

Linux工具链for TKStudio是一款支持TKStudio IDE集成开发环境的辅助LINUX交叉编译工具链软件&#xff0c;交叉编译就是跨架构编译&#xff0c;编译出来的程序不能在本机执行(当然有例外情况)。所以这个时候就需要交叉编译工具链。译工具链一般最简化的为 binutils gcc glibc …