AutomaticDecompression

AutomaticDecompression

这是我要发出请求的代码:using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;//Request libraryusing 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并发出请求即可从表单对其进行访问.我已经尝试了许多我在google上看到的示例,但不知道为什么我会一直使用此消息.".我是这种算法的新手,如果任何人都可以共享一本书或教程来展示如何做这种事情(解释每个步骤),我将不胜感激解决方案服务器有时会压缩其响应以节省带宽,当这种情况发生时,您需要在尝试读取响应之前先对其进行解压缩.幸运的是,.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(); }} POST如果您希望使用其他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(); }}i am still new on c# and i'm trying to create an application for this page that will tell me when i get a notification (answered, commented, etc..). But for now i'm just trying to make a simple call to the api which will get the user's data.i'm using Visual studio express 2012 to build the C# application, where (for now) you enter your user id, so the application will make the request with the user id and show the stats of this user id.here is the code where i'm trying to make the request:using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;//Request libraryusing 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; } }}the class is an object and its being accessed from the form by just parsing it the user id and make the request.i have tried many of the examples i have looked on google, but not clue why i am getting on all ways this message "�".i am new in this kind of algorithm, if anyone can share a book or tutorial that shows how to do this kind of stuff (explaining each step), i would appreciate it 解决方案 Servers sometimes compress their responses to save on bandwidth, when this happens, you need to decompress the response before attempting to read it. Fortunately, the .NET framework can do this automatically, however, we have to turn the setting on.Here's an example of how you could achieve that.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);GETpublic 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(); }}GET asyncpublic 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(); }}POSTContains the parameter method in the event you wish to use other HTTP methods such as PUT, DELETE, ETCpublic 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 asyncContains the parameter method in the event you wish to use other HTTP methods such as PUT, DELETE, ETCpublic 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(); }} 这篇关于如何正确发出http Web GET请求的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持! 上岸,阿里云!
08-19 17:57