Проблема RestSharp. Невозможно использовать AddJsonBody для добавления неявного экземпляра типа класса. - PullRequest
0 голосов
/ 07 мая 2019

Я пытаюсь разработать метод для отправки запроса и возврата ответа в обобщенных формах с помощью RestSharp. Когда экземпляром тела является общий тип объекта , request.AddJsonBody (body) не может работать с возвращенным статусом Bad Request.

Это мой метод:

public async Task<T> ExecutePostAsync<T, TK>(string url, IDictionary 
headers, TK body)
    where T : new()
    {
        var request = new RestRequest(url, Method.POST);

    if (headers != null && headers.Count > 0)
    {
        foreach (object key in headers.Keys)
        {
            request.AddHeader((string)key, (string)headers[key]);
        }
    }

    request.AddJsonBody(body);

    var cancellationTokenSource = new CancellationTokenSource();
    IRestResponse response = await _restClient.ExecuteTaskAsync(request, cancellationTokenSource.Token);

    if (!response.IsSuccessful)
    {
        const string message = "Error retrieving response.  Check inner details for more info.";
        var browserStackException = new ApplicationException(message, response.ErrorException);

        throw browserStackException;
    }

    var result = JsonConvert.DeserializeObject<T>(response.Content);

    return result;
}

Я вызвал его, используя этот код:

result = await _restSharpJsonOperation.ExecutePostAsync<object, object>(url, headers, request);

Затем выдается исключение:

Невозможно десериализовать текущий массив JSON (например, [1,2,3]) в тип «IdentifierQuoteRequest», поскольку для типа требуется объект JSON (например, {\\ "name \\": \\ "value \\"} ) для правильной десериализации. Чтобы исправить эту ошибку, либо измените JSON на объект JSON (например, {\\ "name \\": \\ "value \\"}), либо измените десериализованный тип на массив или тип, который реализует интерфейс коллекции (например, ICollection, IList), такой как List, который можно десериализовать из массива JSON. JsonArrayAttribute также можно добавить к типу, чтобы заставить его десериализоваться из массива JSON

Но, если я заменю AddJsonBody на это:

request.AddParameter("application/json; charset=utf-8", 
                            JsonConvert.SerializeObject(body), ParameterType.RequestBody);

Это будет работать. Или, если я использую экземпляр тела явного типа, он будет работать.

Я не понимаю, почему AddJsonBody должен знать явный тип, и из брошенного исключения, почему задействован массив Json. Может кто-нибудь опытный помочь с этой проблемой? Спасибо.

...