Сериализация объекта с помощью restsharp и передача его в список не сериализации WebApi
у меня есть модель представления, которая выглядит как.
public class StoreItemViewModel
{
public Guid ItemId { get; set; }
public List<Guid> StoreIds { get; set; }
[Required]
public string Description { get; set; }
//[Required]
//[DataMember(IsRequired = true)]
public int ItemTypeId { get; set; }
}
у меня есть небольшой помощник, который использует RestSharp.
public static IRestResponse Create<T>(object objectToUpdate, string apiEndPoint) where T : new()
{
var client = new RestClient(CreateBaseUrl(null))
{
Authenticator = new HttpBasicAuthenticator("user", "Password1")
};
var request = new RestRequest(apiEndPoint, Method.POST);
//request.JsonSerializer = new JsonSerializer();
// {RequestFormat = DataFormat.Json};
request.AddObject(objectToUpdate);
// clientJsonSerializer = new YourCustomSerializer();
var response = client.Execute<T>(request);
return response;
}
при отладке контроллера в моем api
[HttpPost]
public HttpResponseMessage Create([FromBody]StoreItemViewModel myProduct)
{
//check fields are valid
.........
}
продукты myProducts все заполнены, кроме общедоступных списков StoreIds он всегда возвращает одно вознаграждение с пустым идентификатором Guid. Даже если я добавил 2 или более StoreIds
Я предполагаю, что это потому, что я делаю что-то неправильно с моим create helper в моем заявлении.
может кто-нибудь помочь с этим вызывая головную боль.
необработанные данные, отправленные в webapi, выглядят как
ItemId=f6dbd244-e840-47e1-9d09-53cc64cd87e6&ItemTypeId=6&Description=blabla&StoreIds=d0f36ef4-28be-4d16-a2e8-37030004174a&StoreIds=f6dbd244-e840-47e1-9d09-53cc64cd87e6&StoreId=d0f36ef4-28be-4d16-a2e8-37030004174a
3 ответов
RestSharp теперь имеет более упрощенный способ добавить объект в тело RestRequest с сериализацией Json:
public static IRestResponse Create<T>(object objectToUpdate, string apiEndPoint) where T : new()
{
var client = new RestClient(CreateBaseUrl(null))
{
Authenticator = new HttpBasicAuthenticator("user", "Password1")
};
var request = new RestRequest(apiEndPoint, Method.POST);
request.AddJsonBody(objectToUpdate); // HERE
var response = client.Execute<T>(request);
return response;
}
Это было найдено в RestSharp 105.0.1.0
мне удалось заставить это работать. Я не думаю, что это правильный путь, но это работает.
public static IRestResponse Create<T>(object objectToUpdate, string apiEndPoint) where T : new()
{
var client = new RestClient(CreateBaseUrl(null))
{
Authenticator = new HttpBasicAuthenticator("user", "Password1")
};
var json = JsonConvert.SerializeObject(objectToUpdate);
var request = new RestRequest(apiEndPoint, Method.POST);
request.AddParameter("text/json", json, ParameterType.RequestBody);
var response = client.Execute<T>(request);
return response;
}
Я боролся с той же проблемой, и придумал работающее решение.
-
обязательно установите формат запроса в JSON:
запрос.RequestFormat = DataFormat.В JSON;
-
используйте AddBody, а не AddObject:
запрос.AddBody (zNewSessionUsage);
таким образом, ваш код будет примерно таким:
public static IRestResponse Create<T>(object objectToUpdate, string apiEndPoint) where T : new()
{
var client = new RestClient(CreateBaseUrl(null))
{
Authenticator = new HttpBasicAuthenticator("user", "Password1")
};
var request = new RestRequest(apiEndPoint, Method.POST);
request.RequestFormat = DataFormat.Json;
request.AddBody(objectToUpdate);
var response = client.Execute<T>(request);
return response;
}