সি # ব্যবহার করে কীভাবে কোনও সার্ভারে জেএসএন পোস্ট করবেন?


269

আমি যে কোডটি ব্যবহার করছি তা এখানে:

// create a request
HttpWebRequest request = (HttpWebRequest)
WebRequest.Create(url); request.KeepAlive = false;
request.ProtocolVersion = HttpVersion.Version10;
request.Method = "POST";


// turn our request string into a byte stream
byte[] postBytes = Encoding.UTF8.GetBytes(json);

// this is important - make sure you specify type this way
request.ContentType = "application/json; charset=UTF-8";
request.Accept = "application/json";
request.ContentLength = postBytes.Length;
request.CookieContainer = Cookies;
request.UserAgent = currentUserAgent;
Stream requestStream = request.GetRequestStream();

// now send it
requestStream.Write(postBytes, 0, postBytes.Length);
requestStream.Close();

// grab te response and print it out to the console along with the status code
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
string result;
using (StreamReader rdr = new StreamReader(response.GetResponseStream()))
{
    result = rdr.ReadToEnd();
}

return result;

আমি যখন এটি চালাচ্ছি, আমি সর্বদা 500 অভ্যন্তরীণ সার্ভার ত্রুটি পাচ্ছি।

আমি কি ভুল করছি?


1
প্রথমে নিশ্চিত হয়ে নিন যে আপনার পোস্ট করা ডেটা সার্ভারের প্রত্যাশাটি।
এলবি

আসলে, দেখে মনে হচ্ছে আমি অবৈধ ডেটা পোস্ট করছিলাম ...
আর্সেন জহরে

কাজের স্বাচ্ছন্দ্যের জন্য আপনি নিজের ভিজ্যুয়াল স্টুডিওতে জসন গ্রন্থাগারটিও যুক্ত করতে পারেন
আলিরাজা টাবাতাবাইয়ান

@ আরসেন - সার্ভারের ত্রুটিযুক্ত ডেটা দিয়ে ক্রাশ করা উচিত নয়। একটি বাগ রিপোর্ট ফাইল করুন।
jww

উত্তর:


396

আমি যেভাবে এটি করছি এবং কাজ করছি তা হ'ল:

var httpWebRequest = (HttpWebRequest)WebRequest.Create("http://url");
httpWebRequest.ContentType = "application/json";
httpWebRequest.Method = "POST";

using (var streamWriter = new StreamWriter(httpWebRequest.GetRequestStream()))
{
    string json = "{\"user\":\"test\"," +
                  "\"password\":\"bla\"}";

    streamWriter.Write(json);
}

var httpResponse = (HttpWebResponse)httpWebRequest.GetResponse();
using (var streamReader = new StreamReader(httpResponse.GetResponseStream()))
{
    var result = streamReader.ReadToEnd();
}

এই কার্যটি সহজ উপায়ে সম্পাদনের জন্য আমি একটি গ্রন্থাগার লিখেছি, এটি এখানে: https://github.com/ademargomes/JsonRequest

আশা করি এটা সাহায্য করবে.


3
আমি মনে করি জেএসন স্ট্রিং লাইনটি হওয়া উচিত: স্ট্রিং জসন = "{\" ব্যবহারকারী \ ": \" পরীক্ষা \ "," + "password" পাসওয়ার্ড \ ": bla" ব্লেস \ "}"; দেখে মনে হচ্ছে আপনি কোনও missing
ড্রিম লেন

3
সর্বদা "অ্যাপ্লিকেশন / জসন" ব্যবহার করুন (যদি না অন্য কোনও কারণে যেমন টেক্সট / জেসন প্রয়োজন হয় যেমন: এনটওয়াইক্লুংসডেঙ্কেন.ইড / ২০০৮ / 06/06 / )। : Creding যায় stackoverflow.com/questions/477816/...
ইয়ানিভ

34
আমি স্ট্রিম রাইটার.ফ্লুশ () ভেবেছি; এবং স্ট্রিম রাইটার.ক্লোজ (); আপনি ব্যবহারের ব্লকের ভিতরে থাকায় এটি প্রয়োজনীয় নয়। ব্যবহার ব্লক শেষে, স্ট্রিম লেখক যাইহোক বন্ধ হবে।
রুচিরা

1
ম্যানুয়ালি JSON তৈরি করবেন না। ভুল করা সহজ যে JSON ইনজেকশনের অনুমতি দেয়।
ফ্লোরিয়ান শীতকাল

5
@ user3772108 দেখুন stackoverflow.com/a/16380064/2279059 । জেএসএন লাইব্রেরি যেমন নিউটনসফট জেএসওএন.নেট ব্যবহার করুন এবং কোনও বস্তু থেকে জেএসএন স্ট্রিং রেন্ডার করুন, বা সিরিয়ালাইজেশন ব্যবহার করুন। আমি বুঝতে পারি যে এখানে সরলতার জন্য বাদ দেওয়া হয়েছিল (যদিও সরলতা লাভটি ন্যূনতম) তবে কাঠামোগত ডেটা স্ট্রিং (জেএসএন, এক্সএমএল, ...) ফর্ম্যাট করা তুচ্ছ পরিস্থিতিগুলিতেও এটি করা বিপজ্জনক নয় এবং লোকেরা এই জাতীয় কোড অনুলিপি করতে উত্সাহিত করতে পারে ।
ফ্লোরিয়ান শীতকাল

149

Ademar এর সমাধান উপজীব্য করে উন্নত করা যায় JavaScriptSerializerএরSerialize পদ্ধতি তাদেরকে JSON করার বস্তুর অন্তর্নিহিত রূপান্তর প্রদান।

অতিরিক্তভাবে, usingস্পষ্টভাবে কলিং Flushএবং এড়িয়ে যাওয়ার জন্য বিবৃতিটির ডিফল্ট কার্যকারিতাটি উত্তোলন করা সম্ভব Close

var httpWebRequest = (HttpWebRequest)WebRequest.Create("http://url");
httpWebRequest.ContentType = "application/json";
httpWebRequest.Method = "POST";

using (var streamWriter = new StreamWriter(httpWebRequest.GetRequestStream()))
{
    string json = new JavaScriptSerializer().Serialize(new
                {
                    user = "Foo",
                    password = "Baz"
                });

    streamWriter.Write(json);
}

var httpResponse = (HttpWebResponse)httpWebRequest.GetResponse();
using (var streamReader = new StreamReader(httpResponse.GetResponseStream()))
{
    var result = streamReader.ReadToEnd();
}

1
এই এবং উপরের কোডের মধ্যে পার্থক্য কী, আমি কিছু মিস করছি?
জেএমকে

16
এটি জাভাস্ক্রিপ্টসরিয়ালাইজারের সিরিয়ালাইজ পদ্ধতিটি হস্তশিল্পের পরিবর্তে বৈধ জেএসএন তৈরি করতে ব্যবহার করে।
সান অ্যান্ডারসন

নীচে জিন এফ এর উত্তর দেখুন - একটি মন্তব্য হওয়া উচিত। বিষয়বস্তু টাইপ সঙ্গে যত্ন নিন application/jsonসঠিক।
লুকাস

@ সানঅ্যান্ডারসন আমি "রিমোট সার্ভারের সাথে সংযোগ করতে অক্ষম" থাকি।
ralphgabb

3
@ লুজানবারাল আপনার কেবল একটি সমাবেশ দরকার: সিস্টেম. ওয়েবে.এক্সটেনশানস
নরব্রেচট

60

HttpClientটাইপ চেয়ে একটি নতুন বাস্তবায়ন WebClientএবং HttpWebRequest

আপনি কেবল নিম্নলিখিত লাইনগুলি ব্যবহার করতে পারেন।

string myJson = "{'Username': 'myusername','Password':'pass'}";
using (var client = new HttpClient())
{
    var response = await client.PostAsync(
        "http://yourUrl", 
         new StringContent(myJson, Encoding.UTF8, "application/json"));
}

এখানে চিত্র বর্ণনা লিখুন

যখন আপনার HttpClientএকবারের বেশি প্রয়োজন হয় কেবলমাত্র একটি উদাহরণ তৈরি করতে এবং এটি পুনরায় ব্যবহার বা নতুন ব্যবহার করার পরামর্শ দেওয়া হয় HttpClientFactory


5
এইচটিপিপ্লিয়েন্টের একটি সামান্য নোট, সাধারণ isক্যমত্য হ'ল আপনার এটি নিষ্পত্তি করা উচিত নয়। এমনকি এটি আইডিস্পোজেবল কার্যকর করে বস্তুটি থ্রেড-সেফ এবং পুনরায় ব্যবহারের উদ্দেশ্যে বোঝানো হয়। stackoverflow.com/questions/15705092/…
জিন এফ

1
@JeanF। আরে ইনপুট জন্য ধন্যবাদ। যেমন আমি অলরেডি উল্লেখ করেছি আপনার কেবল একটি উদাহরণ তৈরি করা উচিত বা এটি ব্যবহার করা উচিত HttpClientFactory। আমি লিঙ্কযুক্ত ইস্যুতে সমস্ত উত্তর পড়িনি তবে আমি মনে করি এটি আপডেট করার প্রয়োজন কারণ এটি কারখানার উল্লেখ করে না।
NtFreX

33

শানের পোস্টের পরেও, বিবৃতিগুলি ব্যবহার করে বাসা বাঁধতে হবে না। দ্বারা usingStreamWriter এটা ফ্ল্যাশ করা হবে এবং ব্লক শেষে বন্ধ তাই স্পষ্টভাবে করার কোন প্রয়োজন কল Flush()এবং Close()পদ্ধতি:

var request = (HttpWebRequest)WebRequest.Create("http://url");
request.ContentType = "application/json";
request.Method = "POST";

using (var streamWriter = new StreamWriter(request.GetRequestStream()))
{
    string json = new JavaScriptSerializer().Serialize(new
                {
                    user = "Foo",
                    password = "Baz"
                });

    streamWriter.Write(json);
}

var response = (HttpWebResponse)request.GetResponse();
using (var streamReader = new StreamReader(response.GetResponseStream()))
{
        var result = streamReader.ReadToEnd();
}

1
শন তাঁর পোস্ট সম্পাদনা করার সাথে সাথে এখন এই উত্তর এবং শান অ্যান্ডারসনের উত্তর হুবহু একই।
ফাজা

আরে এটি এত দুর্দান্ত han ধন্যবাদ B তবে আমাদের জসনে যদি শিশু নোড থাকে তবে আমরা কীভাবে ডেটা পাস করব?
ব্যবহারকারী 2728409

1
সিরিয়ালাইজার জসসনে শিশু নোডগুলি পরিচালনা করতে পারে - আপনাকে কেবল এটির জন্য একটি বৈধ জেসন অবজেক্ট সরবরাহ করতে হবে।
ডেভিড ক্লার্ক

14

আপনার যদি কল করার দরকার হয় তাত্পর্যপূর্ণ হয় তবে ব্যবহার করুন

var request = HttpWebRequest.Create("http://www.maplegraphservices.com/tokkri/webservices/updateProfile.php?oldEmailID=" + App.currentUser.email) as HttpWebRequest;
            request.Method = "POST";
            request.ContentType = "text/json";
            request.BeginGetRequestStream(new AsyncCallback(GetRequestStreamCallback), request);

private void GetRequestStreamCallback(IAsyncResult asynchronousResult)
    {
        HttpWebRequest request = (HttpWebRequest)asynchronousResult.AsyncState;
        // End the stream request operation

        Stream postStream = request.EndGetRequestStream(asynchronousResult);


        // Create the post data
        string postData = JsonConvert.SerializeObject(edit).ToString();

        byte[] byteArray = Encoding.UTF8.GetBytes(postData);


        postStream.Write(byteArray, 0, byteArray.Length);
        postStream.Close();

        //Start the web request
        request.BeginGetResponse(new AsyncCallback(GetResponceStreamCallback), request);
    }

    void GetResponceStreamCallback(IAsyncResult callbackResult)
    {
        HttpWebRequest request = (HttpWebRequest)callbackResult.AsyncState;
        HttpWebResponse response = (HttpWebResponse)request.EndGetResponse(callbackResult);
        using (StreamReader httpWebStreamReader = new StreamReader(response.GetResponseStream()))
        {
            string result = httpWebStreamReader.ReadToEnd();
            stat.Text = result;
        }

    }

3
এই সমাধান পোস্ট করার জন্য ধন্যবাদ বিবেক। আমাদের দৃশ্যে আমরা এই পোস্টে আরও একটি সমাধান চেষ্টা করেছি, এবং সিস্টেমটি দেখে ক্ষতবিক্ষত করেছি ourআপনার অ্যাপ্লিকেশনটিতে ব্যতিক্রমগুলি ছড়িয়ে দেওয়া, আমি অনুমান করি যে সিঙ্ক্রোনাস পোস্ট থ্রেড ব্লক করে। আপনার কোডটি আমাদের সমস্যার সমাধান করেছে।
কেন পামার

মনে রাখবেন আপনার সম্ভবত বাইটে রূপান্তর করতে হবে না। আপনার করা উচিত postStream.Write(postData);- এবং API এর উপর নির্ভর করে এর request.ContentType = "application/json";পরিবর্তে একটি ব্যবহার করতে হতে পারে text/json
vapcguy


11

আমি সম্প্রতি আমার অ্যাপ্লিকেশনটির কোনও মডেল থেকে রূপান্তরিত করার অতিরিক্ত পদক্ষেপ নিয়ে জেএসএন পোস্ট করার খুব সহজ উপায় নিয়ে এসেছি। নোট করুন যে মানগুলি পেতে এবং রূপান্তরটি করতে আপনার নিয়ামকের জন্য আপনাকে [জসনঅবজেক্ট] মডেল তৈরি করতে হবে।

অনুরোধ:

 var model = new MyModel(); 

 using (var client = new HttpClient())
 {
     var uri = new Uri("XXXXXXXXX"); 
     var json = new JavaScriptSerializer().Serialize(model);
     var stringContent = new StringContent(json, Encoding.UTF8, "application/json");
     var response = await Client.PutAsync(uri,stringContent).Result;
     ...
     ...
  }

মডেল:

[JsonObject]
[Serializable]
public class MyModel
{
    public Decimal Value { get; set; }
    public string Project { get; set; }
    public string FilePath { get; set; }
    public string FileName { get; set; }
}

সার্ভারের দিক:

[HttpPut]     
public async Task<HttpResponseMessage> PutApi([FromBody]MyModel model)
{
    ...
    ... 
}

6

এই বিকল্পটি উল্লেখ করা হয়নি:

using (var client = new HttpClient())
{
    client.BaseAddress = new Uri("http://localhost:9000/");
    client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

    var foo = new User
    {
        user = "Foo",
        password = "Baz"
    }

    await client.PostAsJsonAsync("users/add", foo);
}

2
এই বিকল্পটি আর পাওয়া যায় না 4.5.৪.২ নেট। এখানে stackoverflow.com/a/40525794/2161568
ডাউনহিলস্কি

উপরের মন্তব্য অনুসারে ডাউনভোট - যেহেতু এটি উপলভ্য নয়, সম্ভবত উত্তরটি সরিয়ে নেওয়া উচিত।
নোভাডেভ

1
সবাই এই জবাবটি হ্রাস করার পক্ষে উপযুক্ত কারণ নয় যেহেতু সবাই। নেট এর সর্বশেষতম সংস্করণ ব্যবহার করে না এবং তাই এটি একটি বৈধ উত্তর।
এলিসান

4

এটি অর্জনের কিছু পৃথক ও পরিষ্কার উপায় হ'ল এইচটিটিপি ক্লায়েন্ট ব্যবহার করে:

public async Task<HttpResponseMessage> PostResult(string url, ResultObject resultObject)
{
    using (var client = new HttpClient())
    {
        HttpResponseMessage response = new HttpResponseMessage();
        try
        {
            response = await client.PostAsJsonAsync(url, resultObject);
        }
        catch (Exception ex)
        {
            throw ex
        }
        return response;
     }
}

4
সহায়ক, তবে PostAsJsonAsync.NET 4.5.2 থেকে আর উপলব্ধ নেই। PostAsyncপরিবর্তে ব্যবহার করুন। আরও এখানে
জাচরি কেনার

এইচটিটিপিপ্লিনেন্ট সাধারণত usingএই জাতীয় বিবৃতিতে ব্যবহার করা উচিত নয়
p3tch

আমি মনে করি এটি IDisposableকোনও কারণে ইন্টারফেস প্রয়োগ করে
ডিমা দারন

4

সতর্কবার্তা! এই বিষয়ে আমার খুব দৃ view় দৃষ্টিভঙ্গি রয়েছে।

.NET এর বিদ্যমান ওয়েব ক্লায়েন্টগুলি বিকাশকারী বন্ধুত্বপূর্ণ নয়! "কীভাবে কোনও বিকাশকারীকে হতাশ করা যায়" এর ওয়েব উদাহরণ ওয়েবক্যুয়েস্ট এবং ওয়েবক্লিয়েন্ট । এগুলি ভার্জোজ এবং এর সাথে কাজ করা জটিল; আপনি যখন যা করতে চান তা হ'ল সি # তে একটি সাধারণ পোস্ট অনুরোধ। এইচটিপিএলক্লিয়েন্ট এই সমস্যাগুলি মোকাবেলায় কিছুটা এগিয়ে যায় তবে এটি এখনও কম। এর উপরে মাইক্রোসফ্টের ডকুমেন্টেশনগুলি খারাপ ... সত্যই খারাপ; আপনি প্রযুক্তিগত ব্লব্বের পৃষ্ঠা এবং পৃষ্ঠাগুলি সন্ধান করতে না চাইলে unless

মুক্তির উত্স। বিকল্প হিসাবে তিনটি দুর্দান্ত ওপেন সোর্স, ফ্রি নুগেট লাইব্রেরি রয়েছে। শুকরিয়া ধন্যবাদ! এগুলি সমস্ত ভাল সমর্থিত, নথিভুক্ত এবং হ্যাঁ, সহজ - সংশোধন… সুপার ইজি - সাথে কাজ করা।

তাদের মধ্যে খুব বেশি কিছু নেই তবে আমি সার্ভিসস্ট্যাকটি দেব।

  • গিথুব তারকারা মোটামুটি একই রকম।
  • সমস্যাগুলি খুলুন এবং গুরুত্বপূর্ণভাবে কতগুলি সমস্যা দ্রুত বন্ধ হয়ে যায়? সার্ভিস স্ট্যাকটি দ্রুততম ইস্যু সমাধানের জন্য এবং কোনও খোলার সমস্যা নেই বলে পুরষ্কারটি এখানে নেয়।
  • নথিপত্র? সবার দুর্দান্ত দস্তাবেজ রয়েছে; তবে, সার্ভিস স্ট্যাক এটিকে পরবর্তী স্তরে নিয়ে যায় এবং ডকুমেন্টেশনের জন্য এটি 'গোল্ডেন স্ট্যান্ডার্ড' হিসাবে পরিচিত।

ঠিক আছে - তাহলে JSON এ কোনও পোস্ট অনুরোধ সার্ভিসস্ট্যাকের মধ্যে দেখতে কেমন? টেক্সট?

var response = "http://example.org/login"
    .PostJsonToUrl(new Login { Username="admin", Password="mypassword" });

এটি কোডের একটি লাইন। সংক্ষিপ্ত এবং সহজ! উপরের তুলনা করুন। নেট এর এইচটিপি লাইব্রেরি।


3

অবশেষে। ফলাফলটি অন্তর্ভুক্ত করে সিঙ্ক মোডে আমন্ত্রণ জানিয়েছিলাম

HttpResponseMessage response = null;
try
{
    using (var client = new HttpClient())
    {
       response = client.PostAsync(
        "http://localhost:8000/....",
         new StringContent(myJson,Encoding.UTF8,"application/json")).Result;
    if (response.IsSuccessStatusCode)
        {
            MessageBox.Show("OK");              
        }
        else
        {
            MessageBox.Show("NOK");
        }
    }
}
catch (Exception ex)
{
    MessageBox.Show("ERROR");
}

1

var data = Encoding.ASCII.GetBytes(json);

byte[] postBytes = Encoding.UTF8.GetBytes(json);

ইউএফটি 8 এর পরিবর্তে এএসসিআইআই ব্যবহার করুন


2
বেশ খারাপ ধারণা বলে মনে হচ্ছে, আমি কি কিছু মিস করছি?
সাইবারফক্স

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