HttpClient 提交 JSON数据

常见数据格式

  • application/x-www-form-urlencoded
    这也是最常见的 POST 提交数据的方式,一般是用来提交表单。

  • multipart/form-data
    上传文件时通常采用的数据格式

  • application/json
    API接收和返回的常见格式

  • text/xml
    可能还有一些数据交换的场景采用的格式

关于 HttpContent

HttpContent 是一个抽象类

public abstract class HttpContent: IDisposable
{
    protected HttpContent();
    public HttpContentHeaders Headers
    {
        get;
    }
    public Task CopyToAsync(Stream stream, TransportContext context);
    public Task CopyToAsync(Stream stream);
    public void Dispose();
    public Task LoadIntoBufferAsync();
    public Task LoadIntoBufferAsync(long maxBufferSize);
    public Task < byte[] > ReadAsByteArrayAsync();
    public Task < Stream > ReadAsStreamAsync();
    public Task < string > ReadAsStringAsync();
    protected virtual Task < Stream > CreateContentReadStreamAsync();
    protected virtual void Dispose(bool disposing);
    protected abstract Task SerializeToStreamAsync(Stream stream, TransportContext context);
    protected internal abstract bool TryComputeLength(out long length);
}

那我们就不可能直接创建HttpContent的实例, 而需要去找他的实现类, 如下四个:
MultipartFormDataContent、FormUrlEncodedContent、StringContent、StreamContent

和4中常见数据格式对应一下:

MultipartFormDataContent =》 multipart/form-data

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

StringContent =》 application/json等

StreamContent =》 binary

HttpClient 提交Json 数据

在谈如何处理JSON前,插入一个form表单提交的示例代码

//请求Body
var body = new Dictionary <string,string> ()
    {
        {
            "from", "sender"
        },
        {
            "to", "receiver"
        }
    };
HttpContent content = new FormUrlEncodedContent(body);
var response = client.PostAsync(apiAddress, content).Result;

这里也考虑仿照表单提交的情况,有个特殊格式的HttpContent 继承类,接收一个对象变量

json本质上还是一种特殊的字符串格式,我们可以 在StringContent的基础上创建一个子类,接收对象变量,转换成字符串,增加application/json 的表头信息

创建一个新的类

public class JsonContent : StringContent
{
     public JsonContent(object obj) :
        base(JsonConvert.SerializeObject(obj), Encoding.UTF8, "application/json")
       { }
}
posted @ 2020-01-21 16:05  elef  阅读(1436)  评论(0编辑  收藏  举报