【问题标题】:SendAsync() returning 422 Unprocessable EntitySendAsync() 返回 422 无法处理的实体
【发布时间】:2019-12-09 03:05:06
【问题描述】:

我使用 GetAsync() 编写了一个工作正常的函数,但现在我想使用 SendAsync() 来扩展它而不是 [用于 POST 和sofourth];但是我的 SendAsync() 版本没有按预期工作,它返回一个 422 不可处理的实体。 (没有 IDE atm;抱歉有小错别字)

初始化

var Client = new HttpClient{
    BaseAddress = "https://example.com"
}
Client.DefaultRequestHeaders.UserAgent.ParseAdd("Project/1.0 (blah blah)");

...

工作 获取Async()

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,其中指出“无效的 Auth Token!”

什么是 GetAsync() 而不是 SendAsync()?

【问题讨论】:

  • 您的 Send 在 GET 请求的 BODY 中包含内容。 GET 请求没有 BODY。
  • 哦,那么 RequestUri 应该是带有 (get) 参数的整个 url 吗?在那种情况下应该是什么... RequestUri = new Uri(page + FormUrlEncodedContent(args), ?

标签: c# dotnet-httpclient sendasync


【解决方案1】:

您的 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; }
}

【讨论】:

  • 完美!作为后续,POST 数据应该像我最初拥有的那样在 Content 中,还是什么?
  • @kei 是的,对于 POST,可以像原来的例子一样应用内容。
【解决方案2】:

你的代码 sn-ps 没有显示,但你确定第二个查询的 URL 有

$"/user/login.json?name={user}&amp;password={pass}"

而不是

$"/user/login.json"

?

【讨论】:

  • requestUri 是“/user/login.json”,内容是包含参数“name={user}&password={pass}”的 urlencoded 字典?我做错了吗?
猜你喜欢
  • 1970-01-01
  • 2015-11-18
  • 1970-01-01
  • 2018-04-17
  • 2022-10-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多