c# — HttpClient InternalServerError 500 — работает в почтальоне, но не в коде

Я пытаюсь отправить запросы GET на следующие конечные точки API:

https://api.mediahound.com/1.3/search/all?PARAM_STRING
https://api.mediahound.com/1.3/graph/lookup?params=PARAMS_JSON

Первый отлично работает со следующим кодом (как в почтальоне, так и в С#):

var baseUri = new Uri("https://api.mediahound.com/1.3/search/all/");
using (var client = new HttpClient())
{
  var res = "";
  client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", _oAuth2.Token);
  Task task = Task.Run(async () => { res = await client.GetStringAsync(baseUri + searchInput + "?type=movie"); });
  task.Wait();
  .....
}

Второй я не могу приступить к работе, и он дает мне ответ InternalServerError. В настоящее время это выглядит так:

public async Task<ObservableCollection<Movie>> GetMoviesAsync(string id)
{
  var baseUri = new Uri("https://api.mediahound.com/1.3/graph/lookup?params=");
  using (var client = new HttpClient())
  {
    var param = "{\n\"ids\":\n[\"" + id +  "\"],\n\"components\":\n[\"primaryImage\",\n\"keyTraits\"]\n}";
    client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", _oAuth2.Token);
    var res = await client.GetAsync(baseUri + param);
    if(!res.IsSuccessStatusCode)
    {
      throw new Exception("HttpClient Error: " + res.StatusCode); //InternalServerError 500
    }
    var content = await res.Content.ReadAsStringAsync();
    .....
  }
}

Просто скопируйте и вставьте baseUri + param в почтальон, и это даст мне желаемый результат, однако я не могу воспроизвести это в программе, что бы я ни делал, и я не уверен, как мне продолжить отладку проблемы.

У кого-нибудь есть хорошие идеи?


person Jonas Mohammed    schedule 23.04.2018    source источник
comment
Я думаю, для начала попробуйте сравнить заголовок запроса, который отправляется на сервер как для POSTMAN, так и для вкладки сети браузера.   -  person Alvin    schedule 23.04.2018
comment
Этот API находится под вашим контролем или это внешний API, который возвращает внутреннюю ошибку сервера.   -  person Igor    schedule 23.04.2018
comment
@Igor Это внешний API, я не могу его контролировать. Я не уверен, где я могу увидеть все заголовки, отладка говорит, что все они нулевые/пустые, кроме носителя. pastebin.com/vFjAWvCP   -  person Jonas Mohammed    schedule 23.04.2018
comment
Скриншот отладки: i.imgur.com/EcaNTxH.png   -  person Jonas Mohammed    schedule 23.04.2018
comment
@user1672994 user1672994 Да, я пробовал это раньше, но у меня нет опыта работы с Fiddler. Пока он отслеживает запрос почтальона и поисковый запрос, который работает, однако я не могу заставить его показать запрос, который не работает. i.imgur.com/o6B0NyC.png № 13 — почтальон, № 21 — работающий поиск , но из последнего запроса ничего не появляется.   -  person Jonas Mohammed    schedule 23.04.2018


Ответы (3)


Итак, я разобрался с проблемой. Кажется, почтальон автоматически экранирует кавычки и т. д. в URL-адресе, но С# - нет. Я решил проблему, добавив Uri.EscapeUriString() в файл param.

person Jonas Mohammed    schedule 25.04.2018

Две вещи, которые вам нужно сделать:

  1. вам нужно проверить заголовок запроса через fiddler, если вы обнаружите какой-либо пробел, заполните его.
  2. самое главное, запишите полный URL-адрес с параметрами в коде. Используйте тот же URL-адрес в почтальоне, надеюсь, вы решите проблему.
person Suhail    schedule 23.04.2018
comment
Сделал обе эти вещи; 1: Я не могу отследить 500 в Fiddler, не уверен, что делаю что-то не так. i. imgur.com/o6B0NyC.png 2: Я уже скопировал его из вывода в почтальон, работает. - person Jonas Mohammed; 23.04.2018
comment
настроить звонок с продавцом. И уточните у них, что случилось с вашим запросом. Возможно, они придумают какие-нибудь журналы. - person Suhail; 23.04.2018

Одним из решений является DeserializeObject, который приходит от Postman. У меня была аналогичная проблема, когда мои автоматические тесты работали, но не запросы Postamn.

В моем случае я сделал что-то вроде этого

try
{
   Foo[prop] = JsonConvert.DeserializeObject(stringValue);
}
catch
{
   Foo[prop] = stringValue;
}
person Mali Tbt    schedule 22.08.2020