RestSharp/ASP.NET WebAPI — использование POST с параметрами URL

У меня есть следующая привязка ASP.NET WebAPI:

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 на клиентском сайте и второй аргумент на сайте веб-сервиса, это сработает.

Как я могу объединить тело с полезной нагрузкой и дополнительными параметрами URL?


person dannyyy    schedule 26.03.2013    source источник


Ответы (1)


Вы можете определить свой метод действия следующим образом:

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

Нет BodyAttribute или FromUriAttribute. Таким образом, веб-API попытается использовать MediaTypeFormatter для десериализации тела в коллекцию clientSyncItems и любой дополнительный тип значения из строки запроса (referenceDataType из строки запроса). Маршрут, как вы его определили, будет принимать «синхронизацию» в качестве идентификатора (который будет игнорироваться, поскольку он не является параметром в вашем действии).

Вы также должны указать заголовок типа содержимого, чтобы веб-API мог выбрать правильный модуль форматирования (например, json или xml).

person Pablo Cibraro    schedule 26.03.2013