আমি কীভাবে কোনও এইচটিপসিপ্লিয়েন্ট.পোস্টএন্সিঙ্কে কোনও বস্তুটি পাস করব এবং জেএসএন বডি হিসাবে সিরিয়ালাইজ করব?


95

আমি ব্যবহার করছি System.Net.Http, ওয়েবে আমি বেশ কয়েকটি উদাহরণ পেয়েছি। আমি একটি POSTঅনুরোধ করার জন্য এই কোডটি তৈরি করতে পরিচালিত :

public static string POST(string resource, string token)
{
    using (var client = new HttpClient())
    {
        client.BaseAddress = new Uri(baseUri);
        client.DefaultRequestHeaders.Add("token", token);

        var content = new FormUrlEncodedContent(new[]
        {
             new KeyValuePair<string, string>("", "")
        });

        var result = client.PostAsync("", content).Result;
        string resultContent = result.Content.ReadAsStringAsync().Result;
        return resultContent;
    }
 }

সব ঠিকঠাক। তবে ধরুন যে আমি POSTপদ্ধতিটিতে একটি তৃতীয় পরম পাস করতে চাই , একটি পরম বলে data। ডেটা প্যারাম এই জাতীয় একটি বিষয়:

object data = new
{
    name = "Foo",
    category = "article"
};

আমি কীভাবে এটি তৈরি না করে করতে পারি KeyValuePair? আমার পিএইচপি RestAPIএকটি জসন ইনপুট অপেক্ষা করে, তাই জাসনটি সঠিকভাবে FormUrlEncodedContentপ্রেরণ করা উচিত raw। তবে আমি এটি দিয়ে কীভাবে পারি Microsoft.Net.Http? ধন্যবাদ


যদি আমি আপনার প্রশ্নটি বুঝতে পারি তবে আপনি সঠিকভাবে এনকোডযুক্ত সামগ্রী ফর্মের পরিবর্তে JSON সামগ্রীটি প্রেরণ করতে চান (এবং এক্সটেনশনের মাধ্যমে আপনি চান যে আপনার বেনামে ধরণেরটি সেই সামগ্রীটিতে JSON হিসাবে সিরিয়ালযুক্ত করা যেতে পারে)?
কোডিংগরিলা

@ কোডিংগরিলা হ্যাঁ একটি বেনামি ধরণ।
ইলগ্রুগো

4
ভবিষ্যতের পাঠকদের জন্য পার্শ্ব নোট হিসাবে, এর usingজন্য কোনও ব্যবহার করবেন না HttpClientaspnetmonsters.com/2016/08/2016-08-27-httpclientwrong
ম্যাক্সশিউটি

4
মাইক্রোসফ্ট থেকে নোট কেন usingব্যবহার করা উচিত নয়: HttpClient is intended to be instantiated once and reused throughout the life of an application. The following conditions can result in SocketException errors: Creating a new HttpClient instance per request. Server under heavy load. Creating a new HttpClient instance per request can exhaust the available sockets. ডকস.মাইক্রোসফটকম
en-

উত্তর:


160

আপনার প্রশ্নের সোজা আপ উত্তর: না। PostAsyncপদ্ধতির স্বাক্ষরটি নিম্নরূপ:

সর্বজনীন টাস্ক পোস্টএন্সেঙ্ক (উরি অনুরোধ ইউরি, এইচটিপিপি কনটেন্ট সামগ্রী)

সুতরাং, আপনি পাস করতে পারেন সময় একটি objectথেকে PostAsyncএটা ধরনের হতে হবে HttpContentএবং আপনার বেনামী যে ধরনের মানদণ্ড পূরণ করে না।

তবে আপনি যা অর্জন করতে চান তা অর্জন করার উপায় রয়েছে। প্রথমত, আপনাকে আপনার বেনামে প্রকারটি জেএসএনে সিরিয়ালিয়াল করতে হবে, এটির জন্য সর্বাধিক সাধারণ সরঞ্জাম হল জসন.এনইটি । এবং এর জন্য কোডটি বেশ তুচ্ছ:

var myContent = JsonConvert.SerializeObject(data);

এরপরে, আপনাকে এই ডেটা প্রেরণের জন্য একটি সামগ্রী সামগ্রী তৈরি করতে হবে, আমি একটি ByteArrayContentবস্তু ব্যবহার করব , তবে আপনি চাইলে আপনি কোনও ভিন্ন ধরণের ব্যবহার করতে বা তৈরি করতে পারেন।

var buffer = System.Text.Encoding.UTF8.GetBytes(myContent);
var byteContent = new ByteArrayContent(buffer);

এরপরে, আপনি এপিএসকে জেএসএন জানাতে সামগ্রীর প্রকার সেট করতে চান।

byteContent.Headers.ContentType = new MediaTypeHeaderValue("application/json");

তারপরে আপনি ফর্ম সামগ্রীর সাথে আপনার অনুরোধটি আপনার আগের উদাহরণের সাথে অনুরূপ প্রেরণ করতে পারেন:

var result = client.PostAsync("", byteContent).Result

পার্শ্ব নোটে, এখানে .Resultসম্পত্তি হিসাবে কল করার মতো কিছু কল্পনা করার ফলে মৃত লকিংয়ের মতো কিছু খারাপ পার্শ্ব প্রতিক্রিয়া হতে পারে, তাই আপনি এই বিষয়ে সতর্ক থাকতে চান।


ঠিক আছে এটা খুব পরিষ্কার। এই উত্তরের জন্য ধন্যবাদ। কেবলমাত্র একটি প্রশ্ন: যখন একটি সম্পাদনা POST, PUT, DELETEকরা হয়, সাধারণত এপিআই ফিরে আসে TRUE, stringতখন আমি পদ্ধতিটি হিসাবে ঘোষণা করি , তবে যখন আমি করি: return result;আমি Can't Convert HttpResponseMessage in stringপেয়েছি:, আমাকে কী পদ্ধতি ঘোষণার পরিবর্তন করা উচিত? আমার স্ট্রিং প্রতিক্রিয়া প্রয়োজন কারণ অন্য শ্রেণি পদ্ধতিতে এর পরে আমাকে এটিকে deserialize করতে হবে।
ইলগ্রুগো

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

জিজ্ঞাসা করার জন্য দুঃখিত, কিন্তু যদি ডেটা টাইপ করে থাকে তবে আপনার কি এটি করা দরকার StringContent?
MyDaftQuestions

4
@ MyDaftQuestions আপনি যা জিজ্ঞাসা করছেন তা আমি ঠিক নিশ্চিত নই, তবে এটি থেকে যেহেতু StringContentআপনি সরাসরি পাস করতে পারবেন । PostAsyncHttpContent
কোডিংগরিলা

@CodingGorilla, যে ছিল আমি আর্জি দিয়েছি কি। আপনাকে ধন্যবাদ :)
MyDaftQuestions

69

অনুরোধের বডিটিতে আপনার ডেটা কাঁচা স্ট্রিং হিসাবে পাস করার প্রয়োজন FormUrlEncodedContent। এটি করার একটি উপায় হ'ল এটিকে জেএসএন স্ট্রিংয়ে সিরিয়ালীকৃত করা:

var json = JsonConvert.SerializeObject(data); // or JsonSerializer.Serialize if using System.Text.Json

এখন আপনাকে যা করতে হবে তা হ'ল পোস্ট পদ্ধতিতে স্ট্রিংটি পাস করা।

var stringContent = new StringContent(json, UnicodeEncoding.UTF8, "application/json"); // use MediaTypeNames.Application.Json in Core 3.0+ and Standard 2.1+

var client = new HttpClient();
var response = await client.PostAsync(uri, stringContent);

কী stringContent? আমার ক্ষেত্রে stringContentমান হয় "\"\""। এই সঠিক মান?
আর 15

আপনার সি # কোড থেকে ভিবিতে স্ট্রিং ফলাফল পাওয়া সম্ভব? আমি এটি বেশ অনুরূপ খুঁজে পেয়েছি ....
gumuruh

45

একটি সহজ সমাধান হ'ল নুগেটMicrosoft ASP.NET Web API 2.2 Client থেকে ব্যবহার করা ।

তারপর আপনি কেবল এটা করতে পারেন এবং এটি JSON বস্তুর ধারাবাহিকভাবে এবং সেট করব Content-Typeকরার হেডার application/json; charset=utf-8:

var data = new
{
    name = "Foo",
    category = "article"
};

var client = new HttpClient();
client.BaseAddress = new Uri(baseUri);
client.DefaultRequestHeaders.Add("token", token);
var response = await client.PostAsJsonAsync("", data);

4
অবশ্যই পোস্টএএসজসনসাইক ব্যবহার করার জন্য রয়েছে
ক্যাট লিম রুইজ

27

এখন সঙ্গে একটি সহজ উপায় .NET Standardবা .NET Core:

var client = new HttpClient();
var response = await client.PostAsync(uri, myRequestObject, new JsonMediaTypeFormatter());

দ্রষ্টব্য:JsonMediaTypeFormatter ক্লাসটি ব্যবহার করার জন্য আপনাকে Microsoft.AspNet.WebApi.Clientনুগেট প্যাকেজটি ইনস্টল করতে হবে যা সরাসরি ইনস্টল করা যেতে পারে বা অন্য কোনও মাধ্যমে Microsoft.AspNetCore.App

এই স্বাক্ষর ব্যবহার করে HttpClient.PostAsync, আপনি যে কোনও বস্তুতে পাস করতে পারেন এবং JsonMediaTypeFormatterস্বয়ংক্রিয়ভাবে সিরিয়ালাইজেশন ইত্যাদির যত্ন নেবে etc.

প্রতিক্রিয়াটির সাথে, আপনি HttpContent.ReadAsAsync<T>যে ধরণের প্রত্যাশা করছেন সেটির প্রতিক্রিয়া সামগ্রীটি deserialize করতে ব্যবহার করতে পারেন :

var responseObject = await response.Content.ReadAsAsync<MyResponseType>();

4
এটি নেট এর কোন সংস্করণ ব্যবহার করছে? আমার সংস্করণটি সিস্টেমে "ফর্ম্যাটিং" খুঁজে পাচ্ছে না et নেট.এইচটিটিপি নেমস্পেস
অস্থায়ী

4
@ প্রোগ্রামাম্যাটিক আপনার ব্যবহার করা উচিত .NET Standardবা .NET Core, যেমন আমি উল্লেখ করেছি। আপনি ব্যবহার করছেন .NET Framework? আমার প্রকল্পে, জাসনমিডিয়া টাইপফর্ম্যাটরটি এখান থেকে লোড করা হচ্ছে: সি: \ প্রোগ্রাম ফাইলস \ ডটনেট d এসডিকে \ নুগেটফ্যালব্যাকফোল্ডার \ মাইক্রোসফট.অ্যাস্পনেট.উইবাপি.ক্লিয়েন্ট \ 5.2.6 \ লাইব \ নেটস্প্যান্ডার্ড 2.0 \ সিস্টেম.নেট.এইচটিপি.ফর্ম্যাটিং। dll
কেন লিয়ন

4
@ প্রোগ্রামাম্যাটিক যদি আপনি ইতিমধ্যে project প্রকল্পের ধরণের একটি ব্যবহার করছেন তবে এটি হতে পারে আপনাকে অতিরিক্ত নুগেট প্যাকেজ যুক্ত করতে হবে। আমি ভুলে গিয়েছিলাম যা আমার জন্য স্বয়ংক্রিয়ভাবে অন্তর্ভুক্ত ছিল। আমার ক্ষেত্রে এটি মাইক্রোসফ্টের অংশ হিসাবে অন্তর্ভুক্ত ছিল।
কেন লিয়ন

4
আমি .NET কোর ব্যবহার করছিলাম, তবে আমি মনে করি না যে আমার সমাধানটি সি # ভাষার সর্বশেষতম সংস্করণটি ব্যবহার করার জন্য সেট করা হয়েছিল। আমি আপডেট করেছি এবং এটি কাজ করেছে। ধন্যবাদ
অস্থায়ী

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