如何创建可以接收对象的[HttpPost]?

Posted

技术标签:

【中文标题】如何创建可以接收对象的[HttpPost]?【英文标题】:How to create [HttpPost] that can receive an object? 【发布时间】:2020-08-29 15:20:14 【问题描述】:

我想从我的客户端代码通过HttpResponseMessage 发送一个对象,然后在服务器端读取该对象并将userId 保存在旁边。

我的客户端是这样的:

public async Task<ViewResult> Add(Car car)

        Car c;

        using (Database db = new Database())
        
            c = db.Cars.First(x => x.Id == car.Id);
        

        HttpClient client = new HttpClient();
        string json = JsonConvert.SerializeObject(c);
        HttpContent httpContent = new StringContent(json);           

        string url = "https://localhost:5001/api/cars/Saved/userId = " + AccountController.curentUser;    
        HttpResponseMessage response = await client.PostAsync(url, httpContent);

        return View("~/Views/Car/PreviewCar.cshtml");

在服务器端,它应该看起来像这样

[HttpPost("Saved/userId = userId")]
public async Task<ActionResult<CarS>> PostSavedCar(string userId) 

        // car = get from client side 

        car.UserId = userId;
        _context.SavedCars.Add(car);
        await _context.SaveChangesAsync();

        return CreatedAtAction("GetSavedCar", new  id = car.Id , car);

我不知道我应该在那个注释部分放什么来获取对象然后反序列化它?

【问题讨论】:

我看不出你在哪里告诉服务器期待 JSON。也许看看这个Send JSON via POST in C# and Receive the JSON returned? 【参考方案1】:

在您的客户端中设置内容类型 json:

HttpContent httpContent = new StringContent(json, Encoding.UTF8,"application/json"); 

还有你的 API:

[HttpPost("Saved/userId = userId")]
public async Task<ActionResult<CarS>> PostSavedCar([FromBody]Car car, string userId) 

       car.UserId = userId;
        _context.SavedCars.Add(car);
        await _context.SaveChangesAsync();

        return CreatedAtAction("GetSavedCar", new  id = car.Id , car);

实际上您不需要单独传递 userId - 为什么不在客户端设置 car.UserId ,因为您已经知道它是什么值(或者甚至更好,设置它在服务器端)?这样你就可以在请求正文中传递 car。

【讨论】:

我已经尝试过了,但是如果我在方法中添加额外的参数,我的客户端将返回代码 415 - 'Unsupported Media Type'。 我已经编辑了我的答案 - 您需要将内容类型设置为“application/json”

以上是关于如何创建可以接收对象的[HttpPost]?的主要内容,如果未能解决你的问题,请参考以下文章

HttpClient使用总结

HttpClient使用详解

如何使用动态对象类创建 .net 核心 MVC 模型?

如何使用HttpClient

Android:如何使用证书做 HttpPost

c# MVC 如何接收 Json 数据