c# - 如何正确发出 http web GET 请求

标签 c# .net httpwebrequest

我在 C# 上还是个新手,我正在尝试为此页面创建一个应用程序,它会在我收到通知(已回答、已评论等)时告诉我。但现在我只是想简单地调用 api 来获取用户数据。

我正在使用 Visual Studio Express 2012 构建 C# 应用程序,您(目前)在其中输入您的用户 ID,因此该应用程序将使用该用户 ID 发出请求并显示该用户 ID 的统计信息。

这是我尝试发出请求的代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
//Request library
using System.Net;
using System.IO;

namespace TestApplication
{
    class Connect
    {
        public string id;
        public string type;

        protected string api = "https://api.stackexchange.com/2.2/";
        protected string options = "?order=desc&sort=name&site=stackoverflow";

        public string request()
        {
            string totalUrl = this.join(id);

            return this.HttpGet(totalUrl);
        }

        protected string join(string s)
        {
            return api + type + "/" + s + options;
        }

        protected string get(string url)
        {
            try
            {
                string rt;

                WebRequest request = WebRequest.Create(url);

                WebResponse response = request.GetResponse();

                Stream dataStream = response.GetResponseStream();

                StreamReader reader = new StreamReader(dataStream);

                rt = reader.ReadToEnd();

                Console.WriteLine(rt);

                reader.Close();
                response.Close();

                return rt;
            }

            catch(Exception ex)
            {
                return "Error: " + ex.Message;
            }
        }
        public string HttpGet(string URI)
        {
            WebClient client = new WebClient();

            // Add a user agent header in case the 
            // requested URI contains a query.

            client.Headers.Add("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; .NET CLR 1.0.3705;)");

            Stream data = client.OpenRead(URI);
            StreamReader reader = new StreamReader(data);
            string s = reader.ReadToEnd();
            data.Close();
            reader.Close();

            return s;
        }
    }
}

该类是一个对象,只需解析用户 ID 并发出请求即可从表单访问它。

我已经尝试了很多我在谷歌上看过的例子,但不知道为什么我会以各种方式收到这条消息“�”。

我是这种算法的新手,如果有人能分享一本书或教程来展示如何做这种事情(解释每一步),我将不胜感激

最佳答案

服务器有时会压缩响应以节省带宽,发生这种情况时,您需要在尝试读取响应之前解压缩响应。幸运的是,.NET 框架可以自动执行此操作,但是,我们必须打开设置。

这是一个如何实现该目标的示例。

string html = string.Empty;
string url = @"https://api.stackexchange.com/2.2/answers?order=desc&sort=activity&site=stackoverflow";

HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
request.AutomaticDecompression = DecompressionMethods.GZip;

using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
using (Stream stream = response.GetResponseStream())
using (StreamReader reader = new StreamReader(stream))
{
    html = reader.ReadToEnd();
}

Console.WriteLine(html);

获取

public string Get(string uri)
{
    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri);
    request.AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate;

    using(HttpWebResponse response = (HttpWebResponse)request.GetResponse())
    using(Stream stream = response.GetResponseStream())
    using(StreamReader reader = new StreamReader(stream))
    {
        return reader.ReadToEnd();
    }
}

获取异步

public async Task<string> GetAsync(string uri)
{
    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri);
    request.AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate;

    using(HttpWebResponse response = (HttpWebResponse)await request.GetResponseAsync())
    using(Stream stream = response.GetResponseStream())
    using(StreamReader reader = new StreamReader(stream))
    {
        return await reader.ReadToEndAsync();
    }
}

发布
如果您希望使用其他 HTTP 方法(例如 PUT、DELETE、ETC),则包含参数 method

public string Post(string uri, string data, string contentType, string method = "POST")
{
    byte[] dataBytes = Encoding.UTF8.GetBytes(data);

    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri);
    request.AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate;
    request.ContentLength = dataBytes.Length;
    request.ContentType = contentType;
    request.Method = method;

    using(Stream requestBody = request.GetRequestStream())
    {
        requestBody.Write(dataBytes, 0, dataBytes.Length);
    }

    using(HttpWebResponse response = (HttpWebResponse)request.GetResponse())
    using(Stream stream = response.GetResponseStream())
    using(StreamReader reader = new StreamReader(stream))
    {
        return reader.ReadToEnd();
    }
}

    

POST 异步
如果您希望使用其他 HTTP 方法(例如 PUT、DELETE、ETC),则包含参数 method

public async Task<string> PostAsync(string uri, string data, string contentType, string method = "POST")
{
    byte[] dataBytes = Encoding.UTF8.GetBytes(data);

    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri);
    request.AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate;
    request.ContentLength = dataBytes.Length;
    request.ContentType = contentType;
    request.Method = method;

    using(Stream requestBody = request.GetRequestStream())
    {
        await requestBody.WriteAsync(dataBytes, 0, dataBytes.Length);
    }

    using(HttpWebResponse response = (HttpWebResponse)await request.GetResponseAsync())
    using(Stream stream = response.GetResponseStream())
    using(StreamReader reader = new StreamReader(stream))
    {
        return await reader.ReadToEndAsync();
    }
}

关于c# - 如何正确发出 http web GET 请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27108264/

相关文章:

c# - 验证内容页中内容控件的 ContentPlaceHolderID 属性

.net - 为什么由 blittable 类型参数化的泛型结构不是非托管类型?

c# - 在 .NET 中有什么方法可以继承没有构造函数的类吗?

c# - 使用 HttpWebRequest 进行 POST 时出现 401(是的,我使用了凭据)

c# - UnitOfWork 模式是否会在 EF 应用程序中增加值(value)?

c# - UWP 文件选取器 FileTypeFilter 异常

c# - 记录致命异常

c# - Azure Blob 存储共享访问签名 (SAS) - 签名不匹配

.net - WebClient 与 HttpWebRequest/HttpWebResponse

.net - 在 Silverlight/.NET Web 应用程序上启用 SSO : NTLM?