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
复制粘贴到邮递员中,就可以得到想要的结果,但是无论我做什么,我都无法在程序中复制它,我不是确定我应该如何继续调试问题。
有人有什么好主意吗?
您需要做两件事:
- 你需要通过fiddler检查请求头,如果发现有空缺就补上。
- 最重要的是,用代码中的参数记录完整 URL。在邮递员中使用相同的 URL,希望您能解决问题。
所以我想通了这个问题。似乎邮递员会自动转义 url 中的引号等,但 C# 不会。我通过在 param
.
上添加 Uri.EscapeUriString()
解决了这个问题
一个解决方案是DeserializeObject,我们的Postman。当我的自动化测试工作但不是 Postamn 请求时,我遇到了类似的问题。
在我的例子中,我是这样做的s.th
try
{
Foo[prop] = JsonConvert.DeserializeObject(stringValue);
}
catch
{
Foo[prop] = stringValue;
}
我正在尝试将 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
复制粘贴到邮递员中,就可以得到想要的结果,但是无论我做什么,我都无法在程序中复制它,我不是确定我应该如何继续调试问题。
有人有什么好主意吗?
您需要做两件事:
- 你需要通过fiddler检查请求头,如果发现有空缺就补上。
- 最重要的是,用代码中的参数记录完整 URL。在邮递员中使用相同的 URL,希望您能解决问题。
所以我想通了这个问题。似乎邮递员会自动转义 url 中的引号等,但 C# 不会。我通过在 param
.
Uri.EscapeUriString()
解决了这个问题
一个解决方案是DeserializeObject,我们的Postman。当我的自动化测试工作但不是 Postamn 请求时,我遇到了类似的问题。
在我的例子中,我是这样做的s.th
try
{
Foo[prop] = JsonConvert.DeserializeObject(stringValue);
}
catch
{
Foo[prop] = stringValue;
}