উত্তর:
HTTP GET
এবং POST
অনুরোধ সম্পাদন করার বিভিন্ন উপায় রয়েছে :
এখানে পাওয়া যাবে: .NET Framework 4.5+
, .NET Standard 1.1+
, .NET Core 1.0+
।
এটি বর্তমানে পছন্দসই পদ্ধতি এবং এটি অ্যাসিক্রোনাস এবং উচ্চ কার্যকারিতা। বেশিরভাগ ক্ষেত্রে অন্তর্নির্মিত সংস্করণ ব্যবহার করুন তবে খুব পুরানো প্ল্যাটফর্মের জন্য একটি নিউগেট প্যাকেজ রয়েছে ।
using System.Net.Http;
HttpClient
আপনার অ্যাপ্লিকেশনটির জীবদ্দশায় একটি ইনস্ট্যান্টিয়েট করার পরামর্শ দেওয়া হয় এবং তা না ভাগ করে নেওয়া উচিত যদি না আপনার নির্দিষ্ট কারণ না থাকে।
private static readonly HttpClient client = new HttpClient();
নির্ভরতা ইনজেকশন সমাধানের HttpClientFactory
জন্য দেখুন ।
POST
var values = new Dictionary<string, string>
{
{ "thing1", "hello" },
{ "thing2", "world" }
};
var content = new FormUrlEncodedContent(values);
var response = await client.PostAsync("http://www.example.com/recepticle.aspx", content);
var responseString = await response.Content.ReadAsStringAsync();
GET
var responseString = await client.GetStringAsync("http://www.example.com/recepticle.aspx");
POST
var client = new RestClient("http://example.com");
// client.Authenticator = new HttpBasicAuthenticator(username, password);
var request = new RestRequest("resource/{id}");
request.AddParameter("thing1", "Hello");
request.AddParameter("thing2", "world");
request.AddHeader("header", "value");
request.AddFile("file", path);
var response = client.Post(request);
var content = response.Content; // Raw content as string
var response2 = client.Post<Person>(request);
var name = response2.Data.Name;
এটি একটি সাবলীল এপিআই স্পোর্ট করা একটি নতুন লাইব্রেরি, সাহায্যকারীদের পরীক্ষার জন্য, হুডের নীচে এইচটিটিপি ক্লিনেন্ট ব্যবহার করে এবং বহনযোগ্য। এটি নুগেটের মাধ্যমে উপলব্ধ ।
using Flurl.Http;
POST
var responseString = await "http://www.example.com/recepticle.aspx"
.PostUrlEncodedAsync(new { thing1 = "hello", thing2 = "world" })
.ReceiveString();
GET
var responseString = await "http://www.example.com/recepticle.aspx"
.GetStringAsync();
এখানে পাওয়া যাবে: .NET Framework 1.1+
, .NET Standard 2.0+
, .NET Core 1.0+
। .NET কোর এ এটি বেশিরভাগই সামঞ্জস্যের জন্য - এটি মোড়ানো HttpClient
, কম পারফরম্যান্ট, এবং নতুন বৈশিষ্ট্যগুলি পাবে না।
using System.Net;
using System.Text; // For class Encoding
using System.IO; // For StreamReader
POST
var request = (HttpWebRequest)WebRequest.Create("http://www.example.com/recepticle.aspx");
var postData = "thing1=" + Uri.EscapeDataString("hello");
postData += "&thing2=" + Uri.EscapeDataString("world");
var data = Encoding.ASCII.GetBytes(postData);
request.Method = "POST";
request.ContentType = "application/x-www-form-urlencoded";
request.ContentLength = data.Length;
using (var stream = request.GetRequestStream())
{
stream.Write(data, 0, data.Length);
}
var response = (HttpWebResponse)request.GetResponse();
var responseString = new StreamReader(response.GetResponseStream()).ReadToEnd();
GET
var request = (HttpWebRequest)WebRequest.Create("http://www.example.com/recepticle.aspx");
var response = (HttpWebResponse)request.GetResponse();
var responseString = new StreamReader(response.GetResponseStream()).ReadToEnd();
এটি চারপাশে একটি মোড়ক HttpWebRequest
। সঙ্গে তুলনা করুনHttpClient
।
এখানে পাওয়া যাবে: .NET Framework 1.1+
, NET Standard 2.0+
,.NET Core 2.0+
using System.Net;
using System.Collections.Specialized;
POST
using (var client = new WebClient())
{
var values = new NameValueCollection();
values["thing1"] = "hello";
values["thing2"] = "world";
var response = client.UploadValues("http://www.example.com/recepticle.aspx", values);
var responseString = Encoding.Default.GetString(response);
}
GET
using (var client = new WebClient())
{
var responseString = client.DownloadString("http://www.example.com/recepticle.aspx");
}
response.Result.Content.ReadAsStringAsync()
সহজ জিইটি অনুরোধ
using System.Net;
...
using (var wb = new WebClient())
{
var response = wb.DownloadString(url);
}
সাধারণ পোস্টের অনুরোধ
using System.Net;
using System.Collections.Specialized;
...
using (var wb = new WebClient())
{
var data = new NameValueCollection();
data["username"] = "myUser";
data["password"] = "myPassword";
var response = wb.UploadValues(url, "POST", data);
string responseInString = Encoding.UTF8.GetString(response);
}
এমএসডিএন এর একটি নমুনা রয়েছে।
using System;
using System.IO;
using System.Net;
using System.Text;
namespace Examples.System.Net
{
public class WebRequestPostExample
{
public static void Main()
{
// Create a request using a URL that can receive a post.
WebRequest request = WebRequest.Create("http://www.contoso.com/PostAccepter.aspx");
// Set the Method property of the request to POST.
request.Method = "POST";
// Create POST data and convert it to a byte array.
string postData = "This is a test that posts this string to a Web server.";
byte[] byteArray = Encoding.UTF8.GetBytes(postData);
// Set the ContentType property of the WebRequest.
request.ContentType = "application/x-www-form-urlencoded";
// Set the ContentLength property of the WebRequest.
request.ContentLength = byteArray.Length;
// Get the request stream.
Stream dataStream = request.GetRequestStream();
// Write the data to the request stream.
dataStream.Write(byteArray, 0, byteArray.Length);
// Close the Stream object.
dataStream.Close();
// Get the response.
WebResponse response = request.GetResponse();
// Display the status.
Console.WriteLine(((HttpWebResponse)response).StatusDescription);
// Get the stream containing content returned by the server.
dataStream = response.GetResponseStream();
// Open the stream using a StreamReader for easy access.
StreamReader reader = new StreamReader(dataStream);
// Read the content.
string responseFromServer = reader.ReadToEnd();
// Display the content.
Console.WriteLine(responseFromServer);
// Clean up the streams.
reader.Close();
dataStream.Close();
response.Close();
}
}
}
এটি JSON ফর্ম্যাটে ডেটা প্রেরণ / গ্রহণের সম্পূর্ণ কার্যকারী উদাহরণ, আমি ভিজ্যুয়াল স্টুডিও 2013 এক্সপ্রেস সংস্করণ ব্যবহার করেছি :
using System;
using System.Collections.Generic;
using System.Data;
using System.Data.OleDb;
using System.IO;
using System.Linq;
using System.Net.Http;
using System.Text;
using System.Threading.Tasks;
using System.Web.Script.Serialization;
namespace ConsoleApplication1
{
class Customer
{
public string Name { get; set; }
public string Address { get; set; }
public string Phone { get; set; }
}
public class Program
{
private static readonly HttpClient _Client = new HttpClient();
private static JavaScriptSerializer _Serializer = new JavaScriptSerializer();
static void Main(string[] args)
{
Run().Wait();
}
static async Task Run()
{
string url = "http://www.example.com/api/Customer";
Customer cust = new Customer() { Name = "Example Customer", Address = "Some example address", Phone = "Some phone number" };
var json = _Serializer.Serialize(cust);
var response = await Request(HttpMethod.Post, url, json, new Dictionary<string, string>());
string responseText = await response.Content.ReadAsStringAsync();
List<YourCustomClassModel> serializedResult = _Serializer.Deserialize<List<YourCustomClassModel>>(responseText);
Console.WriteLine(responseText);
Console.ReadLine();
}
/// <summary>
/// Makes an async HTTP Request
/// </summary>
/// <param name="pMethod">Those methods you know: GET, POST, HEAD, etc...</param>
/// <param name="pUrl">Very predictable...</param>
/// <param name="pJsonContent">String data to POST on the server</param>
/// <param name="pHeaders">If you use some kind of Authorization you should use this</param>
/// <returns></returns>
static async Task<HttpResponseMessage> Request(HttpMethod pMethod, string pUrl, string pJsonContent, Dictionary<string, string> pHeaders)
{
var httpRequestMessage = new HttpRequestMessage();
httpRequestMessage.Method = pMethod;
httpRequestMessage.RequestUri = new Uri(pUrl);
foreach (var head in pHeaders)
{
httpRequestMessage.Headers.Add(head.Key, head.Value);
}
switch (pMethod.Method)
{
case "POST":
HttpContent httpContent = new StringContent(pJsonContent, Encoding.UTF8, "application/json");
httpRequestMessage.Content = httpContent;
break;
}
return await _Client.SendAsync(httpRequestMessage);
}
}
}
এখানে কিছু সত্যিই ভাল উত্তর আছে। ওয়েবক্লিয়েন্ট () দিয়ে আপনার শিরোনামগুলি সেট করার জন্য আমাকে একটি ভিন্ন উপায়ে পোস্ট করতে দিন। আমি আপনাকে একটি এপিআই কী কীভাবে সেট করবেন তাও দেখাব।
var client = new WebClient();
string credentials = Convert.ToBase64String(Encoding.ASCII.GetBytes(userName + ":" + passWord));
client.Headers[HttpRequestHeader.Authorization] = $"Basic {credentials}";
//If you have your data stored in an object serialize it into json to pass to the webclient with Newtonsoft's JsonConvert
var encodedJson = JsonConvert.SerializeObject(newAccount);
client.Headers.Add($"x-api-key:{ApiKey}");
client.Headers.Add("Content-Type:application/json");
try
{
var response = client.UploadString($"{apiurl}", encodedJson);
//if you have a model to deserialize the json into Newtonsoft will help bind the data to the model, this is an extremely useful trick for GET calls when you have a lot of data, you can strongly type a model and dump it into an instance of that class.
Response response1 = JsonConvert.DeserializeObject<Response>(response);
এই সমাধানটি স্ট্যান্ডার্ড। নেট কল ছাড়া আর কিছুই ব্যবহার করে না।
পরিক্ষিত:
রেফারেন্স:
// Add a Reference to the assembly System.Web
কোড:
using System;
using System.Collections.Generic;
using System.Collections.Specialized;
using System.Net;
using System.Net.Http;
using System.Threading.Tasks;
using System.Web;
private async Task<WebResponse> CallUri(string url, TimeSpan timeout)
{
var uri = new Uri(url);
NameValueCollection rawParameters = HttpUtility.ParseQueryString(uri.Query);
var parameters = new Dictionary<string, string>();
foreach (string p in rawParameters.Keys)
{
parameters[p] = rawParameters[p];
}
var client = new HttpClient { Timeout = timeout };
HttpResponseMessage response;
if (parameters.Count == 0)
{
response = await client.GetAsync(url);
}
else
{
var content = new FormUrlEncodedContent(parameters);
string urlMinusParameters = uri.OriginalString.Split('?')[0]; // Parameters always follow the '?' symbol.
response = await client.PostAsync(urlMinusParameters, content);
}
var responseString = await response.Content.ReadAsStringAsync();
return new WebResponse(response.StatusCode, responseString);
}
private class WebResponse
{
public WebResponse(HttpStatusCode httpStatusCode, string response)
{
this.HttpStatusCode = httpStatusCode;
this.Response = response;
}
public HttpStatusCode HttpStatusCode { get; }
public string Response { get; }
}
কোনও পরামিতি ছাড়াই কল করতে (পর্দার পিছনে একটি "জিইটি" ব্যবহার করে):
var timeout = TimeSpan.FromSeconds(300);
WebResponse response = await this.CallUri("http://www.google.com/", timeout);
if (response.HttpStatusCode == HttpStatusCode.OK)
{
Console.Write(response.Response); // Print HTML.
}
পরামিতিগুলির সাথে কল করতে (পর্দার পিছনে "পোস্ট" ব্যবহার করুন):
var timeout = TimeSpan.FromSeconds(300);
WebResponse response = await this.CallUri("http://example.com/path/to/page?name=ferret&color=purple", timeout);
if (response.HttpStatusCode == HttpStatusCode.OK)
{
Console.Write(response.Response); // Print HTML.
}
সহজ (ওয়ান-লাইনার, কোনও ত্রুটি পরীক্ষা করা, প্রতিক্রিয়ার জন্য অপেক্ষা না করা) সমাধান আমি এখনও অবধি খুঁজে পেয়েছি:
(new WebClient()).UploadStringAsync(new Uri(Address), dataString);
সতর্কতার সাথে ব্যবহার করুন!
আপনি যদি একটি সাবলীল এপিআই পছন্দ করেন তবে আপনি টিনি.আরস্টক্লিয়েন্ট ব্যবহার করতে পারেন । এটি নুগেটে উপলব্ধ ।
var client = new TinyRestClient(new HttpClient(), "http://MyAPI.com/api");
// POST
var city = new City() { Name = "Paris", Country = "France" };
// With content
var response = await client.PostRequest("City", city)
.ExecuteAsync<bool>();
কেন এটি সম্পূর্ণ তুচ্ছ নয়? অনুরোধ করা নয় এবং বিশেষত ফলাফলগুলি নিয়ে কাজ করা নয় এবং মনে হয় কিছু নেট নেটও রয়েছে এতে জড়িত - এইচটিটিপিপ্লায়েন্ট-এ বাগ দেখুন et
আমি এই কোডটি দিয়ে শেষ করেছি:
static async Task<(bool Success, WebExceptionStatus WebExceptionStatus, HttpStatusCode? HttpStatusCode, string ResponseAsString)> HttpRequestAsync(HttpClient httpClient, string url, string postBuffer = null, CancellationTokenSource cts = null) {
try {
HttpResponseMessage resp = null;
if (postBuffer is null) {
resp = cts is null ? await httpClient.GetAsync(url) : await httpClient.GetAsync(url, cts.Token);
} else {
using (var httpContent = new StringContent(postBuffer)) {
resp = cts is null ? await httpClient.PostAsync(url, httpContent) : await httpClient.PostAsync(url, httpContent, cts.Token);
}
}
var respString = await resp.Content.ReadAsStringAsync();
return (resp.IsSuccessStatusCode, WebExceptionStatus.Success, resp.StatusCode, respString);
} catch (WebException ex) {
WebExceptionStatus status = ex.Status;
if (status == WebExceptionStatus.ProtocolError) {
// Get HttpWebResponse so that you can check the HTTP status code.
using (HttpWebResponse httpResponse = (HttpWebResponse)ex.Response) {
return (false, status, httpResponse.StatusCode, httpResponse.StatusDescription);
}
} else {
return (false, status, null, ex.ToString());
}
} catch (TaskCanceledException ex) {
if (cts is object && ex.CancellationToken == cts.Token) {
// a real cancellation, triggered by the caller
return (false, WebExceptionStatus.RequestCanceled, null, ex.ToString());
} else {
// a web request timeout (possibly other things!?)
return (false, WebExceptionStatus.Timeout, null, ex.ToString());
}
} catch (Exception ex) {
return (false, WebExceptionStatus.UnknownError, null, ex.ToString());
}
}
এটি একটি জিইটি বা পোষ্ট করবে যদি নির্ভর করে postBuffer
শূন্য হবে তা
যদি সাফল্যটি সত্য হয় তবে প্রতিক্রিয়াটি তখনই আসবে ResponseAsString
যদি সাফল্য মিথ্যা আপনি না পরীক্ষা করতে WebExceptionStatus
, HttpStatusCode
এবং ResponseAsString
তা দেখতে ভুল হয়েছে চেষ্টা করুন।
নেট কোরটিতে আপনি নিম্নলিখিত কোডের সাথে পোস্ট কল করতে পারেন, এখানে আমি এই কোডটিতে কিছু অতিরিক্ত বৈশিষ্ট্য যুক্ত করেছি যাতে আপনার কোডটি একটি প্রক্সির পিছনে এবং নেটওয়ার্ক শংসাপত্রগুলির সাথে যদি কোনও হয় তবে এটিও এখানে উল্লেখ করছি যে আপনি এর এনকোডিং পরিবর্তন করতে পারবেন তোমার বার্তা. আমি আশা করি এটি সমস্ত ব্যাখ্যা করে এবং কোডিংয়ে আপনাকে সহায়তা করবে।
HttpClient client = GetHttpClient(_config);
if (headers != null)
{
foreach (var header in headers)
{
client.DefaultRequestHeaders.TryAddWithoutValidation(header.Key, header.Value);
}
}
client.BaseAddress = new Uri(baseAddress);
Encoding encoding = Encoding.UTF8;
var result = await client.PostAsync(url, new StringContent(body, encoding, "application/json")).ConfigureAwait(false);
if (result.IsSuccessStatusCode)
{
return new RequestResponse { severity = "Success", httpResponse = result.Content.ReadAsStringAsync().Result, StatusCode = result.StatusCode };
}
else
{
return new RequestResponse { severity = "failure", httpResponse = result.Content.ReadAsStringAsync().Result, StatusCode = result.StatusCode };
}
public HttpClient GetHttpClient(IConfiguration _config)
{
bool ProxyEnable = Convert.ToBoolean(_config["GlobalSettings:ProxyEnable"]);
HttpClient client = null;
if (!ProxyEnable)
{
client = new HttpClient();
}
else
{
string ProxyURL = _config["GlobalSettings:ProxyURL"];
string ProxyUserName = _config["GlobalSettings:ProxyUserName"];
string ProxyPassword = _config["GlobalSettings:ProxyPassword"];
string[] ExceptionURL = _config["GlobalSettings:ExceptionURL"].Split(';');
bool BypassProxyOnLocal = Convert.ToBoolean(_config["GlobalSettings:BypassProxyOnLocal"]);
bool UseDefaultCredentials = Convert.ToBoolean(_config["GlobalSettings:UseDefaultCredentials"]);
WebProxy proxy = new WebProxy
{
Address = new Uri(ProxyURL),
BypassProxyOnLocal = BypassProxyOnLocal,
UseDefaultCredentials = UseDefaultCredentials,
BypassList = ExceptionURL,
Credentials = new NetworkCredential(ProxyUserName, ProxyPassword)
};
HttpClientHandler handler = new HttpClientHandler { Proxy = proxy };
client = new HttpClient(handler,true);
}
return client;
}
HttpWebResponse response = (HttpWebResponse)HttpWReq.GetResponse();