我需要知道如何传递和接收Web API REST方法的参数。
我相信我从客户传递args的方式是正确的,即:
http://localhost:28642/api/InventoryItems/PostInventoryItem?ID=42?pksize=12?Description=ValuableDesc?vendor_id=venderado?dept=42?subdept=85?UnitCost=2.50?UnitList=3.75?OpenQty=25.25?UPC=12345?upc_pack_size=24?vendor_item=someVendorItem?crv_id=9898987
......第一部分:
http://localhost:28642/
...是机器和端口;第二部分:
/api/InventoryItems/PostInventoryItem
...表示Controller及其运行方法,最后一部分(其余部分)是要传递的各个args(格式为“?= ”)。
基于所写的here,即:
“该方法采用Product类型的参数。在Web API中,具有复杂类型的参数从请求体中反序列化。因此,我们希望客户端以XML格式发送产品对象的序列化表示。或JSON格式。“
......我希望我可以在我的控制器上使用它:
[Route("api/InventoryItems/PostInventoryItem")]
public HttpResponseMessage PostInventoryItem(InventoryItem ii)
{
_inventoryItemRepository.PostInventoryItem(ii.ID, ii.pksize, ii.Description, ii.vendor_id, ii.dept,
ii.subdept, ii.UnitCost, ii.UnitList, ii.OpenQty, ii.UPC, ii.upc_pack_size, ii.vendor_item, ii.crv_id);
// If/when this works, could do this instead:
//_inventoryItemRepository.PostInventoryItem(ii);
var response = Request.CreateResponse<InventoryItem>(HttpStatusCode.Created, ii);
string uri = Url.Link("DefaultApi", new { id = ii.ID });
response.Headers.Location = new Uri(uri);
return response;
}
...并且客户端批次的args会自动捆绑到InventoryItem对象中;但是,唉,Web API无法这样做(或者我做错了什么/还没有做对,但是当达到方法时,ii为null。
我必须在发送方,接收方或两者上做不同的事情吗?究竟,我需要修改或追加什么?
如果我在Controller中尝试这个:
public HttpResponseMessage PostInventoryItem(string id, int pack_size, string description, string vendor_id, int department, int subdepartment, double unit_cost, double unit_list, double open_qty, string UPC_code, int UPC_pack_size, string vendor_item, long crv_id)
{
_inventoryItemRepository.PostInventoryItem(id, pack_size, description, vendor_id, department, subdepartment,
unit_cost, unit_list, open_qty, UPC_code, UPC_pack_size, vendor_item, crv_id);
InventoryItem ii = new InventoryItem();
ii.ID = id;
ii.pksize = pack_size;
. . .
ii.crv_id = (int)crv_id;
var response = Request.CreateResponse<InventoryItem>(HttpStatusCode.Created, ii);
...在“_inventoryItemRepository.PostInventoryItem()”行中有一个断点,它没有到达它,并且客户端在尝试将URI发送到服务器时弹出一个消息框,简单地说, “空”。
将Controller签名更改为:
的组合public HttpResponseMessage PostInventoryItem([FromUri] InventoryItem ii)
(关于Mike Wasson的文章here)
......(对负担丰富的野兽(richaux)的称赞)取代除了第一个以外的所有“?”与“&amp;”:
http://localhost:28642/api/InventoryItems/PostInventoryItem?ID=42&pksize=12&Description=ValuableDesc&vendor_id=venderado&dept=42&subdept=85&UnitCost=2.50&UnitList=3.75&OpenQty=25.25&UPC=12345&upc_pack_size=24&vendor_item=someVendorItem&crv_id=9898987
......做了伎俩。
答案 0 :(得分:2)
根据原始问题,您有两个问题。首先,正如Richaux所解释的那样,URL的格式不正确。其次,你可以在Uri上拥有复杂类型的内容,但这通常是不好的做法。当您设置的Url名称中包含“Post”时尤其如此。用户期望传递给控制器的实体位于请求体中而不是URL。