SendAsync() 返回 422 不可处理的实体
SendAsync() returning 422 Unprocessable Entity
我使用 GetAsync() 编写了一个函数,它运行良好,但现在我想使用 Send 对其进行扩展Async() 而不是 [用于 POSTing 和其他];但是我的 SendAsync() 版本没有按预期工作,它 returns 一个 422 不可处理的实体。 (没有 IDE 自动取款机;对小错别字深表歉意)
初始化
var Client = new HttpClient{
BaseAddress = "https://example.com"
}
Client.DefaultRequestHeaders.UserAgent.ParseAdd("Project/1.0 (blah blah)");
...
正在工作 GetAsync()
public async Task<string> GetResponse(string user, string pass){
var uri = $"/user/login.json?name={user}&password={pass}";
var req = await Client.GetAsync(uri);
return req.Content.Request.Content.ReasStringAsync();
}
不工作 发送Async()
public async Task<string> GetResponse(string page, Dictionary<string, string> args){
//assume page = "/user/login.json" and args == {"username", "user"},{"password", "pass"}
try{
var req = new HttpRequestMessage
{
Method = HttpMethod.Get,
RequestUri = new Uri(page),
Content = new FormUrlEncodedContent(args),
}
var response = await Client.SendAsync(req);
if(response.IsSuccessStatusCode){
return await response.Content.ReasStringAsync();
return null;
}
catch{ return null }
}
注意:与 422 一起,响应仍包含 json,其中声明 "invalid Auth Token!"
什么是 GetAsync() 而 SendAsync() 不是?
您的代码片段没有显示它,但您确定第二个查询的 URL 有
$"/user/login.json?name={user}&password={pass}"
而不是
$"/user/login.json"
?
您的 Send 将内容包含在 HTTP GET 请求的 BODY 中。
HTTP GET 请求不应有 BODY,并且有些服务器不会处理此类请求。
将字典转换为 QueryString 并将其包含在 URI 中。
public async Task<string> GetResponse(string page, Dictionary<string, string> args) {
//assume page = "/user/login.json" and args == {"username", "user"},{"password", "pass"}
try {
QueryString queryString = QueryString.Create(args);
var uri = new Uri(page + queryString.ToString());
var request = new HttpRequestMessage(HttpMethod.Get, uri);
var response = await Client.SendAsync(request);
if(response.IsSuccessStatusCode){
return await response.Content.ReadAsStringAsync();
return string.Empty;
} catch { return string.Empty; }
}
我使用 GetAsync() 编写了一个函数,它运行良好,但现在我想使用 Send 对其进行扩展Async() 而不是 [用于 POSTing 和其他];但是我的 SendAsync() 版本没有按预期工作,它 returns 一个 422 不可处理的实体。 (没有 IDE 自动取款机;对小错别字深表歉意)
初始化
var Client = new HttpClient{
BaseAddress = "https://example.com"
}
Client.DefaultRequestHeaders.UserAgent.ParseAdd("Project/1.0 (blah blah)");
...
正在工作 GetAsync()
public async Task<string> GetResponse(string user, string pass){
var uri = $"/user/login.json?name={user}&password={pass}";
var req = await Client.GetAsync(uri);
return req.Content.Request.Content.ReasStringAsync();
}
不工作 发送Async()
public async Task<string> GetResponse(string page, Dictionary<string, string> args){
//assume page = "/user/login.json" and args == {"username", "user"},{"password", "pass"}
try{
var req = new HttpRequestMessage
{
Method = HttpMethod.Get,
RequestUri = new Uri(page),
Content = new FormUrlEncodedContent(args),
}
var response = await Client.SendAsync(req);
if(response.IsSuccessStatusCode){
return await response.Content.ReasStringAsync();
return null;
}
catch{ return null }
}
注意:与 422 一起,响应仍包含 json,其中声明 "invalid Auth Token!"
什么是 GetAsync() 而 SendAsync() 不是?
您的代码片段没有显示它,但您确定第二个查询的 URL 有
$"/user/login.json?name={user}&password={pass}"
而不是
$"/user/login.json"
?
您的 Send 将内容包含在 HTTP GET 请求的 BODY 中。
HTTP GET 请求不应有 BODY,并且有些服务器不会处理此类请求。
将字典转换为 QueryString 并将其包含在 URI 中。
public async Task<string> GetResponse(string page, Dictionary<string, string> args) {
//assume page = "/user/login.json" and args == {"username", "user"},{"password", "pass"}
try {
QueryString queryString = QueryString.Create(args);
var uri = new Uri(page + queryString.ToString());
var request = new HttpRequestMessage(HttpMethod.Get, uri);
var response = await Client.SendAsync(request);
if(response.IsSuccessStatusCode){
return await response.Content.ReadAsStringAsync();
return string.Empty;
} catch { return string.Empty; }
}