Http वेब GET अनुरोध को ठीक से कैसे करें


112

मैं अभी भी c # पर नया हूं और मैं इस पृष्ठ के लिए एक एप्लिकेशन बनाने की कोशिश कर रहा हूं जो मुझे एक अधिसूचना (उत्तर, टिप्पणी, आदि) मिलने पर बताएगा। लेकिन अभी के लिए मैं सिर्फ एपी को एक साधारण कॉल करने की कोशिश कर रहा हूं जो उपयोगकर्ता का डेटा प्राप्त करेगा।

मैं C # एप्लिकेशन के निर्माण के लिए विज़ुअल स्टूडियो एक्सप्रेस 2012 का उपयोग कर रहा हूं, जहां (अब के लिए) आप अपना यूजर आईडी दर्ज करते हैं, इसलिए एप्लिकेशन यूजर आईडी के साथ अनुरोध करेगा और इस यूजर आईडी के आंकड़े दिखाएगा।

यहां वह कोड है जहां मैं अनुरोध करने की कोशिश कर रहा हूं:

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 पर देखा है, लेकिन यह नहीं पता है कि मुझे यह संदेश "।" सभी तरीकों से क्यों मिल रहा है।

मैं इस तरह के एल्गोरिथ्म में नया हूं, अगर कोई पुस्तक या ट्यूटोरियल साझा कर सकता है जो दिखाता है कि इस तरह का सामान कैसे करना है (प्रत्येक चरण को समझाते हुए), मैं इसकी सराहना करूंगा

जवाबों:


247

बैंडविड्थ पर सहेजने के लिए सर्वर कभी-कभी अपनी प्रतिक्रियाओं को संपीड़ित करते हैं, जब ऐसा होता है, तो आपको इसे पढ़ने का प्रयास करने से पहले प्रतिक्रिया को विघटित करने की आवश्यकता होती है। सौभाग्य से, .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();
    }
}

ASync करें

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, ETC का उपयोग करना चाहते हैं

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 अन्य 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();
    }
}

4
FYI आप कैसे पार्स करने के लिए का एक उदाहरण दिखाने के लिए चाहते हो सकता है htmlस्ट्रिंग +1माध्यम से स्वच्छ कोड के लिए ..
MethodMan

धन्यवाद, मुझे डिकम्प्रेसिंग के बारे में नहीं पता था, मैं एक php / ndjs डेवलपर हूं और यह पहली बार है जब मैं डेस्कटॉप ऐप्स पर विकसित करना शुरू कर रहा हूं।
ऑस्कर रेयेस

आपका स्वागत है, आप JSON की प्रतिक्रिया को पुनः प्राप्त करने के लिए 'Newtonsoft.Json' पर एक नज़र डाल सकते हैं।
आइडिन

वहाँ async संस्करण के लिए कोई मौका नहीं है
अहम् molaie

2
@ahmadmolaie जोड़ा गया उन्हें, साथ ही कैसे पोस्ट अनुरोध करने के लिए के रूप में
Aydin

39

एक अन्य तरीका इस तरह से '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();
        }
    }
}

HttpWebRequest बनाम HttpClient

22 जून, 2020 को अपडेट करें: httpclient का उपयोग 'ब्लॉक' का उपयोग करके ब्लॉक करने के लिए किया जाता है क्योंकि यह पोर्ट थकावट का कारण हो सकता है।

private static HttpClient client = null;
    
ContructorMethod()
{
   if(client == null)
   {
        HttpClientHandler handler = new HttpClientHandler()
        {
            AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate
        };        
        client = new HttpClient(handler);
   }
   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);           
 }

यदि .Net Core 2.1+ का उपयोग किया जाता है, तो IHttpClientFactory का उपयोग करने और अपने स्टार्टअप कोड में इस तरह से इंजेक्शन लगाने पर विचार करें।

 var timeout = Policy.TimeoutAsync<HttpResponseMessage>(
            TimeSpan.FromSeconds(60));

 services.AddHttpClient<XApiClient>().ConfigurePrimaryHttpMessageHandler(() => new HttpClientHandler
        {
            AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate
        }).AddPolicyHandler(request => timeout);

1
धन्यवाद! मेरे लिए बहुत उपयोगी है। मैंने केवल प्रतिक्रिया और "सामग्री" का उपयोग करके सामग्री को संलग्न करके थोड़ा संशोधित किया:
कोडी

5
प्रति aspnetmonsters.com/2016/08/2016-08-27-httpclientwrong पर , कभी भी एक स्टेटमेंट का उपयोग करके HttpClient को लपेटें नहीं।
sfors का कहना है कि

4
@ शेफर्स ने कभी नहीं कहा। कोड को देखो। HttpClientउदाहरण के कार्यक्रम के जीवन के लिए ठीक एक बार प्रयोग किया जाता है और बस से पहले कार्यक्रम बाहर निकलता निपटान किया जाता है। यह पूरी तरह से सही और उचित है।
टोड मेनियर

मुझे यकीन नहीं है कि आप उस लेख और अन्य पर कैसे विवाद कर सकते हैं कि HttpClient का एक उदाहरण ठीक से कैसे बनाया जाए। निजी स्थिर वैरिएबल का उपयोग करना, जिसका निपटान नहीं होता है। इस वजह से, जैसा कि उस लेख में उद्धृत किया गया है: (निपटान का उपयोग नहीं करने के बारे में) ... "लेकिन HttpClient अलग है। हालांकि यह आईडीआईजॉफ़िकल इंटरफ़ेस को लागू करता है यह वास्तव में एक साझा वस्तु है। इसका मतलब है कि कवर के तहत यह रीवेंटेंट और थ्रेड है। सुरक्षित। प्रत्येक निष्पादन के लिए HttpClient का एक नया उदाहरण बनाने के बजाय आपको आवेदन के पूरे जीवनकाल के लिए HttpClient का एक भी उदाहरण साझा करना चाहिए। "
sfors का कहना है कि मोनिका

मुझे लगता है कि मेरी टिप्पणी 2 साल बहुत देर हो चुकी है, लेकिन टॉड लेख को विवादित नहीं कर रहा था। टॉड बस इतना कह रहे थे कि पूर्ण कार्यक्रम का उदाहरण देते हुए, एप्लिकेशन के जीवन के लिए एक एकल HttpClient का उपयोग किया जाता है।
जॉन

4

मेरी राय के लिए सबसे सरल तरीका

  var web = new WebClient();
  var url = $"{hostname}/LoadDataSync?systemID={systemId}";
  var responseString = web.DownloadString(url);

या

 var bytes = web.DownloadData(url);

3
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();
    }
}

5
कोड वस्तुओं का निपटान नहीं करता है; मेमोरी लीक हो सकती है। बयानों का उपयोग करने की आवश्यकता है।
StarTrekRedneck

आप एक अस्पष्ट-टाइप किए गए चर को <null> असाइन नहीं कर सकते हैं!
लुका ज़िगलर

इसकी केवल घोषणा null.i मुझे पता है कि मैं null हटा देता हूं।
मनीष शर्मा
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.