gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 03:37:38 26 4
gpt4 key购买 nike

我在 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com