C# Как правильно сделать запрос http web GET
Я все еще новичок на c#, и я пытаюсь создать приложение для этой страницы, которое сообщит мне, когда я получу уведомление (ответил, прокомментировал и т. д..). Но сейчас я просто пытаюсь сделать простой вызов API, который будет возвращать данные пользователя.
Я использую Visual studio express 2012 для создания приложения C#, где (на данный момент) Вы вводите свой идентификатор пользователя, поэтому приложение сделает запрос с идентификатором пользователя и покажет статистику этого идентификатора пользователя.
здесь код, где я пытаюсь сделать запрос:
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;
}
}
}
класс является объектом и его доступ из формы, просто проанализировав его идентификатор пользователя и сделать запрос.
Я пробовал многие примеры, которые я смотрел на google, но не знаю, почему я получаю на всех путях это сообщение "�".
Я новичок в таком алгоритме, если кто-то может поделиться книгой или учебником, который показывает, как делать такие вещи (объясняя каждый шаг), я был бы признателен это
3 ответов:
серверы иногда сжимают свои ответы, чтобы сэкономить на пропускной способности, когда это происходит, вам нужно распаковать ответ, прежде чем пытаться его прочитать. К счастью, .NET framework может сделать это автоматически,однако мы должны включить этот параметр.
вот пример того, как вы могли бы достичь этого.
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);
EDIT 23/11/17
обновлено, чтобы выбросить примеры, используя асинхронность для обоих запросов GET, а также Пост
GET
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
содержит параметрmethodв случае, если вы хотите использовать другие методы HTTP, такие как PUT, DELETE и т. д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 async
содержит параметрmethodв случае, если вы хотите использовать другие методы HTTP, такие как PUT, DELETE, И т. д.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(); } }
другой способ-использовать 'HttpClient' следующим образом:
using System; using System.Net; using System.Net.Http; namespace Test { class Program { static void Main(string[] args) { Console.WriteLine("Making API Call..."); using (var client = new HttpClient(new HttpClientHandler { AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate })) { client.BaseAddress = new Uri("https://api.stackexchange.com/2.2/"); HttpResponseMessage response = client.GetAsync("answers?order=desc&sort=activity&site=stackoverflow").Result; response.EnsureSuccessStatusCode(); string result = response.Content.ReadAsStringAsync().Result; Console.WriteLine("Result: " + result); } Console.ReadLine(); } } }
var request = (HttpWebRequest)WebRequest.Create("sendrequesturl"); var response = (HttpWebResponse)request.GetResponse(); string responseString; using (var stream = response.GetResponseStream()) { using (var reader = new StreamReader(stream)) { responseString = reader.ReadToEnd(); } }
Comments