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

时间:2018-04-23 17:50:01

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

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

任何人都有一些好主意?

3 个答案:

答案 0 :(得分:0)

您需要做两件事 1:你需要通过fiddler检查请求标头,如果发现任何间隙填满它。 2:最重要的是,在代码中记录带参数的完整URL。在邮递员中使用相同的URL,希望你会得到这个问题。

答案 1 :(得分:0)

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

答案 2 :(得分:-1)

一种解决方案是DeserializeObject,这是我们Postman公司的产品。当我的自动化测试正常工作时,我遇到了类似的问题,但Postamn请求却没有。

就我而言,我确实是这样

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