সি # তে পোষ্টের মাধ্যমে জেএসএন প্রেরণ করুন এবং জেএসএন ফিরে পেয়েছেন?


86

এটা আমার প্রথম সময় কখনও JSON ব্যবহার করে এবং সেইসাথে হয় System.Netএবং WebRequestআমার অ্যাপলিকেশনগুলির কোনো। আমার অ্যাপ্লিকেশনটি কোনও প্রমাণীকরণের সার্ভারে নীচের মতো একটি জেএসএন পে-লোড প্রেরণ করার কথা:

{
  "agent": {                             
    "name": "Agent Name",                
    "version": 1                                                          
  },
  "username": "Username",                                   
  "password": "User Password",
  "token": "xxxxxx"
}

এই পেডলোডটি তৈরি করতে, আমি JSON.NETলাইব্রেরিটি ব্যবহার করেছি । আমি কীভাবে এই তথ্যটিকে প্রমাণীকরণের সার্ভারে প্রেরণ করব এবং এর JSON প্রতিক্রিয়া ফিরে পাব? এখানে আমি কয়েকটি উদাহরণে যা দেখেছি তা কিন্তু জেএসওএন সামগ্রী নেই:

var http = (HttpWebRequest)WebRequest.Create(new Uri(baseUrl));
http.Accept = "application/json";
http.ContentType = "application/json";
http.Method = "POST";

string parsedContent = "Parsed JSON Content needs to go here";
ASCIIEncoding encoding = new ASCIIEncoding();
Byte[] bytes = encoding.GetBytes(parsedContent);

Stream newStream = http.GetRequestStream();
newStream.Write(bytes, 0, bytes.Length);
newStream.Close();

var response = http.GetResponse();

var stream = response.GetResponseStream();
var sr = new StreamReader(stream);
var content = sr.ReadToEnd();

তবে, আমি অতীতে অন্যান্য ভাষাগুলি ব্যবহার করার সাথে তুলনামূলকভাবে অনেক কোড বলে মনে করি। আমি কি এটি সঠিকভাবে করছি? এবং আমি কীভাবে JSON প্রতিক্রিয়া ফিরে পাব যাতে আমি এটি বিশ্লেষণ করতে পারি?

ধন্যবাদ, অভিজাত

আপডেট কোড

// Send the POST Request to the Authentication Server
// Error Here
string json = await Task.Run(() => JsonConvert.SerializeObject(createLoginPayload(usernameTextBox.Text, password)));
var httpContent = new StringContent(json, Encoding.UTF8, "application/json");
using (var httpClient = new HttpClient())
{
    // Error here
    var httpResponse = await httpClient.PostAsync("URL HERE", httpContent);
    if (httpResponse.Content != null)
    {
        // Error Here
        var responseContent = await httpResponse.Content.ReadAsStringAsync();
    }
}

4
আপনি চেষ্টা করতে পারেন WebClient.UploadString(JsonConvert.SerializeObjectobj(yourobj))বাHttpClient.PostAsJsonAsync
এলবি

উত্তর:


136

কোডটি খুব সোজা এবং সম্পূর্ণরূপে async'ed হওয়ায় আমি নিজেকে RESTful API গুলি জিজ্ঞাসা করার জন্য HttpClient লাইব্রেরিটি ব্যবহার করেছি using

(সম্পাদনা করুন: স্বচ্ছতার জন্য প্রশ্ন থেকে জেএসএন যোগ করা)

{
  "agent": {                             
    "name": "Agent Name",                
    "version": 1                                                          
  },
  "username": "Username",                                   
  "password": "User Password",
  "token": "xxxxxx"
}

আপনি পোস্ট করেছেন এমন JSON- কাঠামোর প্রতিনিধিত্বকারী দুটি শ্রেণীর সাথে এটি দেখতে দেখতে দেখতে এটি দেখতে পারে:

public class Credentials
{
    [JsonProperty("agent")]
    public Agent Agent { get; set; }

    [JsonProperty("username")]
    public string Username { get; set; }

    [JsonProperty("password")]
    public string Password { get; set; }

    [JsonProperty("token")]
    public string Token { get; set; }
}

public class Agent
{
    [JsonProperty("name")]
    public string Name { get; set; }

    [JsonProperty("version")]
    public int Version { get; set; }
}

আপনার মতো এই পদ্ধতি থাকতে পারে, যা আপনার পোষ্ট অনুরোধটি করে:

var payload = new Credentials { 
    Agent = new Agent { 
        Name = "Agent Name",
        Version = 1 
    },
    Username = "Username",
    Password = "User Password",
    Token = "xxxxx"
};

// Serialize our concrete class into a JSON String
var stringPayload = await Task.Run(() => JsonConvert.SerializeObject(payload));

// Wrap our JSON inside a StringContent which then can be used by the HttpClient class
var httpContent = new StringContent(stringPayload, Encoding.UTF8, "application/json");

using (var httpClient = new HttpClient()) {

    // Do the actual request and await the response
    var httpResponse = await httpClient.PostAsync("http://localhost/api/path", httpContent);

    // If the response contains content we want to read it!
    if (httpResponse.Content != null) {
        var responseContent = await httpResponse.Content.ReadAsStringAsync();

        // From here on you could deserialize the ResponseContent back again to a concrete C# type using Json.Net
    }
}

4
নিখুঁত, তবে কী অপেক্ষা করছে টাস্ক.আরুন (()?
হান্টার মিচেল

24
আপনি কোনও সিঙ্ক্রোনাস সিপিইউ বাউন্ড পদ্ধতিতে টাস্ক.রুন ব্যবহার করা উচিত নয় কারণ আপনি কোনও লাভের জন্য কেবল একটি নতুন থ্রেড বন্ধ করে দিচ্ছেন!
স্টিফেন ফস্টার 14

4
আপনাকে JsonPropertyপ্রতিটি সম্পত্তির জন্য টাইপ করতে হবে না । কেবলমাত্র জসন.নেটের তৈরি ক্যামেলকেসপ্রপার্টিনেমস কনট্র্যাক্ট রিসোলভার বা সিরিয়ালাইজেশন প্রক্রিয়াটি কাস্টমাইজ করার জন্য একটি কাস্টমNamingStrategy ব্যবহার করুন
সীফিশ

6
সাইড নোট: একটি ব্যবহার করবেন না usingসঙ্গে HttpClient। দেখুন: aspnetmonsters.com/2016/08/2016-08-27-httpclientwrong
maxshuty

4
সিস্টেম.নেট.এইচটিপি. ফর্ম্যাট করার সাথে আপনার এক্সটেনশন পদ্ধতিগুলি সংজ্ঞায়িত রয়েছে: "অপেক্ষা করুন httpClient.PostAsJsonAsync (" এপিআই / ভি 1 / ডোমেন ", সিএসওব্রজেস্ট)"
এইচবি 0

15

JSON.NET নিউগেট প্যাকেজ এবং বেনামে প্রকারের সাহায্যে অন্যান্য পোস্টাররা যা পরামর্শ দিচ্ছে তা আপনি সহজ করতে পারবেন:

// ...

string payload = JsonConvert.SerializeObject(new
{
    agent = new
    {
        name    = "Agent Name",
        version = 1,
    },

    username = "username",
    password = "password",
    token    = "xxxxx",
});

var client = new HttpClient();
var content = new StringContent(payload, Encoding.UTF8, "application/json");

HttpResponseMessage response = await client.PostAsync(uri, content);

// ...

6

আপনি এড়াতে HttpContentমিশ্রণটি ব্যবহার করে তৈরি করতে পারেন এবং তারপরে এটিকে কল করার সময় কল করুন :JObjectJPropertyToString()StringContent

        /*{
          "agent": {                             
            "name": "Agent Name",                
            "version": 1                                                          
          },
          "username": "Username",                                   
          "password": "User Password",
          "token": "xxxxxx"
        }*/

        JObject payLoad = new JObject(
            new JProperty("agent", 
                new JObject(
                    new JProperty("name", "Agent Name"),
                    new JProperty("version", 1)
                    ),
                new JProperty("username", "Username"),
                new JProperty("password", "User Password"),
                new JProperty("token", "xxxxxx")    
                )
            );

        using (HttpClient client = new HttpClient())
        {
            var httpContent = new StringContent(payLoad.ToString(), Encoding.UTF8, "application/json");

            using (HttpResponseMessage response = await client.PostAsync(requestUri, httpContent))
            {
                response.EnsureSuccessStatusCode();
                string responseBody = await response.Content.ReadAsStringAsync();
                return JObject.Parse(responseBody);
            }
        }

কীভাবে Exception while executing function. Newtonsoft.Json: Can not add Newtonsoft.Json.Linq.JProperty to Newtonsoft.Json.Linq.JArrayত্রুটি এড়ানো যায় ?
জারি তুর্কিয়া

4
এইচটিটিপিপ্লায়েন্টটি কনস্ট্রাক্ট ব্যবহার করে তৈরি করার কথা নয়। উদাহরণটি একবার তৈরি করা উচিত এবং অ্যাপ্লিকেশন জুড়ে ব্যবহার করা উচিত। এটি তার নিজস্ব সংযোগ পুল ব্যবহার করে কারণ। আপনার কোডটি বেশিরভাগ সকেটএক্সসেপশন নিক্ষেপ করে। ডকস.মাইক্রোসফট.এইন
হারুন দিলুকা হেশান

2

আপনি এইচটিটিপিপ্লায়েন্টে উপলভ্য পোস্টএএসজসনসাইক () পদ্ধতিটিও ব্যবহার করতে পারেন

   var requestObj= JsonConvert.SerializeObject(obj);
   HttpResponseMessage response = await    client.PostAsJsonAsync($"endpoint",requestObj).ConfigureAwait(false);


4
আপনার কোডটি কী করে এবং কীভাবে এটি সমস্যার সমাধান করে তা আপনি দয়া করে ব্যাখ্যা যুক্ত করতে পারেন?
নীলাম্বর শর্মা

আপনি সিরিয়ালাইজঅবজেক্ট () ব্যবহার করে যা অবজেক্ট পোস্ট করতে ও সিরিয়ালাইজ করতে চান তা নিতে পারেন; var obj= new Credentials { Agent = new Agent { Name = "Agent Name", Version = 1 }, Username = "Username", Password = "User Password", Token = "xxxxx" }; এবং তারপরে এটিকে HTTP কনটেস্টে রূপান্তর না করেই আপনি পোস্টঅ্যাসজেসনসাইক () এন্ডপয়েন্ট পয়েন্ট ইউআরএল এবং রূপান্তরিত জেএসএন বস্তুটি নিজেই পাস করে ব্যবহার করতে পারেন।
রোকসালা উইরাসিংহে
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.