如何在C#中使用复杂类型的REST服务?

时间:2014-07-10 13:52:30

标签: c# asp.net asp.net-mvc asp.net-web-api

我有一个WebApi服务,可以计算定制产品的价格。控制器功能是:

public double Get([FromUri]Specifications specifications)

Specifications是一个允许自定义产品的类:

public class Specifications 
{
    public string Currency;
    public int DesktopLicenses;
    public Product Product;
    public int Licenses;
}

现在,我如何从C#中使用此服务。我想避免手工编写带有所有Specifications变量的URI查询,我希望能够直接使用Specifications的实例来调用该服务。

如果服务是POST,我可以这样做:

Specifications product = new Specifications( ...);
HttpResponseMessage reponse = httpClient.PostAsJsonAsync("api/pricecalculator", product).Result;

但是当我使用GET时,我无法找到相同的方法。

1 个答案:

答案 0 :(得分:3)

该示例显示GET在调用中将其传递给复杂对象。通常,这只是一个简单的请求,并返回复杂的对象 - 这是“最佳实践”。如果你需要通过给它一个复杂的对象来请求它 - 它应该仍然是一个POST调用。我知道专家们喜欢将POST / PUT视为REST世界的变化/添加 - 但最后,坦率地说,除了请求体之外,POST和GET之间没有区别。如果您需要为服务器提供复杂数据,请使用请求正文(也称为POST)。如果这是一个简单的请求 - /api/listofvendors/zone1 - 然后使用GET。

Web API Get Method with Complex Object as Parameter

示例:

    [HttpGet]
    [Route("~/services/mrf/{mrfnumber}")]                       // GET specific MRF
    public Mrf GetMrfRecord(string mrfnumber) {
        using (var ddc = new MRFDataContext(ConnectionString)) {
            var options = new DataLoadOptions();
            options.LoadWith((Mrf c) => c.MRFParts);    //immediate load related MRFParts
            ddc.LoadOptions = options;

            var mrf = (from u in ddc.Mrfs
                       where u.MrfNum == mrfnumber
                       select u).FirstOrDefault();

            return mrf ?? null;
        }
    }