2

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

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

4

3 回答 3

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 中使用查询字符串,因为这些信息可能会被浏览器等缓存。

于 2012-03-19T10:17:55.593 回答
0

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

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

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

在您的方法中,您只需通过执行来获取价值

   var domainName = HttpContext.Current.Request["domainName"];
于 2012-04-24T00:01:46.987 回答
-1

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

于 2012-02-27T16:51:50.777 回答