繁体   English   中英

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

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

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

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

第一个与以下代码(在邮递员和 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. 您需要通过提琴手检查请求标头,如果发现任何差距填补它。
  2. 最重要的是,用代码中的参数记录完整的 URL。 在邮递员中使用相同的 URL,希望你会得到这个问题。

所以我想通了这个问题。 似乎邮递员会自动转义网址中的引号等,但 c# 不会。 我通过在param上添加Uri.EscapeUriString()解决了这个问题。

一种解决方案是 DeserializeObject 来自 Postman 的内容。 当我的自动化测试有效但 Postamn 请求无效时,我遇到了类似的问题。

就我而言,我是这样做的

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM