2013-03-26 51 views
0

我有以下ASP.NET的WebAPI結合:RestSharp/ASP.NET的WebAPI - 使用POST使用URL參數

config.Routes.MapHttpRoute(
    name: "DefaultApi", 
    routeTemplate: "api/{controller}/{action}/{id}", 
    defaults: new {id = RouteParameter.Optional} 
    ); 

我的控制器看起來像這樣:

public class ReferenceDataController : BaseController 
{ 
    [RequireUserToken(ApprovedDeviceToken = true, ValidUserToken = true)] 
    [HttpPost] 
    public IEnumerable<SynchronizeItem<IReferenceDataItem>> Sync([FromBody]IEnumerable<SynchronizeItem<IReferenceDataItem>> clientSyncItems, [FromUri]int referenceDataType) 
    { 
     // my code 
    } 

在客戶端我使用以下代碼發送請求:

var client = new RestClient (baseUrl); 
var request = new RestRequest (resource, method); 
request.XmlSerializer = new JsonSerializer(); 
request.RequestFormat = DataFormat.Json; 
request.AddHeader ("X-Abc-DeviceToken", deviceToken); 

if (!string.IsNullOrWhiteSpace (userToken)) 
    request.AddHeader ("X-Abc-UserToken", userToken); 

if (payload != null) 
    request.AddBody (payload); 

if (parameters != null) 
{ 
    foreach (var parameter in parameters) 
    { 
     request.AddUrlSegment(parameter.Key, parameter.Value); 
    } 
} 

var response = client.Execute<T> (request); 

我的期望是,發送POST請求到http://myhost/api/referencedata/sync?referencedatatype=countries與包含IEnumerable的正文。如果我刪除客戶端站點上的UrlSegment參數和Web服務站點上的第二個參數,則會起作用。

我該如何將主體與有效負載和其他URL參數結合起來?

回答

1

你可以定義你的操作方法如下,

[RequireUserToken(ApprovedDeviceToken = true, ValidUserToken = true)] 
[HttpPost] 
public IEnumerable<SynchronizeItem<IReferenceDataItem>> Sync(IEnumerable<SynchronizeItem<IReferenceDataItem>> clientSyncItems, int referenceDataType) 
{ 
    // my code 
} 

沒有BodyAttribute或FromUriAttribute。這樣,Web API將嘗試使用MediaTypeFormatter將正文反序列化到clientSyncItems集合以及查詢字符串(查詢字符串中的referenceDataType)中的任何其他值類型。您定義的路線將採用「同步」作爲Id(這將被忽略,因爲它不是您的行動中的參數)。

您還必須指定一個內容類型標題,以便Web API可以選擇正確的格式(例如json或xml)。