কীভাবে সঠিকভাবে কোনও ওয়েব ওয়েব জিইটি অনুরোধ করা যায়


112

আমি সি # তে এখনও নতুন এবং আমি এই পৃষ্ঠার জন্য একটি অ্যাপ্লিকেশন তৈরি করার চেষ্টা করছি যা আমাকে বিজ্ঞপ্তি পেলে আমাকে জানাবে (উত্তর, মন্তব্য করা ইত্যাদি)। তবে আপাতত আমি এপিআইতে একটি সাধারণ কল করার চেষ্টা করছি যা ব্যবহারকারীর ডেটা পাবে।

আমি সি # অ্যাপ্লিকেশনটি তৈরি করতে ভিজ্যুয়াল স্টুডিও এক্সপ্রেস 2012 ব্যবহার করছি, যেখানে (আপাতত) আপনি নিজের ব্যবহারকারী আইডি প্রবেশ করান, সুতরাং অ্যাপ্লিকেশনটি ব্যবহারকারী আইডির সাথে অনুরোধ জানাবে এবং এই ব্যবহারকারীর আইডিটির পরিসংখ্যানগুলি প্রদর্শন করবে show

এখানে কোডটি আমি অনুরোধ করার চেষ্টা করছি:

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;
        }
    }
}

ক্লাসটি একটি অবজেক্ট এবং এটির ব্যবহারকারীর আইডি পার্স করে অনুরোধটি করে ফর্মটি থেকে অ্যাক্সেস করা হচ্ছে।

আমি গুগলে দেখেছি এমন অনেকগুলি উদাহরণ চেষ্টা করেছি, তবে কেন আমি এই বার্তাটি " " সমস্ত উপায়ে পাচ্ছি তা সন্ধান করতে পারছি না।

আমি এই ধরণের অ্যালগরিদমে নতুন, যদি কেউ এমন কোনও বই বা টিউটোরিয়াল শেয়ার করতে পারে যা দেখায় যে এই ধরণের জিনিসগুলি কীভাবে করা যায় (প্রতিটি পদক্ষেপের ব্যাখ্যা দেওয়া হয়), আমি এটির প্রশংসা করব

উত্তর:


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

অ্যাসিঙ্ক পান

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

    

আপনি অন্যান্য 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..
মেথডম্যান

আপনাকে ধন্যবাদ, আমি ডিকম্প্রেসিংয়ের বিষয়ে জানতাম না, আমি একজন পিএইচপি / নোডেজ বিকাশকারী এবং এই প্রথম আমি ডেস্কটপ অ্যাপ্লিকেশনগুলিতে বিকাশ শুরু করি।
অস্কার রেইস

আপনার স্বাগত, আপনি পুনরুদ্ধার করেছেন এমন JSON প্রতিক্রিয়াটি deserialize করতে আপনি 'নিউটনসফট.জসন' এ একবার দেখতে চান।
আয়দ্দিন


2
@ahmadmolaie যোগ করা হয়েছে তাদের, পাশাপাশি কিভাবে পোষ্ট অনুরোধ করতে যেমন
Aydin,

39

আর একটি উপায় এইভাবে 'এইচটিপিপ্লেইয়েন্ট' ব্যবহার করছে:

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

HttpClient বনাম HttpWebRequest

জুন 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);           
 }

। নেট কোর ২.১+ ব্যবহার করে, আইএইচটিপিপ্লিয়েন্টফ্যাক্টরিটি ব্যবহার এবং আপনার স্টার্টআপ কোডে এই জাতীয় ইনজেকশন বিবেচনা করুন ।

 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 , কখনও কোনও ব্যবহারের বিবৃতিতে এইচটিটিপি ক্লিনেন্টকে মোড়বেন না।
এসফর্স বলছেন মনিকা

4
@ এসফর্স কখনও কখনও বলবেন না। কোড দেখুন। HttpClientউদাহরণ হিসেবে বলা যায় প্রোগ্রামের জীবনের জন্য ঠিক একবার ব্যবহার করা হয় এবং ঠিক আগে প্রোগ্রাম প্রস্থানের বিন্যস্ত করা হয়। এটি সম্পূর্ণ সঠিক এবং উপযুক্ত।
টড মেনিয়ার

আমি নিশ্চিত না যে আপনি কীভাবে এই নিবন্ধটি এবং অন্যকে এইচটিপিপিপ্লায়েন্টের উদাহরণটি সঠিকভাবে তৈরি করবেন সে বিষয়ে বিতর্ক করতে পারেন। একটি প্রাইভেট স্ট্যাটিক ভেরিয়েবল ব্যবহার করে, যা নিষ্পত্তি হয় না। এ কারণে, সেই নিবন্ধে উদ্ধৃত হিসাবে: (নিষ্পত্তি না করার বিষয়ে) ... "তবে এইচটিটিপিপ্লায়েন্টটি আলাদা। নিরাপদ। প্রতিটি মৃত্যুদন্ড কার্যকর করার জন্য এইচটিপিপি্লিয়েন্টের একটি নতুন উদাহরণ তৈরি করার পরিবর্তে আপনার এই অ্যাপ্লিকেশনটির পুরো জীবনকালের জন্য এইচটিটিপিপ্লিনেন্টের একক উদাহরণ ভাগ করা উচিত। "
এসফর্স বলছেন মনিকা

আমি বুঝতে পারি আমার মন্তব্যটি 2 বছর অনেক দেরি হয়ে গেছে, তবে টড নিবন্ধটি নিয়ে বিতর্ক করছেন না। টড কেবল এই কথাটিই বলছিলেন যে পুরো প্রোগ্রামটির উদাহরণ দেওয়া সত্ত্বেও, অ্যাপ্লিকেশনটির জীবনের জন্য একটি একক এইচটিপিপিএলিয়েন্ট ব্যবহার করা হয়।
জন

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
কোড বস্তু নিষ্পত্তি করে না; একটি স্মৃতি ফাঁস হতে পারে। বিবৃতি ব্যবহার করা প্রয়োজন।
স্টারট্র্যাকরেডনেক

আপনি কোনও ইমপ্লিটলি-টাইপড ভেরিয়েবল <নাল> কে বরাদ্দ করতে পারবেন না!
লুকা জিগলারের

এটি কেবল নাল ঘোষণা করে i আমি জানি know
মনিশ শর্মা
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.