如何使用 HttpClient 将 JSON 数据发布到 Web API

Posted

技术标签:

【中文标题】如何使用 HttpClient 将 JSON 数据发布到 Web API【英文标题】:How to Post JSON data to a Web API using HttpClient 【发布时间】:2016-07-06 10:24:40 【问题描述】:

我有以下代码,基本上它接受一个动态对象(在这种情况下是类型文件)并使用HTTPClient 类尝试向WebAPI controller POST,我遇到的问题是控制器我的 [FromBody] 参数上的值总是得到 NULL

代码

var obj = new
        
            f = new File
            
                Description = description,
                File64 = Convert.ToBase64String(fileContent),
                FileName = fileName,
                VersionName = versionName,
                MimeType = mimeType
            ,
        

var client = new HttpClient(signingHandler)

   BaseAddress = new Uri(baseURL + path) //In this case v1/document/checkin/12345
;

client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));                        

HttpResponseMessage response;
action = Uri.EscapeUriString(action);

//Obj is passed into this, currently it is of type File 
var content = new StringContent(JsonConvert.SerializeObject(obj).ToString(),
            Encoding.UTF8, "application/json");

response = client.PostAsync(action, content)).Result;
if (response.IsSuccessStatusCode)
     
    var responseContent = response.Content;                
    string responseString = responseContent.ReadAsStringAsync().Result;
    return JsonConvert.DeserializeObject<T>(responseString);

控制器

[HttpPost]
[Route("v1/document/checkin/id:int")]
public void Checkin_V1(int id, [FromBody] File f)

        //DO STUFF - f has null on all of its properties

型号

public class File

    public string FileName  get; set; 
    public string VersionName  get; set; 
    public string Description  get; set; 
    public string MimeType  get; set; 
    public byte[] Bytes  get; set;
    public string File64  get; set; 

模型在WebAPI 和客户端应用程序上共享。

任何关于为什么失败的帮助将不胜感激,现在已经绕了一段时间了。

【问题讨论】:

【参考方案1】:

不需要你一开始的 obj。那就是将 f 嵌套在另一个对象中。

var obj = new
    
        f = new File
        
            Description = description,
            File64 = Convert.ToBase64String(fileContent),
            FileName = fileName,
            VersionName = versionName,
            MimeType = mimeType
        ,
    

改成

var f = new File

    Description = description,
    File64 = Convert.ToBase64String(fileContent),
    FileName = fileName,
    VersionName = versionName,
    MimeType = mimeType
;

然后只需序列化 f。

【讨论】:

【参考方案2】:

我认为你的这部分代码有问题

    var obj = new
    
        f = new File
        
            Description = description,
            File64 = Convert.ToBase64String(fileContent),
            FileName = fileName,
            VersionName = versionName,
            MimeType = mimeType
        ,
    

因为这将与您真正需要的序列化不同。 试试这个

   var obj =  new File
        
            Description = description,
            File64 = Convert.ToBase64String(fileContent),
            FileName = fileName,
            VersionName = versionName,
            MimeType = mimeType
        

【讨论】:

以上是关于如何使用 HttpClient 将 JSON 数据发布到 Web API的主要内容,如果未能解决你的问题,请参考以下文章

httpclient - 如何将 Content-Disposition 设置为“application/json;”在多部分

使用 HttpClient 发布 JSON 数据时出现错误 400

使用HttpClient+Json解析器爬取数据并存入数据库

Android JSON HttpClient 使用 HttpResponse 将数据发送到 PHP 服务器

Angular:如何将来自 HttpClient 请求的 JSON 结果映射到类实例?

如何通过 HttpClient 在 POST 请求中将 JSON 数据作为正文发送