HttpClient来自官方的JSON扩展方法

原文:HttpClient来自官方的JSON扩展方法

System.Net.Http.Json

Json的序列化和反序列化是我们日常常见的操作,通过System.Net.Http.Json我们可以用少量的代码实现上述操作.正如在github设计文档中所描述

Serializing and deserializing JSON payloads from the network is a very
common operation for clients, especially in the upcoming Blazor
environment. Right now, sending a JSON payload to the server requires
multiple lines of code, which will be a major speed bump for those
customers. We‘d like to add extension methods on top of HttpClient that
allows doing those operations with a single method call.

他的依赖项也非常的少目前只依赖System.Net.Http, System.Text.Json

System.Text.Json相对于Newtonsoftjson平均快了两倍,如果有兴趣相关基准测试可在这个文章中查阅

https://devblogs.microsoft.com/dotnet/try-the-new-system-text-json-apis/

在.NET中安装和使用

目前它还是预览版本

dotnet add package System.Net.Http.Json
public static async Task<Customer> GetCustomerAsync()
{
    HttpClient clinet=new HttpClient();
    var request = new HttpRequestMessage(HttpMethod.Get, "http://localhost:5000/customers");
    var response = await clinet.SendAsync(request);
    return await response.Content.ReadFromJsonAsync<Customer>();
}

通过ReadFromJsonAsync直接可以反序列化

public static async Task<Customer> CreateCustomerAsync()
{
    HttpClient clinet = new HttpClient();
    var customer=new Customer()
    {
        Id = "1",
        Name = "Fh"
    };
    var request = new HttpRequestMessage(HttpMethod.Post, "http://localhost:5000/create");
    request.Content = JsonContent.Create(customer);
    var response = await clinet.SendAsync(request);
    var content=response.Content.ReadAsStringAsync();
    return customer;
}

还可以以下面这种简洁方式使用

_client.GetFromJsonAsync<IReadOnlyList<Customer>>("/customers");
_client.GetFromJsonAsync<Customer?>($"/customers/{id}");
_client.PutAsJsonAsync($"/customers/{customerId}", customer);
if (response.IsSuccessStatusCode)
{
    try
    {
        return await response.Content.ReadFromJsonAsync<User>();
    }
    catch (NotSupportedException) // When content type is not valid
    {
        Console.WriteLine("The content type is not supported.");
    }
    catch (JsonException) // Invalid JSON
    {
        Console.WriteLine("Invalid JSON.");
    }
}

还可以通过NotSupportedException和JsonException异常类处理相应的异常.

Reference

https://github.com/hueifeng/BlogSample/tree/master/src/SYSTEMNETHTTPJSON

https://www.stevejgordon.co.uk/sending-and-receiving-json-using-httpclient-with-system-net-http-json

https://github.com/dotnet/designs/blob/d4018c99c8134e9114a869e2e73a050059b9e663/accepted/2020/json-http-extensions/json-http-extentions.md

原文地址:https://www.cnblogs.com/lonelyxmas/p/12695998.html

时间: 04-14

HttpClient来自官方的JSON扩展方法的相关文章

swift 官方获取JSON 数据方法

var url = NSURL(string: "http://www.weather.com.cn/data/sk/101120501.html") var data = NSData(contentsOfURL: url!, options: NSDataReadingOptions.DataReadingUncached, error: nil) var json : AnyObject! = NSJSONSerialization.JSONObjectWithData(data

扩展方法为我们带来了什么

一 发现问题 扩展方法的思考来源于这样的一次经历:在项目中开发程序时,经常这样使用List<T>和Dictionary<K,V>. <span style="white-space:pre"> </span> List<string> listTest = new List<string>(); listTest.ForEach(item => { //方法体略 }); Dictionary<strin

扩展方法对json序列化及反序列化

this+类型名+变量名,.NET 3.0 之后新增的一种特性,叫"扩展方法". int类型变量都能调用toString()方法,将int类型变量转换成string型变量:如果需要更改转换的形式,比如将int类型变量转换成指定格式的字符串,并且这种方法调用非常频繁,可以编写扩展方法.扩展方法能够向现有类型"添加"方法,而无需创建新的派生类型.重新编译或以其他方式修改原始类型.扩展方法是一种特殊的静态方法,但可以像扩展类型上的实例方法一样进行调用. 例如下列代码: n

Unity 中实用的 C# 扩展方法

Unity 内置组件基本没有可以继承的.某些比较常用但现有 API 没有定义的功能,我们可以通过 C# 的扩展类方法来实现(注意一点,扩展方法对于值类型传递的不是引用,所以无法修改原对象.并且传递体积较大的值类型可能造成性能问题).下面是一些比较实用的扩展方法,这些扩展方法的实现很多使用了 C# 的委托,关于委托可以参考这里:C# 中的 delegate, Lambda 和 event. 扩展 Transform 每一个 GameObject 都含有一个 Transform 组件(在 UGUI

C#中的扩展方法及用途

GPS平台.网站建设.软件开发.系统运维,找森大网络科技!http://cnsendnet.taobao.com来自森大科技官方博客http://www.cnsendblog.com/index.php/?p=476 扩展方法使你能够向现有类型"添加"方法,而无需创建新的派生类型.重新编译或以其他方式修改原始类型. 扩展方法是一种特殊的静态方法,但可以像扩展类型上的实例方法一样进行调用. 以上是msdn官网对扩展方法的描述,现在我通过一个情景例子来对此进行阐释.假设一个控制台程序cla

C#3.0 扩展方法

扩展方法 在很多时候我们需要编写各种各样的帮助类,因为官方提供的再全面,也会有未包含到的地方,这时一个静态的帮助类就可以帮我们解决问题 举一个不是很恰当的例子,假如要对一个字符串进行验证其内容不为null并且等于admin但是很多地方都要调用,按照封装思想要封装成一个方法,看起来可能是下面这样子的 这并没有任何问题,代码也是比较简单,但是很难会有一种亲近感,因为StringiHelper.ValidArg这样的调用存在.比如这个验证应该是官方应该考虑到的,但是他们忽略了,编写这样一个扩展后会有很

List扩展方法汇总(仅备注)

不管在c/s还是b/s的c#语言开发程序中,经常会用到List的扩展方法,尤其在json格式的数据和服务端交互越来越流行,很多时候总是在开发使用到的时候才去搜索有些扩展方法或者linq的用法,在这里,我们只是做一个备注 因为linq没有必要系统的学习,我们只要简单的在list的扩展会使用即可,至少我只这么认为的 本文没有任何技术性,只是备注list或者list泛型的扩展方法,不至于在您不熟悉但是又使用到的时候到处搜索 1 public sealed class Employee 2 { 3 pu

来自阿里的 json 解析方案 fastjson

说起Json 解析,有很多方法,无论是出自Google 的Gson也好,还是来自其他的某某,想必大家都很熟悉.今日在github上闲逛,偶遇 一 json 解析库,看起来很不错,据说是目前最快的解析JOSN 方案.该东东为何神器,他就是来自于阿里团队的  fastjson. 为了方便起见,参考如下代码. 用maven 的同学就方便多了,直接双击打开你的pom.xml 文件,添加如下依赖 <dependency> <groupId>com.alibaba</groupId>

DataTable扩展方法ToList&lt;T&gt;()、ToJSON()、ToArrayList()

/// <summary> /// 扩展方法类 /// </summary> public static class CommonExtension { /// <summary> /// 数据类型对应转换方法字典 /// </summary> static Dictionary<Type, Func<object, object>> dic_convert = new Dictionary<Type, Func<obje

Jquery自定义扩展方法

jquery是一款流行的JS框架,自定义JS方法,封装到Jquery中,调用起来也挺方便的,怎么写Jquery扩展方法那,网上翻阅了一部分代码,其实也挺简单的: 方式一: (jQuery.fn.setApDiv=function () { //apDiv浮动层显示位置居中控制 var wheight=$(window).height(); var wwidth=$(window).width(); var apHeight=wheight-$("#apDiv").height(); v