使用MVC4 RESTful 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(...

上面的代码是我从"HttpClient简介"示例中借来的——代码列在页面上。

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

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

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

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


编辑:或者,您也可以在HTTPPOST的主体中传递复杂的对象。您可以选择的三种原生格式是JSON、XML或UrlEncodedQueryString。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中使用查询字符串,因为这些字符串可以被浏览器等缓存。

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

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

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

在你的方法中,你只需通过获得价值

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

我认为对于get posts,请求数据必须进入url。也许你可以使用URL表单格式化程序?API看起来怎么样?

最新更新