我正试图将一个复杂的对象发送到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看起来怎么样?