【问题标题】:c# - HttpClient InternalServerError 500 - Works in postman, but not in codec# - HttpClient InternalServerError 500 - 适用于邮递员,但不适用于代码
【发布时间】:2018-04-23 17:50:01
【问题描述】:

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

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

有人有什么好主意吗?

【问题讨论】:

  • 我想开始尝试比较发送到服务器的 POSTMAN 和浏览器网络选项卡的请求标头。
  • 这个 api 是在你的控制之下,还是一个返回内部服务器错误的外部 api。
  • @Igor 这是一个外部api,我无法控制它。我不确定在哪里可以看到所有标题,调试说它们都是空/空,除了承载。 pastebin.com/vFjAWvCP
  • 调试截图:i.imgur.com/EcaNTxH.png
  • @user1672994 是的,我之前尝试过,但我没有使用 Fiddler 的经验。到目前为止,它跟踪邮递员请求和有效的搜索请求,但是我无法让它显示失败的请求。 i.imgur.com/o6B0NyC.png #13 是邮递员,#21 是有效的“搜索”,但最后一个请求没有显示任何内容。

标签: c# rest httpclient internal-server-error http-status-code-500


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    你需要做的两件事:

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

    【讨论】:

    • 这两件事都做了; 1:我无法在 Fiddler 中跟踪 500,不确定我是否做错了什么。i.imgur.com/o6B0NyC.png 2:我已经将它从输出复制粘贴到邮递员中,它可以工作。
    • 与供应商建立通话。并与他们核实。您的请求发生了什么。他们可能会提供一些日志。
    【解决方案3】:

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

    就我而言,我是这样做的

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-01-20
      • 1970-01-01
      • 1970-01-01
      • 2021-10-06
      • 2019-07-03
      • 2021-05-29
      • 2018-10-07
      相关资源
      最近更新 更多