将对象的数组传递给web api

时间:2012-12-19 23:06:30

标签: c# asp.net-web-api http-get

我有一个.net mvc 4 webapi项目,我正在尝试将一个对象数组传递给我的控制器上的方法。

我在SO上找到了一些关于需要设置对象属性的示例:param1 = whatever& param2 = bling& param3 = blah。

但我不知道如何使用它来传递集合。

这是我的方法签名。注意我用[FromUri]属性修饰了参数。

public List<PhoneResult> GetPhoneNumbersByNumbers([FromUri] PhoneRequest[] id)
{
    List<PhoneResult> prs = new List<PhoneResult>();
    foreach (PhoneRequest pr in id)
    {
        prs.Add(PhoneNumberBL.GetSinglePhoneResult(pr.PhoneNumber, pr.RfiDate, pr.FinDate, pr.State));
    }
    return prs;
}

这是我简单的PhoneRequest对象:

public class PhoneRequest
{
    public string PhoneNumber { get; set; }
    public string RfiDate { get; set; }
    public string FinDate { get; set; }
    public string State { get; set; }
}

这是我用来传递的样本:

http://localhost:3610/api/phonenumber/getphonenumbersbynumbers/
   [{"PhoneNumber":"8016667777","RfiDate":"","FinDate":"2012-02-11","State":"UT"},
    {"PhoneNumber":"8018889999","RfiDate":"2012-12-01","FinDate":"","State":"UT"}]

使用此功能会返回“错误请求”

我也试过这个

http://localhost:3610/api/phonenumber/getphonenumbersbynumbers?
    id=[{"PhoneNumber":"8016667777","RfiDate":"","FinDate":"2012-02-11","State":"UT"},
        {"PhoneNumber":"8018889999","RfiDate":"2012-12-01","FinDate":"","State":"UT"}]

确实到达了该方法,但该数组为空。

如何将PhoneRequest对象的数组传递给我的Web API方法?

3 个答案:

答案 0 :(得分:9)

尝试以这种格式从uri传递PhoneRequest []:

http://localhost:3610/api/phonenumber/getphonenumbersbynumbers?
    id[0][PhoneNumber]=8016667777&id[0][FinDate]=2012-02-11&id[0][State]=UT&
    id[1][PhoneNumber]=8018889999&id[1][RfiDate]=2012-12-01&id[1][State]=UT

答案 1 :(得分:6)

我建议您使用POST。

当您查询字符串增长时,您将遇到URL最大长度的问题,这取决于浏览器。

如果你要传递很多参数,即使你真的只是GETting数据,POST也是完全可以接受的。但是,您将丢失的是用户使用查询字符串为特定页面添加书签的功能。

答案 2 :(得分:0)

我创建了一个自定义模型绑定器FieldValueModelBinder类,它可以有效地传递包含嵌套数组或通用列表类型数据的任何对象,查询字符串具有字段名对,而不会嵌入任何JSON和XML结构。模型绑定器可以解决上面讨论的所有问题。由于此问题已通过问题ID 19302078进行了扩展,因此您可以在该主题中查看我的答案的详细信息。