【问题标题】:Convert Httpwebrequest to Httpclient将 Httpwebrequest 转换为 Httpclient
【发布时间】:2020-08-12 21:37:37
【问题描述】:

这是获取令牌的完整代码。 我想把它翻译成Httpclient。希望有人能帮助我。我想从 httpwebrequest 切换到 httpclient 非常感谢您帮助我。

  public static async Task<TokenInfo> GetToken(string userName, string password)
    {
        string text = "https://api.site.io/v4/sessions.json?app=100005a&t=1569053071";
    
        string postDataStr = string.Concat(new string[]
        {
            "{\"password\": \"", password,
            "\", \"login_id\": \"", userName,"\"}"
        });
        
        var token_info = JObject.Parse(await Post(text, postDataStr));
        var token = token_info["token"].ToString();
    
        string user = token_info["user"]["name"].ToString();
        string country = token_info["user"]["country"].ToString();
    
        return new TokenInfo()
        {
            Token = token,
            Name = user,
            Country = country
        };
    }

private static HttpWebRequest httpWebRequest;
public static async Task<string> Post(string Url, string postDataStr)
{
    var uri = new Uri(Url);
    httpWebRequest = (HttpWebRequest)WebRequest.Create(uri);
    httpWebRequest.Method = "POST";
    httpWebRequest.ContentType = "text/plain";
    httpWebRequest.KeepAlive = false;
    httpWebRequest.ContentLength = (long)Encoding.UTF8.GetByteCount(postDataStr);
    using (var writer = new StreamWriter(httpWebRequest.GetRequestStream(), Encoding.GetEncoding("gb2312")))
    {
        await writer.WriteAsync(postDataStr);
    }
    using (var response = (await httpWebRequest.GetResponseAsync()).GetResponseStream())
    {
        using (var reader = new StreamReader(response, Encoding.GetEncoding("utf-8")))
        {
            var result = await reader.ReadToEndAsync();
            Console.WriteLine(result);
            return result;
        }
    }
}

【问题讨论】:

标签: c#


【解决方案1】:
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls |
                           SecurityProtocolType.Tls11 |
                           SecurityProtocolType.Tls12;
 HttpClient httpClient = new HttpClient();

    var request = new HttpRequestMessage(HttpMethod.Post, Url)
    {
        Content = new StringContent(postDataStr, Encoding.UTF8, "text/plain")
    };

   
    using (var response = await httpClient.SendAsync(request))
    {
        response.EnsureSuccessStatusCode();
        var body = await response.Content.ReadAsStringAsync();
        
    }

【讨论】:

  • 哇,马上试试这个
  • 我从 sendasync 部分收到此错误 对象引用未设置为对象的实例。'
  • 我现在得到“响应状态代码未指示 404 未找到”是否可能是我被阻止发送请求?早上早些时候我的代码正在运行,但是当我再次尝试时,我总是出错
  • 这个错误意味着你的 httpclient 工作了,但是它在 url 中找不到资源。检查url是否正确。
【解决方案2】:

这是一个发布请求的示例,就像您使用 HttpClient 发布的示例一样

    public static async Task<string> Post(string url, Dictionary<string,string> postParameters)
    {
        using (HttpClient client = new HttpClient())
        {

            HttpContent postData = new FormUrlEncodedContent(postParameters);

            HttpResponseMessage response = await client.PostAsync(url, postData);

            if (response.IsSuccessStatusCode)
            {
                string content = await response.Content.ReadAsStringAsync();

                return content;
            }
            else
            {
                //Do something when request fails
                return string.Empty;
            }
        }
    }

我添加了Dictionary&lt;string, string&gt;,而不是您方法中的 postDataStr 参数

假设您想将一些数据发布到需要一些数据(如用户名和密码)的端点,那么您可以这样做:

    Dictionary<string, string> postData = new Dictionary<string, string>();
    postData.Add("Username", "MyUsername");
    postData.Add("Password", "MyPassword");

    await Post("MyUrl", postData);

如果您更喜欢发送纯字符串而不是使用 Dictionary 解决方案,您可以这样做:

    public static async Task<string> Post(string url, string postDataStr)
    {
        using (HttpClient client = new HttpClient())
        {
            client.DefaultRequestHeaders.Add("Content-Type", "text/plain");

            HttpContent postData = new StringContent(postDataStr);

            HttpResponseMessage response = await client.PostAsync(url, postData);

            if (response.IsSuccessStatusCode)
            {
                string content = await response.Content.ReadAsStringAsync();

                return content;
            }
            else
            {
                //Do something when request fails
                return string.Empty;
            }
        }
    }

【讨论】:

  • 哇,让我现在试试这个。
  • @zackmark15 太好了!请让我知道它是否适合你:)
  • 我正在解决一个小问题,这个“从 JsonReader 读取 JObject 时出错”我想发布获取 cookie 但无法发布的代码
  • @zackmark15 你能编辑你原来的问题并添加代码吗? :)
  • 好吧,这是个好主意。我将发布我的完整代码
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多