ওয়েব এপিআই থেকে HTTPClient সহ জসনঅবজেক্ট পোস্ট করা


289

আমি পোস্ট করার চেষ্টা করছি একটি JsonObjectব্যবহার HttpClientওয়েব এপিআই থেকে। আমি কীভাবে এটি করব তা সম্পর্কে নিশ্চিত নই এবং নমুনা কোডের পথে খুব বেশি কিছু খুঁজে পাচ্ছি না।

আমার এখন পর্যন্ত যা আছে তা এখানে:

var myObject = (dynamic)new JsonObject();
myObject.Data = "some data";
myObject.Data2 = "some more data";

HttpClient httpClient = new HttpClient("myurl");
httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

HttpResponseMessage response = httpClient.Post("", ???);

আমি মনে করি আমাকে JsonObjectএকটি হিসাবে StreamContentঅভিনন্দন করা দরকার তবে আমি সেই পদক্ষেপে ঝুলছি।

উত্তর:


441

প্যাকেজটির নতুন সংস্করণ HttpClientএবং ছাড়াই এটি WebApiহ'ল:

var content = new StringContent(jsonObject.ToString(), Encoding.UTF8, "application/json");
var result = client.PostAsync(url, content).Result;

অথবা আপনি যদি এটি চান async:

var result = await client.PostAsync(url, content);

3
ওভারলোড হওয়া স্ট্রিংকন্টেন্ট কনস্ট্রাক্টর আমার জন্য কৌশলটি করেছে।
ক্যাপ্টেন কেনপাচি


2
যার মতো এটি এটিকে নিক্ষেপ করার জন্য প্রলোভিত usingহয়েছিল তার জন্য: aspnetmonsters.com/2016/08/2016-08-27-httpclientwrong
maxshuty

আমি যদিও নির্মাণের usingচারপাশে রাখি StringContent
বিসিআর

এই উত্তরটি ব্যবহার করে আমি একটি এপিআই থেকে একটি "400 বাজে অনুরোধ" প্রতিক্রিয়া পেয়েছি যা আমি আমার জেএসওন অনুরোধ পোস্ট করছিলাম (ভিজ্যুয়াল স্টুডিও 2017, নেট 4.6.2)। var content = new StringContent(jsonObject.ToString(), Encoding.UTF8, "application/json")আমার পাশাপাশি সেটও করতে হয়েছিল content.Headers.ContentType = new MediaTypeHeaderValue("application/json");। আরও তথ্যের জন্য নীচের উত্তর দেখুন।
anthls

161

StringContentআপনার JSON অবজেক্টের JSON উপস্থাপনা সহ, সবচেয়ে সহজ উপায় use

httpClient.Post(
    "",
    new StringContent(
        myObject.ToString(),
        Encoding.UTF8,
        "application/json"));

14
বিষয়বস্তুর ধরণটি নোট করুন। আমি এটি ছেড়ে দিয়েছি এবং আমার পছন্দসই সময়ের চেয়ে বেশি সময় ধরে আমার ডিবাগিং করেছি।
Zapnologica

আপনার স্ট্রিংকন্টেন্ট উদাহরণটি নিষ্পত্তি করা উচিত নয়?
ফিল হাসেলডেন

63

আপনার .NET সংস্করণ অনুসারে আপনি HttpClientExtensions.PostAsJsonAsyncপদ্ধতিটিও ব্যবহার করতে পারেন ।

https://msdn.microsoft.com/en-us/library/system.net.http.httpclientextensions.postasjsonasync.aspx


4
এখন Microsoft.AspNet.Client.WebApi nuget পাওয়া
jle

2
আমি সবেমাত্র এটি মাইক্রোসফ্ট থেকে ইনস্টল করেছি
spএএসপনেট. ওয়েবেআপি.ক্লায়েন্ট

এটি আমার সমস্যার সমাধান করেছে। আমি সি (ক্লাস) পাস করার সময় একটি (দীর্ঘ) জন্য ঘোরাঘুরি করছিলাম এমন কয়েকটি বৈশিষ্ট্য যা ক্লায়েন্ট ব্যবহার করে তালিকাভুক্ত ছিল। অ্যারেটি যদি খালি থাকে তবে আমার এপিআই দ্রবণটি এটি বাছাই করবে, তবে অ্যারেতে কোনও আইটেম থাকলে নিয়ামক পদ্ধতিটি JSON কে আবদ্ধ করতে সক্ষম হয় না। এর জন্য ধন্যবাদ .. আমার কাছে মনে হচ্ছে যে PostAsJsonAsync আরও নির্ভরযোগ্যভাবে একটি জটিল সি # অবজেক্টটিকে JSON এ রূপান্তর করেছে।
ফ্রাঙ্কলিন টার্টার

এর জন্য কি কোনও নুগেট প্যাকেজ রয়েছে? আমি যখন প্রকল্পটি একটি নতুন মেশিনে স্থানান্তর করি তখন আমি এটিকে ঘৃণা করি এবং এই উল্লেখটি সর্বদা অনুপস্থিত।
Zapnologica

এই বা অন্য কিছু খুঁজছেন? nuget.org/packages/Mic Microsoft.AspNet.WebApi.Client
ব্যবহারকারী 3285954

51

নিউটনসফট.জসন ব্যবহার করা হলে:

using Newtonsoft.Json;
using System.Net.Http;
using System.Text;

public static class Extensions
{
    public static StringContent AsJson(this object o)
        => new StringContent(JsonConvert.SerializeObject(o), Encoding.UTF8, "application/json");
}

উদাহরণ:

var httpClient = new HttpClient();
var url = "https://www.duolingo.com/2016-04-13/login?fields=";
var data = new { identifier = "username", password = "password" };
var result = await httpClient.PostAsync(url, data.AsJson())

এটি এসপ নেট কোর সুনির্দিষ্ট নয়, এটি আসলে জেনেরিকটি নিচে 4.5..6. to এ নেমে গেছে
ডানটাকফো

JsonConvert.SerializeObjectডেটটাইমস আইএসও 8601 ধরণের ব্যবহার করে সমস্যাগুলি : স্থানীয় বা ইউটিসি ... হ্যাকারেড.কম.আর্টিকেলস_
কুইকিনেট

21

পাম্বার থেকে উত্তরটি সম্পর্কে মন্তব্য করার মতো যথেষ্ট খ্যাতি আমার নেই তাই আমি অন্য উত্তর পোস্ট করছি। পাম্বারের পদ্ধতির ব্যবহার করে আমি একটি এপিআই থেকে একটি "400 বাজে অনুরোধ" প্রতিক্রিয়া পেয়েছি আমি আমার জেএসএন অনুরোধটি পোস্ট করছিলাম (ভিজ্যুয়াল স্টুডিও 2017, নেট 4.6.2)। অবশেষে সমস্যাটি স্ট্রিংকন্টের (" https://github.com/dotnet/corefx/issues/7864 দেখুন) দ্বারা উত্পাদিত" সামগ্রী-ধরণের "শিরোনামে সনাক্ত করা হয়েছিল ।

TL; ড

অনুরোধের শিরোনামটি সঠিকভাবে সেট করতে অতিরিক্ত লাইন দিয়ে পাম্বারের উত্তরটি ব্যবহার করুন:

var content = new StringContent(jsonObject.ToString(), Encoding.UTF8, "application/json");
content.Headers.ContentType = new MediaTypeHeaderValue("application/json");
var result = client.PostAsync(url, content).Result;

ধন্যবাদ, অ্যান্থলস var কন্টেন্ট = নতুন স্ট্রিংকন্টেন্ট (jsonObject.ToString (), এনকোডিং.আউটএফ 8, "অ্যাপ্লিকেশন / জসন") যথেষ্ট ছিল না। এটির সামগ্রী প্রয়োজন। আমার বিচক্ষণতা বাঁচানোর জন্য আপনাকে ধন্যবাদ।
গেইল ফোড

1
এটি দুর্দান্ত কাজ করেছে। কোনও কারণেই কেন "অ্যাপ্লিকেশন / জসন" দু'বার সেট করা দরকার, একজন কনস্ট্রাক্টরে এবং একবার সম্পত্তি মাধ্যমে? এটা কি বাগ?
ফেস্টাস মার্টিংগেল

@ ফেস্টাসমার্টিংলে: ভাল প্রশ্ন! GitHub সমস্যা (উত্তর লিঙ্ক) পাশ আমার পড়া থেকে "application/json"StringContentকন্সট্রাকটর সম্ভবত যেমন স্পষ্টভাবে ফলে উপর সেট করা হচ্ছে প্রয়োজন হয় না content.Headers.ContentTypeসম্পত্তি। তবে আমি কোডে এটি পরীক্ষা করিনি n't
anthls

দেখে মনে হচ্ছে সার্ভার সম্পূর্ণ সামগ্রীর ধরণের স্ট্রিং সমর্থন করে না। আপনি যখন কনট্রাক্টরটি কনটেন্ট টাইপকে ওভাররাইড না করে ব্যবহার করেন তখন এটি মান হিসাবে সেট করে application/json; charset=utf-8
বার্টএম 13

2

ভিবিনেটে এটির উপরে কোড:

dim FeToSend as new (object--> define class)

Dim client As New HttpClient
Dim content = New StringContent(FeToSend.ToString(), Encoding.UTF8,"application/json")
content.Headers.ContentType = New MediaTypeHeaderValue( "application/json" )
Dim risp = client.PostAsync(Chiamata, content).Result

msgbox(risp.tostring)

এই সাহায্য আশা করি

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