【问题标题】:How consume REST service with complex type in C#?如何在 C# 中使用复杂类型的 REST 服务?
【发布时间】:2014-07-10 22:11:48
【问题描述】:

我有一个计算定制产品价格的 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 时找不到相同的方法。

【问题讨论】:

  • 这与您的要求接近 - 看起来您几乎必须做一个字符串生成器。哪种方式违背了传递对象的想法。 POST 无疑是处理它的最佳方式——难道你无法通过 POST 来处理它吗?它消除了复杂对象传输的麻烦。 stackoverflow.com/questions/13585992/…
  • 是的,我提出了这个问题,但正是我想避免在 URI 中手动编码类的所有成员。是的,我可以使用 POST,但是根据指南,当您在服务器中保存一些数据时必须使用 POST,而当您只是获取数据时必须使用 GET。
  • 评论区太长,请看下面我的“答案”。简而言之,如果您需要向服务器提供一些复杂的数据以获得结果,您应该使用 POST。通过查询字符串提供它只会增加不必要的头痛。

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


【解决方案1】:

该示例显示 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;
        }
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-30
    • 1970-01-01
    • 2011-04-10
    相关资源
    最近更新 更多