使用MVC4 RESTful web api传递复杂参数

时间:2012-02-23 11:22:45

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

我正在尝试将复杂对象发送到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"示例中借用了上述代码 - 代码列在页面上。

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

3 个答案:

答案 0 :(得分:1)

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

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

传递给dnsserver和域的值现在将映射到您的GET方法参数。


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

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

您还可以创建一个复杂类型,并将其保存到其中

void Post(DnsInfo info) : ApiController
{
}

public class DnsInfo
{
    public string DnsServer { get; set; }
    public string Domain { get; set; }
}

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

答案 1 :(得分:0)

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

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

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

在您的方法中,您只需通过执行

来捕获值
   var domainName = HttpContext.Current.Request["domainName"];

答案 2 :(得分:-1)

我认为对于获取帖子,您要求数据必须进入网址。也许你可以使用URL Form Formatter? API如何?