সি # তে ওয়েবক্লিয়েন্ট ব্যবহার করে নির্দিষ্ট URL এ কীভাবে ডেটা পোস্ট করা যায়


319

আমার কাছে থাকা নির্দিষ্ট ইউআরএলে কিছু ডেটা পোস্ট করতে আমার ওয়েবক্লিয়েন্টের সাথে "এইচটিটিপি পোস্ট" ব্যবহার করা দরকার।

এখন, আমি জানি এটি WebRequest দিয়ে সম্পন্ন করা যেতে পারে তবে কিছু কারণে আমি এর পরিবর্তে ওয়েবক্লিয়েন্ট ব্যবহার করতে চাই। এটা কি সম্ভব? যদি তা হয় তবে কেউ কি আমাকে কিছু উদাহরণ প্রদর্শন করতে পারেন বা আমাকে সঠিক দিকে নির্দেশ করতে পারেন?

উত্তর:


374

আমি সবেমাত্র সমাধানটি খুঁজে পেয়েছি এবং হ্যাঁ এটি আমার চিন্তা করার চেয়ে সহজ ছিল :)

সুতরাং সমাধান এখানে:

string URI = "http://www.myurl.com/post.php";
string myParameters = "param1=value1&param2=value2&param3=value3";

using (WebClient wc = new WebClient())
{
    wc.Headers[HttpRequestHeader.ContentType] = "application/x-www-form-urlencoded";
    string HtmlResult = wc.UploadString(URI, myParameters);
}

এটি কবজ মত কাজ করে :)


28
একটি নিটপিক: HttpRequestHeader.ContentTypeএখানে এখানে গণনার সদস্য ব্যবহার করা ভাল web.Headers[HttpRequestHeader.ContentType]: পি
অ্যালেক্স

12
আর একটি নিতপিক, আপনার ওয়েবক্লিয়েন্টটি সঠিকভাবে .ডিস্পোজ বা "ব্যবহার করা" আইডিয়ামটি ব্যবহার করে নিষ্পত্তি করা উচিত: (ওয়েবক্লিয়েন্ট ডাব্লুসিটি = নতুন ওয়েবক্লিয়েন্ট ()) ব্যবহার করে your // আপনার কোড এখানে}
মিকি হোগারথ

1
@RobinVanPersi আমি মনে করি ShikataGanai (রফিক বারী) বোঝানো যে অন্য উত্তর ( stackoverflow.com/a/13061805/1160796 ) ভাল কারণ এটা আপনার জন্য এনকোডিং পরিচালনা করা হয়।
বেসের

3
@ alpsystems.com আইডিস্পোজযোগ্য অবজেক্টগুলিকে প্রোগ্রামার দ্বারা সঠিকভাবে নিষ্পত্তি করা দরকার, হয় কোনও ব্যবহারের মধ্যে মোড়ানো দ্বারা বা স্পষ্টতই অনুরোধ করা উচিত is বিবাদ ()। আবর্জনা সংগ্রাহক
অপরিশোধিত

1
@ Ccalboni এর ব্যাখ্যা প্রসারিত করতে। কিছু ক্ষেত্রে আবর্জনা সংগ্রাহক বিনা নিয়ন্ত্রককে কল করে (যেমন, WebClientউত্তরাধিকার সূত্রে প্রাপ্ত Componentযা থেকে ~Component() {Dispose(false);}) ডেকে আনহীন ব্যবস্থাপনার সংস্থানগুলি এবং এর মতো পরিষ্কার করে দেবে । সমস্যাটি হ'ল আবর্জনা সংগ্রাহক এটি করতে ইচ্ছামত দীর্ঘ সময় নিতে পারে, যেহেতু এটি সংগ্রহের সিদ্ধান্ত নেওয়ার সময় অপরিকল্পিত সংস্থানগুলির জন্য অ্যাকাউন্ট করে না। উচ্চ-মূল্যবান সংস্থানগুলি যত তাড়াতাড়ি সম্ভব পরিষ্কার করা উচিত। উদাহরণস্বরূপ, অপরিবর্তিত ফাইল হ্যান্ডেলটি খোলা রেখে ফাইলটি অন্য কোড দ্বারা মুছে ফেলা বা লিখিত হওয়া থেকে আটকাতে পারে।
ব্রায়ান

361

আপলোডভ্যালিউস নামে একটি বিল্ট ইন পদ্ধতি রয়েছে যা HTTP পোষ্ট (বা কোনও ধরণের এইচটিটিপি পদ্ধতি) প্রেরণ করতে পারে এবং অনুরোধের বডি ("&" দিয়ে প্যারামিটারগুলি কনটেনেট করে এবং ইউআরএল এনকোডিং দ্বারা অক্ষরগুলি পলায়ন করে) সঠিক ফর্ম ডেটা ফর্ম্যাটে পরিচালনা করে:

using(WebClient client = new WebClient())
{
    var reqparm = new System.Collections.Specialized.NameValueCollection();
    reqparm.Add("param1", "<any> kinds & of = ? strings");
    reqparm.Add("param2", "escaping is already handled");
    byte[] responsebytes = client.UploadValues("http://localhost", "POST", reqparm);
    string responsebody = Encoding.UTF8.GetString(responsebytes);
}

1
আমি যদি নিয়ামকের কাছে কোনও মডেল পোস্ট করতে চাই তবে কী হবে? আমি কি এখনও rekparm.Add (স্ট্রিং, স্ট্রিং) ব্যবহার করতে পারি?
বুরাক করাকুş

6
@ বুড়াকাকড়াকুş মানে কি আপনি শরীরে জেএসএন পাঠাতে চান? তারপরে আপনি ওয়েবক্লিয়েন্ট ব্যবহার করতে পারেন pঅপলোড স্ট্রিং । হেডারে কনটেন্ট-টাইপ: অ্যাপ্লিকেশন / জেসন যুক্ত করতে ভুলবেন না।
এন্ডি তেজহোনো

@ এনডিটিজাহোজনো: আমি কীভাবে রেডিও বোতামের মান পোস্ট করতে পারি। ধরুন আমার কাছে 3 টি রেডিও বোতাম একই গ্রুপের।
আসাদ রেফাই

আমি কীভাবে প্রতিক্রিয়া কোড পাব? প্রতিক্রিয়া শিরোনাম? আমি কি প্রতিক্রিয়া পার্স করতে হবে? এটি করার কোন সহজ উপায় আছে?
জে সুলিভান

সতর্কতা namevalueCollection donest একই কী .thus অদ্ভুত begaiviour উঠতে পারে অনুমতি
bh_earth0

40

ব্যবহার করে WebClient.UploadStringবা WebClient.UploadDataআপনি সার্ভারে সহজেই ডেটা পোস্ট করতে পারেন। আমি আপলোডডাটা ব্যবহার করে একটি উদাহরণ দেখাব, যেহেতু আপলোড স্ট্রিংটি ডাউনলোড স্ট্রিংয়ের মতো একইভাবে ব্যবহৃত হয়।

byte[] bret = client.UploadData("http://www.website.com/post.php", "POST",
                System.Text.Encoding.ASCII.GetBytes("field1=value1&amp;field2=value2") );

            string sret = System.Text.Encoding.ASCII.GetString(bret);

আরও: http://www.daveamenta.com/2008-05/c-webclient-usage/


5
ব্যবহার করা আরও ভাল: ক্লায়েন্ট.এনকোডিং = সিস্টেম। স্ট্রিং ভ্যারভ্যালু = ইউরি.এস্কেপডাটাস্ট্রিং (মান);
ইউরি ভিকুলভ

23
string URI = "site.com/mail.php";
using (WebClient client = new WebClient())
{
    System.Collections.Specialized.NameValueCollection postData = 
        new System.Collections.Specialized.NameValueCollection()
       {
              { "to", emailTo },  
              { "subject", currentSubject },
              { "body", currentBody }
       };
    string pagesource = Encoding.UTF8.GetString(client.UploadValues(URI, postData));
}

21
//Making a POST request using WebClient.
Function()
{    
  WebClient wc = new WebClient();

  var URI = new Uri("http://your_uri_goes_here");

  //If any encoding is needed.
  wc.Headers["Content-Type"] = "application/x-www-form-urlencoded";
  //Or any other encoding type.

  //If any key needed

  wc.Headers["KEY"] = "Your_Key_Goes_Here";

  wc.UploadStringCompleted += 
      new UploadStringCompletedEventHandler(wc_UploadStringCompleted);

  wc.UploadStringAsync(URI,"POST","Data_To_Be_sent");    
}

void wc__UploadStringCompleted(object sender, UploadStringCompletedEventArgs e)    
{  
  try            
  {          
     MessageBox.Show(e.Result); 
     //e.result fetches you the response against your POST request.         
  }
  catch(Exception exc)         
  {             
     MessageBox.Show(exc.ToString());            
  }
}

উপরের সমস্তগুলি কার্যকর করে পোস্টিং এবং ব্লক করে দেওয়া async সংস্করণটি ব্যবহার করা ভাল।
জুয়ান

ডাব্লু __ সরান wc__ আপলোড স্ট্রিং কমপ্লিট
জোয়েল ডেভিস

1
উপরের সমস্ত উত্তরগুলি পরীক্ষায় ঠিকঠাক কাজ করবে তবে দুর্বল ইন্টারনেটের সাথে একটি বাস্তব জীবনের পরিস্থিতিতে এটি আরও ভাল উত্তর।
জোয়েল ডেভিস

2

সাধারণ ব্যবহার সহজভাবে client.UploadString(adress, content);কাজ করে তবে আমি মনে করি যে এটি WebExceptionএকটি HTTP সফল স্থিতি কোডটি ফেরত না দিলে নিক্ষিপ্ত হবে। দূরবর্তী সার্ভারটি যে কোনও ব্যতিক্রম বার্তা প্রিন্ট করতে আমি সাধারণত এটি হ্যান্ডেল করি:

try
{
    postResult = client.UploadString(address, content);
}
catch (WebException ex)
{
    String responseFromServer = ex.Message.ToString() + " ";
    if (ex.Response != null)
    {
        using (WebResponse response = ex.Response)
        {
            Stream dataRs = response.GetResponseStream();
            using (StreamReader reader = new StreamReader(dataRs))
            {
                responseFromServer += reader.ReadToEnd();
                _log.Error("Server Response: " + responseFromServer);
            }
        }
    }
    throw;
}

আপনাকে ধন্যবাদ, ওগ্লাস। আমি ত্রুটি সন্ধান করতে অনেক সময় ব্যয় করেছি এবং আপনার কোড আমাকে ঠিক করার জন্য আরও তথ্য দেয়।
কেট

1

মডেল সহ ওয়েব্যাপিক্লিয়েন্ট ব্যবহার করে সিরিয়ালাইজ জেসন প্যারামিটারের অনুরোধ প্রেরণ করুন।

PostModel.cs

    public string Id { get; set; }
    public string Name { get; set; }
    public string Surname { get; set; }
    public int Age { get; set; }

WebApiClient.cs

internal class WebApiClient  : IDisposable
  {

    private bool _isDispose;

    public void Dispose()
    {
        Dispose(true);
        GC.SuppressFinalize(this);
    }

    public void Dispose(bool disposing)
    {
        if (!_isDispose)
        {

            if (disposing)
            {

            }
        }

        _isDispose = true;
    }

    private void SetHeaderParameters(WebClient client)
    {
        client.Headers.Clear();
        client.Headers.Add("Content-Type", "application/json");
        client.Encoding = Encoding.UTF8;
    }

    public async Task<T> PostJsonWithModelAsync<T>(string address, string data,)
    {
        using (var client = new WebClient())
        {
            SetHeaderParameters(client);
            string result = await client.UploadStringTaskAsync(address, data); //  method:
    //The HTTP method used to send the file to the resource. If null, the default is  POST 
            return JsonConvert.DeserializeObject<T>(result);
        }
    }
}

ব্যবসায় কলার পদ্ধতি

    public async Task<ResultDTO> GetResultAsync(PostModel model)
    {
        try
        {
            using (var client = new WebApiClient())
            {
                var serializeModel= JsonConvert.SerializeObject(model);// using Newtonsoft.Json;
                var response = await client.PostJsonWithModelAsync<ResultDTO>("http://www.website.com/api/create", serializeModel);
                return response;
            }
        }
        catch (Exception ex)
        {
            throw new Exception(ex.Message);
        }

    }

0

এখানে খাস্তা উত্তর:

public String sendSMS(String phone, String token) {
    WebClient webClient = WebClient.create(smsServiceUrl);

    SMSRequest smsRequest = new SMSRequest();
    smsRequest.setMessage(token);
    smsRequest.setPhoneNo(phone);
    smsRequest.setTokenId(smsServiceTokenId);

    Mono<String> response = webClient.post()
          .uri(smsServiceEndpoint)
          .header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE)
          .body(Mono.just(smsRequest), SMSRequest.class)
          .retrieve().bodyToMono(String.class);

    String deliveryResponse = response.block();
    if (deliveryResponse.equalsIgnoreCase("success")) {
      return deliveryResponse;
    }
    return null;
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.