我有一个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时,我无法找到相同的方法。
答案 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;
}
}