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

大摇大摆不调用WebAPI自定义ModelBinder

唐宇定
2023-03-14

目标:我正在设计一个REST API,允许用户在HTTP GET请求的查询字符串上传递参数

http://fake.api.com/search?param1=123

实现:在服务器端,我有一个自定义模型绑定器,可以从请求querystring获取参数,并将其转换为C#对象,这样我的控制器操作方法就不必解析查询字符串。控制器动作方法签名看起来像

public async Task<HttpResponseMessage> Get([ModelBinder]RequestObject request)

当我从Fiddler测试api并传递querystring值时,自定义模型绑定器工作,我在控制器操作中得到具有正确值的c#对象。

但是当我用Swagger测试时,模型绑定器没有被调用,操作参数中的值为空。模型参数是单独显示的,而不是显示模型。

我该怎么解决这个问题?

我的自定义模型绑定器:

   public class RequestObjectModelBinder : IModelBinder
    {
        public bool BindModel(HttpActionContext actionContext, ModelBindingContext bindingContext)
        {
            if (bindingContext.ModelType != typeof(RequestObject))
            {
                return false;
            }

            var searchCriteria = new RequestObject();
            var type = searchCriteria.GetType();

            var querystringVals = actionContext.Request.GetQueryNameValuePairs();
            var keyValuePairs = querystringVals as IList<KeyValuePair<string, string>> ?? querystringVals.ToList();
            if (!keyValuePairs.Any())
            {
                bindingContext.Model = searchCriteria;
                return true;
            }

            foreach (var value in keyValuePairs)
            {
                var key = value.Key;
                var prop = type.GetProperty(key, BindingFlags.IgnoreCase | BindingFlags.Public | BindingFlags.Instance);
                if (prop == null)
                {
                    continue;
                }

                prop.SetValue(searchCriteria, Convert.ChangeType(value.Value,prop.PropertyType), null);
            }

            var validationResults = new Collection<ValidationResult>();
            var isValid = Validator.TryValidateObject(searchCriteria, new ValidationContext(searchCriteria, null, null), validationResults, true);
            if (!isValid)
            {
                foreach (var result in validationResults)
                {
                    bindingContext.ModelState.AddModelError("", result.ErrorMessage);
                }
            }

            bindingContext.Model = searchCriteria;

            return true;
        }

共有2个答案

夏祺然
2023-03-14

试试这个:-

public async Task<HttpResponseMessage> Get([FromUri][ModelBinder]RequestObject request)
公冶嘉茂
2023-03-14
[HttpGet]
public async Task<HttpResponseMessage> Get([FromUri]RequestObject request)

如果RequestObject具有以下签名,则应该工作:

public class RequestObject
{
    public string param1 { get; set; }

    public string param2 { get; set; }

    public int pageSize { get; set; }
}

如果你只有这三个参数,而且它们很少使用,你也可以这样做:

public async Task<HttpResponseMessage> Get(
    [FromUri(Name="param1")] string parameterOne, 
    [FromUri(Name="param2")] string parameterTwo, 
    [FromUri(Name="pageSize")] int pageSize)

请注意查询字符串名称与方法参数名称有何不同。

使现代化

似乎您缺少使用自定义模型绑定器标记方法或类,例如:

public async Task<HttpResponseMessage> Get([ModelBinder(typeof(RequestObjectModelBinder)]RequestObject request)

如果你不止一次使用一个类,你也可以标记实际的类,例如。

[ModelBinder(typeof(RequestObjectModelBinder)
public class RequestObject {}
 类似资料:
  • 我有一个java项目(tomcat webapp)和一些REST Api。我想为他们生成大摇大摆的文档。我从本教程(github)开始。我没有maven我们使用蚂蚁任务。我加入了swagger-annotations-1.5.0。jar和所有随swagger jaxrs jar 1.5.0版本附带的jar(如果有用的话,我可以包括一个完整的列表),我已经注释了一些方法,我有一个如下的配置类: }

  • 我创建了一个新的Web Api项目,添加了ASP.NET标识并配置了OAuth,如下所示: 谢了。 另外,我应该说Swagger文档对我所有的控制器都适用,只是我忽略了一个明显的方法--如何登录。

  • 我想从spring boot 2中切换到Micronaut框架。而我也在为那些大摇大摆的场景而挣扎。 在spring boot 2项目中,我有以下依赖项: 和swaggreconfig.class: 它可以很好地启动swagger-ui和spring boot 2应用程序。 我应该向maven添加哪些依赖项,我应该创建哪些类来为Micronaut项目获得相同的结果?

  • 我们在我们的泽西应用程序中使用了@Role允许注释来限制用户对应用编程接口某些部分的访问。我们如何在SwaggerUI中显示这些信息? 到目前为止,我已经用@ApiOperation注释了方法以显示in/out参数,并尝试使用@Authorization/@AuthorizationScope,但我只为我们不使用的oauth2显示了它。最接近out case的是ApiKeyAuthDefiniti

  • 我正在使用Spring Boot2开发一个REST api。我在build.gradle文件中为Swagger2和Swagger-UI添加了SpringFox依赖项,如下所示: 不幸的是,像@enableswagger2这样的大摇大摆的注释似乎没有被识别出来。我该怎么办?

  • 有没有人用spring-data-rest配置了swagger。我知道swagger有DocumentationConfig类,它扫描所有spring-mvc请求映射。但是,如何将其用于spring-data-rest,因为没有定义显式的请求映射。非常感谢在这方面的任何帮助。此外,我还想知道,是否有其他支持Spring-Data-REST的文档框架。