当前位置: 首页 > 知识库问答 >
问题:

我可以添加具有向后兼容性的[FromBody]参数吗?

乜思淼
2023-03-14

我的endpoint没有[FromBody]参数:

    [HttpPost("{id:int}/publish")]
    public async Task<IActionResult> Publish()
    {
        <do some stuff>
        return Ok();
    }

但现在我需要添加[FromBody]参数,以便旧代码在没有参数的情况下仍然能够使用此endpoint:

    [HttpPost("{id:int}/publish")]
    public async Task<IActionResult> Publish([FromBody] PublishRequest request)
    {
        <do some stuff>
        return Ok();
    }

但如果我以这种方式添加它,并尝试用空主体调用该endpoint,我将得到415(不支持的媒体类型)响应。

我想使此更改向下兼容。因此,应该可以在没有请求正文和内容类型标头的情况下使用此终结点。有可能吗?

共有2个答案

公宜春
2023-03-14

可以将PublishRequest设置为可选。

[HttpPost("{id:int}/publish")]
public async Task<IActionResult> Publish([FromBody] PublishRequest? request)
{
    // <do some stuff>
    return Ok();
}
宰父焕
2023-03-14

ATM似乎不支持可选的FromBody参数,但在这个github问题中发布了一个可能的解决方法:

public class SomeClassModelBinder : IModelBinder
{
    public async Task BindModelAsync(ModelBindingContext bindingContext)
    {
        var stream = bindingContext.HttpContext.Request.Body;
        string body;
        using (var reader = new StreamReader(stream))
        {
            body = await reader.ReadToEndAsync();
        }
        var someClass = JsonConvert.DeserializeObject<SomeClass>(body);

        bindingContext.Result = ModelBindingResult.Success(someClass);
    }
}

[FromBody, ModelBinder(BinderType = typeof(SomeClassModelBinder))] SomeClass request,
 类似资料:
  • ngrok承诺有关其接口的兼容性和稳定性,以便您可以自信地构建集成顶部,知道在升级到较新版本时期望的更改。 兼容性承诺 Point Release (2.0.0 -> 2.0.1) - ngrok承诺在点发布之间没有突破性的变化 Minor Version Change (2.0 -> 2.1) - ngrok可能会进行小的更改,打破兼容性的次要版本更改。 ngrok承诺,任何破坏性更改将由一个版

  • 确保您可以轻松顺利地升级您的应用程序,这对我们是很重要的。这就是为什么我们只在主 要版本里程碑才会打破兼容性。你可能熟悉 语义版本控制 ,这 就是我们在所有的 CakePHP 项目中使用的通用准则。总之,语义版本控制意味着只有主要版 本(比如2.0,3.0,4.0)可以打破向后兼容性。次要版本(比如2.1,3.1,3.2)可能会引入新 的功能,但不能破坏兼容性。错误修复版本(比如2.1.2,3.0

  • 查看v3规范,新消息似乎是有效的,难道旧的提供程序库(v3.2.13)不支持它吗?我查看了代码,发现了这个commit,在我看来,这似乎是引入更改的地方。 从我的测试来看,新的提供程序库(3.5.12)可以处理新旧格式,但如果类路径中同时存在新的提供程序库和旧的使用者库,http契约测试将失败,并出现运行时错误。 问题:

  • 我正在迁移到Spring Boot2.0,我的Prometheus度量有问题。 我知道千分尺是一种新的操作方法,它不像普罗米修斯的立体式那么简单,但还可以。 我的问题是,如果我现在不想更改我的度量,我就不能升级到Spring Boot2.0。我说的对吗? 我尝试了以下操作: 第1号审判 保持我的实现“原样” 将新的依赖项添加到我的应用程序(执行器已在其中) 更改中的内容以访问endpoint =>

  • 我刚刚将我们的Nexus存储库从OSS 2.14.5-02升级到OSS 3.6.2-01。我将遗留url设置为true(如http://books.sonatype.com/nexus-book/3.1/reference/install.html#config-legacy-url中所述),但是REST API似乎不向后兼容。 例如,以下REST API在我的旧Nexus服务器上工作(它下载ja

  • 问题内容: 我已经编辑了package.json以自定义“开始”脚本,因此它将–debug标志添加到节点: 有没有一种方法可以添加新脚本,例如调试脚本,该脚本可以执行我自定义的“开始”现在正在执行的操作? 我希望能够执行: 问题答案: 在您的package.json中定义脚本 然后您可以使用npm的运行脚本 或更短的版本