当我发出 http put 请求时,内容始终为空

Posted

技术标签:

【中文标题】当我发出 http put 请求时,内容始终为空【英文标题】:Content is always null when I make a http put request 【发布时间】:2021-04-28 17:33:58 【问题描述】:

我有一个可以工作的 Web API。现在我正在为其编写集成测试,但是当我通过测试发出 PUT 请求时,[FromBody] 数据始终为空。 RequestData 是我创建的一个 protobuf 类型。

这是 API 方法的签名:

public async Task<Response> SomePutMethod(string id, [FromBody] RequestData data)

在我的测试中,我这样称呼它:

var request = new RequestData()
    
HttpContent content = new StringContent(JsonConvert.SerializeObject(request), Encoding.UTF8, "application/json");
content.Headers.ContentType = new MediaTypeHeaderValue("application/json");
    
_client.DefaultRequestHeaders.Accept.Clear();
_client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
    
var putResult = await _client.PutAsync(uri + "?id=1", content);

我还尝试Jsonformatter.Default.Format 将 protobuf 对象转换为 json 字符串,但这也不起作用。

【问题讨论】:

嗨@an007,有关于这个案例的最新消息吗? 【参考方案1】:

使用来自System.Net.Http.Formatting.HttpClientExtensions 的扩展名PutAsJsonAsync()

var data = new RequestData();
var resp = await _client.PutAsJsonAsync("https://www.example.com", data);

或者,使用SendAsync()

using(var req = new HttpRequestMessage(HttpMethod.Put, "https://www.example.com/"))

    req.Headers.Accept.Add(new 
        MediaTypeWithQualityHeaderValue("application/json"));
    req.Content = new StringContent(JsonConvert.SerializeObject(request), 
        Encoding.UTF8, "application/json");
    using(var resp = await _client.SendAsync(req))
    
        resp.EnsureSuccessStatusCode();
        resp.Content.ReadAs...
    

【讨论】:

它仍然为空。双向 如果端点被命中并且正文为空,那么您的模型不匹配。真的没有其他方法可以完成您正在尝试做的事情。您在问题中说端点有效,只是在编写测​​试以使用它时无效。 那么他们为什么不匹配?我做错了什么【参考方案2】:

我通过测试发出PUT请求,[FromBody]数据始终为空。

请检查您的 RequestData 类并确保您定义了公共属性,如下所示。

public class RequestData

    public string Content  get; set; 

    //...
    //other properties

如果您将它们定义为没有 getset 访问器的字段,这可能会导致问题。

此外,请检查您在创建RequestData 类的实例并使用该request 对象填充StringContent 时是否为每个属性分配了值。

var request = new RequestData();

request.Content = "hello world";
//...

【讨论】:

以上是关于当我发出 http put 请求时,内容始终为空的主要内容,如果未能解决你的问题,请参考以下文章

MERN API 请求,不知道如何发出 put 请求并正确更新

当连接是移动数据 xamarin 表单时,无法在服务器上发出 Put 和 Post 请求

如何使用http在angular2中发出请求?

使用 PUT http 动词时通过查询参数传递 Oauth2 令牌?

.net 核心请求列表参数始终为空

HttpServletRequest 参数映射始终为空 [关闭]