c# - HttpClient InternalServerError 500 - 适用于邮递员,但不适用于代码

c# - HttpClient InternalServerError 500 - Works in postman, but not in code

我正在尝试将 GET 请求发送到以下 API 个端点:

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

第一个使用以下代码(在 postman 和 c# 中)工作得很好:

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 复制粘贴到邮递员中,就可以得到想要的结果,但是无论我做什么,我都无法在程序中复制它,我不是确定我应该如何继续调试问题。

有人有什么好主意吗?

您需要做两件事:

  1. 你需要通过fiddler检查请求头,如果发现有空缺就补上。
  2. 最重要的是,用代码中的参数记录完整 URL。在邮递员中使用相同的 URL,希望您能解决问题。

所以我想通了这个问题。似乎邮递员会自动转义 url 中的引号等,但 C# 不会。我通过在 param.

上添加 Uri.EscapeUriString() 解决了这个问题

一个解决方案是DeserializeObject,我们的Postman。当我的自动化测试工作但不是 Postamn 请求时,我遇到了类似的问题。

在我的例子中,我是这样做的s.th

try
{
   Foo[prop] = JsonConvert.DeserializeObject(stringValue);
}
catch
{
   Foo[prop] = stringValue;
}