【问题标题】:Passing complex parameters with MVC4 RESTful web api使用 MVC4 RESTful web api 传递复杂的参数
【发布时间】:2012-05-20 04:28:49
【问题描述】:

我正在尝试将复杂对象发送到 MVC4 Web api 控制器:

public class DnsController : ApiController
{

        public IEnumerable<DnsARecord> GetDnsARecords(DnsServer dnsServer, string domainName)
        {...

我希望从 HttpClient 调用它:

var httpClient = new HttpClient();

        // Send a request asynchronously continue when complete
        httpClient.GetAsync(dnsApiUrl).ContinueWith(...

我从"Introduction to HttpClient" 示例中借用的上述代码 - 代码在页面上列出。

我想知道我应该如何传递这两个参数。我假设需要进行一些预处理。

【问题讨论】:

    标签: asp.net-mvc-4 asp.net-web-api


    【解决方案1】:

    您可以在 HTTP-GET 查询字符串中传递任意数量的参数。只需将路由模板添加到服务器即可。

    var server = new HttpSelfHostServer();
    server.Routes.MapHttpRoute("DnsQuery", "api/{controller}/dnsserver={DnsServer}&domain={domainName}");
    

    为 dnsserver 和 domain 传入的值现在将映射到您的 GET 方法参数。


    编辑: 或者,您也可以在 HTTP POST 的正文中传递复杂的对象。您可以选择的三种原生格式是 JSON、XML 或 UrlEncoded Query String。 MVC4 知道如何将这些数据格式映射到简单的变量,例如字符串(只需确保 xml 元素名称与您希望它们映射到的参数名称相同。此外,发送请求的客户端必须确保内容类型必须是设置为适当的值(Application/JSON、Text/XML、application/x-www-form-urlencoded)。

    <DnsInfo>
        <DnsServer>0.0.0.0</DnsServer>
        <Domain>YourDomain.com</Domain>
    </DnsInfo>
    

    你也可以创建一个 Complex 类型,它会被反序列化到里面

    void Post(DnsInfo info) : ApiController
    {
    }
    
    public class DnsInfo
    {
        public string DnsServer { get; set; }
        public string Domain { get; set; }
    }
    

    这种方法的优点是,如果参数太多,它会有所帮助,最好将它们组织到类中。此外,如果您传递任何敏感信息,您不希望在 url 中使用查询字符串,因为这些信息可能会被浏览器等缓存。

    【讨论】:

      【解决方案2】:

      您应该为您的 API 方法保留一个输入参数,并使用 URL 参数提供所有其他参数。

      并按如下方式调用您的方法:

        http:/localhost/MyApp/Dns/GetDnsARecords/ns1.x.com?domainName=mywebsite.com
      

      在你的方法中,你只是通过做来捕捉价值

         var domainName = HttpContext.Current.Request["domainName"];
      

      【讨论】:

        【解决方案3】:

        我认为对于获取帖子,您请求的数据必须进入 url。也许您可以使用 URL 表单格式化程序? API 的外观如何?

        【讨论】:

        • 暂时我已经简化了我的API并在url路径中传递了相关信息。它有效,但我必须进行更多的数据库调用。我仍然希望可能有另一种机制允许传递(比如说)JSON数据而不在查询字符串上可见,也许通过使用标头数据。我对 HTTP 协议了解得不够多,不知道这是 (a) 可能还是 (b) 可取的。
        • 关于何时使用 GET 或 POST 请求有一些规则。如果您想在 JSON 中传递大量数据,那么 POST 请求可能是最好的选择。一个简化的规则是使用 GET 来检索内容(但不更改任何内容),如果您必须在服务器上更新或创建某些内容,则使用 POST。但是网上有很多关于这个的讨论。只需 google post vs. get vs. put
        • 这绝对是我想要的 GET 但我希望用从调用页面中提取的相关信息来装饰页面。
        猜你喜欢
        • 1970-01-01
        • 2016-09-05
        • 2018-07-07
        • 2015-07-10
        • 1970-01-01
        • 1970-01-01
        • 2013-10-18
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多