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


1220

নতুন এএসপি.নেট ওয়েব এপিআই ব্যবহার করে , ক্রোমে আমি এক্সএমএল দেখছি - JSON এর অনুরোধ করার জন্য আমি কীভাবে এটি পরিবর্তন করতে পারি যাতে আমি এটি ব্রাউজারে দেখতে পারি? আমি বিশ্বাস করি এটি অনুরোধ শিরোনামগুলির একটি অংশ মাত্র, আমি কি এটিতে সঠিক?


উত্তর:


1736

আমি কেবল App_Start / WebApiConfig.csআমার এমভিসি ওয়েব এপিআই প্রকল্পে ক্লাসে নিম্নলিখিতগুলি যুক্ত করছি ।

config.Formatters.JsonFormatter.SupportedMediaTypes
    .Add(new MediaTypeHeaderValue("text/html") );

এটি নিশ্চিত করে যে আপনি বেশিরভাগ প্রশ্নের জেএসএন পেয়েছেন তবে XMLআপনি প্রেরণ করতে পারবেন text/xml

আপনি প্রতিক্রিয়া আছে করার প্রয়োজন হলে Content-Typeযেমন application/jsonদয়া করে চেক নিচে টড এর উত্তর

NameSpaceব্যবহার করছে System.Net.Http.Headers


115
এটি একটি আশ্চর্যজনকভাবে উপেক্ষা করা উত্তর, এবং যদিও মূল প্রশ্নটি সম্পূর্ণ পরিষ্কার ছিল না, এটি সরাসরি JSON কে একটি ওয়েব ব্রাউজারের জন্য ডিফল্ট প্রতিক্রিয়া করে তোলে (যা স্বীকার করে: পাঠ্য / এইচটিএমএল প্রেরণ করে)। ভাল করেছ.
গ্রেগম্যাক

16
+1 সবচেয়ে ভাল উত্তর Far আমি কল্পনা করেছি যে এখানে এক টন পিপিএল রয়েছে যারা ব্রাউজারে জেএসওএন না দেখে কেবল এক্সএমএলকে সম্পূর্ণরূপে অপসারণ করতে পছন্দ করে।
ডেরেক হুনজিকার

3
আমি যখন আবিষ্কার করেছি যে এটি এইচটিএমএল ব্রেক ট্যাগ সহ কোনও তৃতীয় পক্ষের সরবরাহিত ডেটা ক্যারেজের রিটার্নের সাথে শেষ হয়েছিল। JSON তখন অবৈধ। যদি এটি আপনাকে প্রভাবিত করে তবে গ্রহণযোগ্য উত্তরটি ব্যবহার করা আরও ভাল।
স্টোনটিপ

23
লক্ষ করুন যে প্রতিক্রিয়াটির Content-Typeশিরোনামটি এখনও থাকবে text/html
মিঃচিফ

78
এটা ভয়াবহ। প্রতিক্রিয়া কন্টেন্ট টাইপ শিরোনাম অ্যাপ্লিকেশন / json হওয়া উচিত। এই "সমাধান" এটি পাঠ্য / এইচটিএমএল করে তোলে।
প্রভাবিত করুন

501

আপনি যদি এটি করেন তবে WebApiConfigআপনি ডিফল্টভাবে জেএসএন পাবেন, তবে আপনি যদি text/xmlঅনুরোধ Acceptশিরোনাম হিসাবে পাস করেন তবে এটি আপনাকে এক্সএমএল ফেরত দেওয়ার অনুমতি দেবে

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );

        var appXmlType = config.Formatters.XmlFormatter.SupportedMediaTypes.FirstOrDefault(t => t.MediaType == "application/xml");
        config.Formatters.XmlFormatter.SupportedMediaTypes.Remove(appXmlType);
    }
}

আপনি যদি এমভিসি প্রকল্পের ধরণটি ব্যবহার না করে থাকেন এবং তাই এই ক্লাসটি শুরু করার জন্য নেই, কীভাবে এটি অন্তর্ভুক্ত করবেন সে সম্পর্কিত বিশদগুলির জন্য এই উত্তরটি দেখুন


51
শুধু লক্ষণীয়, আসল আচরণটি সঠিক। ক্রোম application/xml0.9 এর */*অগ্রাধিকার এবং 0.8 এর অগ্রাধিকার সহ অনুরোধ করে । মুছে ফেলার মাধ্যমে application/xmlআপনি যদি ক্লায়েন্টটি বিশেষভাবে এটির জন্য অনুরোধ করে তবে ওয়েব এপিআই XML ফিরিয়ে দেওয়ার ক্ষমতা সরিয়ে ফেলুন। যেমন আপনি যদি "স্বীকৃতি: অ্যাপ্লিকেশন / এক্সএমএল" প্রেরণ করেন তবে আপনি এখনও জেএসএন পাবেন।
21

11
এটা কি আমি, নাকি প্রথম বাক্যটি ভুল? কোডটি সম্পূর্ণরূপে এক্সএমএলকে সরিয়ে ফেলবে বলে মনে হয়, কেবলমাত্র ডিফল্টটি পরিবর্তন করে না।
নিকজি

6
@ নিকজি: একটি সমাধান যা এখানে উপেক্ষা করা হয় এবং আইএমএইচও একটি আরও ভাল বিকল্প (অ্যাপ্লিকেশন / এক্সএমএল রাখা) হ'ল এই পৃষ্ঠায় ফিলিপ লিউসিনের প্রস্তাবিত সমাধান। কনফিগারেশন.ফর্মেটর.এক্সএমএল ফর্ম্যাটটার.সমর্থিত মিডিয়া টাইপস.এড করুন (নতুন মিডিয়াটাইপহাইডারভ্যালিউ ("পাঠ্য / এইচটিএমএল")) যোগ করুন;
কোহেন

1
সুতরাং, আমরা কীভাবে এটি ওয়েব কনফিগারেশনের মাধ্যমে করব যাতে আমরা ডিফল্টরূপে জসন এবং অনুরোধ করা হলে এক্সএমএল পাই?
কাইল

4
নীচে ফিলিপস লিউসিনের উত্তর আসলে খাটো এবং আরও ভাল কাজ করে works
কেন স্মিথ

313

অনুরোধহিডারম্যাপিং ব্যবহার করা আরও ভাল কাজ করে, কারণ এটি Content-Type = application/jsonপ্রতিক্রিয়া শিরোনামেও সেট করে , যা ফায়ারফক্সকে (জেএসএনভিউ অ্যাড-অন সহ) প্রতিক্রিয়াটিকে JSON হিসাবে ফর্ম্যাট করতে দেয়।

GlobalConfiguration.Configuration.Formatters.JsonFormatter.MediaTypeMappings
.Add(new System.Net.Http.Formatting.RequestHeaderMapping("Accept", 
                              "text/html",
                              StringComparison.InvariantCultureIgnoreCase,
                              true, 
                              "application/json"));

6
এটি সর্বাধিক পাতলা এবং সহজ সমাধান এবং ফিডলার জসন হিসাবে ফিরিয়ে দেওয়া সামগ্রীর ধরণও সনাক্ত করে।
স্টিভ জনসন

4
নিস! আপনি কোডে এটি রাখার পরামর্শ দিবেন কোথায়?
টিম আবেল

9
এটি WebApiConfig.cs
অনিমেষ

9
আমার জন্য কাজ করেছেন। আমাকে সিস্টেম. নেট.এইচটিপি. ফর্ম্যাটিং ব্যবহার করে যুক্ত করা দরকার;
bbsimonbb

1
আমার নিজের সুবিধার জন্য সংযোগ স্থাপন: এই উত্তরটি আমি সাধারণত সঞ্চালিত আরেকটি সেটআপ ধাপের সাথে সুন্দরভাবে খেলি : stackoverflow.com/a/28337589/398630
BrainSlugs83

308

আমি ফিলিপ লিউসিনের পদ্ধতিকে সবচেয়ে বেশি পছন্দ করি - নিশ্চিত হয়ে নিন যে ব্রাউজারগুলি ক্লায়েন্টদের যেগুলি আসলে এক্সএমএল চায় তাদের কাছ থেকে বিষয়বস্তু সমঝোতা ছাড়াই জেএসএন পান। আমার একমাত্র অনুপস্থিত অংশটি ছিল যে প্রতিক্রিয়া শিরোনামগুলিতে এখনও সামগ্রী-প্রকার: পাঠ্য / এইচটিএমএল রয়েছে। কেন যে সমস্যা ছিল? কারণ আমি জেএসএন ফরম্যাট ক্রোম এক্সটেনশন ব্যবহার করি যা কন্টেন্ট-টাইপ পরীক্ষা করে এবং আমার ব্যবহার করা সুন্দর ফরম্যাটিংটি পাই না। আমি ঠিক করেছি যে একটি সাধারণ কাস্টম ফর্ম্যাটারের সাহায্যে পাঠ্য / এইচটিএমএল অনুরোধগুলি গ্রহণ করে এবং অ্যাপ্লিকেশন / জেসন প্রতিক্রিয়া রিটার্ন করে:

public class BrowserJsonFormatter : JsonMediaTypeFormatter
{
    public BrowserJsonFormatter() {
        this.SupportedMediaTypes.Add(new MediaTypeHeaderValue("text/html"));
        this.SerializerSettings.Formatting = Formatting.Indented;
    }

    public override void SetDefaultContentHeaders(Type type, HttpContentHeaders headers, MediaTypeHeaderValue mediaType) {
        base.SetDefaultContentHeaders(type, headers, mediaType);
        headers.ContentType = new MediaTypeHeaderValue("application/json");
    }
}

এর মতো নিবন্ধন করুন:

config.Formatters.Add(new BrowserJsonFormatter());

24
কনস্ট্রাক্টর অ্যাডে this.SerializerSettings.Formatting = Formatting.Indented;আপনি এটি ব্রাউজারের এক্সটেনশান ছাড়াই প্রিন্ট-মুদ্রিত চান।
অ্যালাস্টার মাউ

10
আপনি কেন এটি তারের উপর সুন্দর মুদ্রণ করতে চান?
meffect

8
@ Dmit77 এর উত্তরটি এর চেয়ে ভাল (আরও সংক্ষিপ্ত) নয়?
এইচ.ওয়াল্পার

8
@ এডিগ্রোভস আপনি তারের উপর প্রিন্ট-প্রিন্ট চান না। আপনি চান যে সার্ভারটি তারের উপরে ন্যূনতম পরিমাণ বিট প্রেরণ করবে (যেমন: কোনও স্পেস নেই)। তারপরে আপনি ব্রাউজারটি অ্যাডন এবং অন্যান্যগুলির সাথে এটি সুন্দরভাবে ফর্ম্যাট করতে চান। জাভাস্ক্রিপ্টকে সাধারণত
জেএসএনকে

13
যে গুগলর সন্ধান করছে তাদের জন্য: যুক্ত করতে ভুলবেন না using System.Net.Http.Formattingএবংusing Newtonsoft.Json
বেরিয়েল

186

এমভিসি 4 দ্রুত টিপ # 3 A এএসপি.নেট ওয়েব এপিআই থেকে এক্সএমএল ফর্ম্যাটর সরানো

ইন Global.asaxলাইন যোগ করুন:

GlobalConfiguration.Configuration.Formatters.XmlFormatter.SupportedMediaTypes.Clear();

তাই ভালো:

protected void Application_Start()
{
    AreaRegistration.RegisterAllAreas();

    RegisterGlobalFilters(GlobalFilters.Filters);
    RegisterRoutes(RouteTable.Routes);

    BundleTable.Bundles.RegisterTemplateBundles();
    GlobalConfiguration.Configuration.Formatters.XmlFormatter.SupportedMediaTypes.Clear();
}

9
কাজ করে - এক্সএমএলের পরিবর্তে জেএসওএন থাকা খুব ভাল।
হোয়াইটনিল্যান্ড

5
তবে আপনি কি তারপরও এক্সএমএল ফিরতে পারবেন?
টমাস স্টক

99
আমি এটি পরীক্ষা করেছি, এবং আপনি পারবেন না। সুতরাং এটি এক্সএমএল সমর্থন সরিয়ে দিচ্ছে .. প্রিয় গুগল লোকেরা আপনাকে সতর্ক করা হবে
টমাস স্টক

3
নীচে আমার উত্তরটি যদি আপনার দিকে লক্ষ্য করে থাকে তবে আপনি চাইলে এটি এক্সএমএলটি ফেরত আসতে দেবে তবে ব্রাউজারটিতে সাইটটিকে জেএসওএন দিয়ে প্রতিক্রিয়া করতে দেয়
গ্লেন স্লেভেন

3
@ গ্লেনস্প্লেন হ্যাঁ আপনার উত্তরটি সঠিক উত্তর হিসাবে চিহ্নিত হওয়া উচিত।
রডু ফ্লোরস্কু

114

ইন WebApiConfig.cs , শেষে যোগ নিবন্ধন ফাংশন:

// Remove the XML formatter
config.Formatters.Remove(config.Formatters.XmlFormatter);

উত্স


এমভিসি 4 এ কি এক্সএমএল ফর্ম্যাটরটি নতুন?
গ্লেন স্লেভেন

1
এমভিসি 5 এ, এটি গ্লোবাল কনফিগারেশনের সাথে কনফিগার প্রতিস্থাপনের মাধ্যমে করা যেতে পারে on কনফিগারেশন
স্টিভেন

4
এমন একটি প্রকল্পের জন্য যা অবশ্যই জেএসএনকে সমর্থন করবে এবং কোনও পরিস্থিতিতেই এক্সএমএল নির্গত করার অনুমতি দেওয়া যাবে না এটি এখন পর্যন্ত সেরা বিকল্প।
লুক সি

1
config.Formatters.Add (config.Formatters.JsonFormatter);
ক্যাস ব্লিম

3
এটা ভয়ানক। - ক্লায়েন্ট নির্দিষ্টভাবে কন্টেন্ট-টাইপ শিরোনামে এক্সএমএল চেয়েছে তা সত্ত্বেও এটি JSON কে সর্বদা ফিরিয়ে দেবে।
BrainSlugs83

94

ইন Global.asax আমি নিচের কোড ব্যবহার করছি। জেএসএন পাওয়ার জন্য আমার ইউআরআইhttp://www.digantakumar.com/api/values?json=true

protected void Application_Start()
{
    AreaRegistration.RegisterAllAreas();

    FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
    RouteConfig.RegisterRoutes(RouteTable.Routes);
    BundleConfig.RegisterBundles(BundleTable.Bundles);

    GlobalConfiguration.Configuration.Formatters.JsonFormatter.MediaTypeMappings.Add(new  QueryStringMapping("json", "true", "application/json"));
}

2
ভাল একটা. আপনার পদ্ধতিটি একটি পরামিতি আশা করে কী? লোকালহোস্টের
এলটি.নোলো

ডেটা ওয়েব এপিআই এর ফর্ম্যাট কি ধরনের ডিফল্ট। এটি জসন বা ওয়েবপিপি? ধন্যবাদ
টমাস

54

ওয়েবএপিআইতে বিষয়বস্তু আলোচনার বিষয়ে একবার দেখুন। এগুলি ( পার্ট 1 এবং পার্ট 2 ) আশ্চর্যজনকভাবে বিস্তারিত এবং পুঙ্খানুপুঙ্খ ব্লগ পোস্টগুলি কীভাবে এটি কাজ করে তা ব্যাখ্যা করে।

সংক্ষেপে, আপনি ঠিক বলেছেন, এবং কেবলমাত্র শিরোনামগুলির অনুরোধ Acceptবা Content-Typeঅনুরোধ করতে হবে। আপনার অ্যাকশনটি কোনও নির্দিষ্ট ফর্ম্যাটটি ফেরত দেওয়ার জন্য কোডড নয়, আপনি সেট করতে পারেন Accept: application/json


6
"যাতে আমি এটি ব্রাউজারে দেখতে পারি"
স্পঞ্জম্যান

1
@ স্পংম্যান, হ্যাঁ আপনি পারেন। তবে REST ক্লায়েন্টের মতো একটি এক্সটেনশন ব্যবহার করুন - বেশিরভাগ ব্রাউজারে এটির মতো পছন্দ থাকে। ব্রাউজারে সরাসরি ইউআরএল টাইপ করা হয় 1. খুব সীমাবদ্ধ (হেডারের উপর কোনও নিয়ন্ত্রণ নেই, ডেটা পোস্ট করতে পারে না ইত্যাদি); ২. ভুল - ব্রাউজারটি ওয়েব এপিআই গ্রাস করে না কারণ এটি গ্রাস করার উদ্দেশ্যে - আপনি এটির সঠিকভাবে পরীক্ষার উপর নির্ভর করতে পারবেন না। সুতরাং, আবারও, একটি ভাল আরএসইএস ক্লায়েন্ট অ্যাড-অন এটি ঠিক করে দেবে।
Ivaylo স্লাভভ

45

প্রশ্নটি ক্রোম-নির্দিষ্ট হওয়ায় আপনি পোস্টম্যান এক্সটেনশানটি পেতে পারেন যা আপনাকে অনুরোধ সামগ্রীর ধরণের সেট করতে দেয়।

পিয়ন


ফায়ারফক্সে সহজভাবে: কনফিগার করতে যান, গ্রহণের জন্য অনুসন্ধান করুন। ডিফল্ট এবং network.http.accept.defaultকনফিগারেশনের সামগ্রীটি এতে পরিবর্তন করুন text/html,application/xhtml+xml,application/json;q=0.9,application/xml;q=0.8,*/*;q=0.7
বজরতুর থরল্যাকিয়াস

বা আরও ভাল, কেবল text/html,application/xhtml+xml;q=1.0,*/*;q=0.7বিটবুকিটের মতো বগি হোস্টগুলি এইচটিএমএলটির পরিবর্তে আপনার ব্রাউজার জেএসএনকে দুর্ঘটনাক্রমে পরিবেশন করা থেকে বিরত রাখতে।
বজরতুর থরলেসিয়াস

ইউআরএল মারা গেছে। একটি নতুন হ'ল chrome.google.com/webstore/detail/postman/…
ফ্যালকন মোমোট

35

একটি দ্রুত বিকল্প হ'ল মিডিয়াটাইপম্যাপিং বিশেষজ্ঞকরণ। এখানে অ্যাপ্লিকেশন_স্টার্ট ইভেন্টে ক্যুরিস্ট্রিংম্যাপিং ব্যবহারের উদাহরণ রয়েছে:

GlobalConfiguration.Configuration.Formatters.JsonFormatter.MediaTypeMappings.Add(new QueryStringMapping("a", "b", "application/json"));

এখন যখনই ইউআরএলটিতে কোয়েরিস্ট্রিং? A = b রয়েছে, জাসন প্রতিক্রিয়াটি ব্রাউজারে দেখানো হবে।


2
এটি খুব দরকারী ছিল। আপনি path.to/item.json ব্যবহার করতে চাইলে আপনি কোয়েরিস্ট্রিংম্যাপিংয়ের পরিবর্তে ইউরিপ্যাথ এক্সটেনশনম্যাপিংও ব্যবহার করতে পারেন
nuzzolilo

32

এই কোডটি জসনকে আমার ডিফল্ট করে তোলে এবং আমাকে এক্সএমএল ফর্ম্যাটটিও ব্যবহার করতে দেয়। আমি শুধু সংযোজন করব xml=true

GlobalConfiguration.Configuration.Formatters.XmlFormatter.MediaTypeMappings.Add(new QueryStringMapping("xml", "true", "application/xml"));
GlobalConfiguration.Configuration.Formatters.JsonFormatter.SupportedMediaTypes.Add(new MediaTypeHeaderValue("text/html"));

ধন্যবাদ সবাইকে!


1
এটি সবচেয়ে নমনীয় উত্তর (এবং এই দিনগুলিতে সত্যই ডিফল্ট কনফিগারেশন হওয়া উচিত)। এই উত্তরে যুক্ত করতে, ব্রাউজার সহ জেএসএন হ'ল ডিফল্ট। এক্সএমএল দেখতে, ক্যোয়ারী স্ট্রিং যুক্ত করুন
:?

বেশ কয়েকটি কৌশল চেষ্টা করেছেন। এক্সএমএল এবং
জেএসএন

23

আপনার এপিআই পরীক্ষা করতে আপনার ব্রাউজারটি ব্যবহার করবেন না।

পরিবর্তে, এইচটিটিপি ক্লায়েন্ট ব্যবহার করার চেষ্টা করুন যা আপনাকে আপনার অনুরোধ যেমন সিআরএল, বা এমনকি ফিডলারের উল্লেখ করতে দেয়।

এই সমস্যাটি সমস্যাটি ক্লায়েন্টের মধ্যে, এপিআইতে নয়। ব্রাউজারের অনুরোধ অনুযায়ী ওয়েব এপিআই সঠিকভাবে আচরণ করে।


30
ব্রাউজার ব্যবহার করবেন না কেন? এটি এটির জন্য একটি স্পষ্ট সরঞ্জাম।
অ্যান্ডার্স লিন্ডন

4
আমি মনে করি যে এখানে বক্তব্যটি সঠিক এবং গুরুত্বপূর্ণ - যদি ক্লায়েন্টের কারণে সমস্যা দেখা দেয় তবে আমাদের অ্যাপ্লিকেশনটির (এমভিসি ওয়েবএপিআই অবকাঠামো) একটি কার্যকারী অংশকে ওভারফিক্স করা উচিত নয়। কোনও এপিআইয়ের আসল ব্যবহারের কেসটি সঠিকভাবে ব্যবহার করতে হবে (সঠিক শিরোনাম সরবরাহ করে), যা আবেদনের দায়িত্ব। যদিও ব্রাউজারটি পুরোপুরি বাতিল করার সাথে আমি একমত নই - পরীক্ষার জন্য, প্রায় কোনও ব্রাউজারের জন্য প্রচুর সরঞ্জাম রয়েছে (শুরু করার জন্য ক্লায়েন্টের মতো রেস্ট এক্সটেনশন)।
ইভাইলো স্লাভভ

6
এটি সম্ভবত একটি মন্তব্য করা উচিত।
Bonh

17

উপরের উত্তরগুলির বেশিরভাগই নিখুঁত ধারণা দেয়। যেহেতু আপনি এক্সএমএল ফর্ম্যাটে ডেটা ফর্ম্যাট করা দেখছেন, এর অর্থ XML ফর্ম্যাটারটি প্রয়োগ করা হয়েছে, সুতরাং আপনি এইচটিটিপি কনফিগারেশন প্যারামিটার থেকে এক্সএমএলফর্ম্যাটরটি সরিয়ে জেএসএন ফর্ম্যাটটি দেখতে পাচ্ছেন

public static void Register(HttpConfiguration config)
        {
            config.Routes.MapHttpRoute(
                name: "DefaultApi",
                routeTemplate: "{controller}/{id}",
                defaults: new { id = RouteParameter.Optional }
            );                
            config.Formatters.Remove(config.Formatters.XmlFormatter);                
            config.EnableSystemDiagnosticsTracing();
        }

যেহেতু JSON ডিফল্ট ফর্ম্যাট


12

Accept: application/xmlযখন User-Agentশিরোনামটিতে "ক্রোম" রয়েছে তখন আমি সরানোর জন্য একটি বিশ্বব্যাপী অ্যাকশন ফিল্টার ব্যবহার করেছি :

internal class RemoveXmlForGoogleChromeFilter : IActionFilter
{
    public bool AllowMultiple
    {
        get { return false; }
    }

    public async Task<HttpResponseMessage> ExecuteActionFilterAsync(
        HttpActionContext actionContext,
        CancellationToken cancellationToken,
        Func<Task<HttpResponseMessage>> continuation)
    {
        var userAgent = actionContext.Request.Headers.UserAgent.ToString();
        if (userAgent.Contains("Chrome"))
        {
            var acceptHeaders = actionContext.Request.Headers.Accept;
            var header =
                acceptHeaders.SingleOrDefault(
                    x => x.MediaType.Contains("application/xml"));
            acceptHeaders.Remove(header);
        }

        return await continuation();
    }
}

কাজ মনে হচ্ছে।


11

আমি Chrome অ্যাপ্লিকেশনটিকে "অ্যাডভান্সড আরএসটি ক্লায়েন্ট" টিইএসইএসটি পরিষেবাগুলির সাথে কাজ করার জন্য দুর্দান্ত দেখলাম। আপনি application/jsonঅন্যান্য জিনিসের মধ্যে কনটেন্ট-টাইপ সেট করতে পারেন : অ্যাডভান্সড আরএসটি ক্লায়েন্ট


10

সঠিক ফর্ম্যাটটি ফিরিয়ে নেওয়া মিডিয়া-টাইপ ফর্ম্যাটর দ্বারা সম্পন্ন হয়। অন্যরা যেমন উল্লেখ করেছে, আপনি WebApiConfigক্লাসে এটি করতে পারেন :

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        ...

        // Configure Web API to return JSON
        config.Formatters.JsonFormatter
        .SupportedMediaTypes.Add(new System.Net.Http.Headers.MediaTypeHeaderValue("text/html"));

        ...
    }
}

আরও জন্য, পরীক্ষা করুন:

আপনার ক্রিয়াকলাপগুলি এক্সএমএল ফিরিয়ে দিচ্ছে (এটি ডিফল্টরূপে কেস) এবং আপনার জেএসওএন ফিরিয়ে দেওয়ার জন্য কেবল একটি নির্দিষ্ট পদ্ধতি প্রয়োজন, আপনি তারপরে একটিটি ব্যবহার করতে পারেন ActionFilterAttributeএবং এটি নির্দিষ্ট ক্রিয়ায় প্রয়োগ করতে পারেন।

ফিল্টার বৈশিষ্ট্য:

public class JsonOutputAttribute : ActionFilterAttribute
{
    public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext)
    {
        ObjectContent content = actionExecutedContext.Response.Content as ObjectContent;
        var value = content.Value;
        Type targetType = actionExecutedContext.Response.Content.GetType().GetGenericArguments()[0];

        var httpResponseMsg = new HttpResponseMessage
        {
            StatusCode = HttpStatusCode.OK,
            RequestMessage = actionExecutedContext.Request,
            Content = new ObjectContent(targetType, value, new JsonMediaTypeFormatter(), (string)null)
        };

        actionExecutedContext.Response = httpResponseMsg;
        base.OnActionExecuted(actionExecutedContext);
    }
}

কর্মের জন্য আবেদন করা:

[JsonOutput]
public IEnumerable<Person> GetPersons()
{
    return _repository.AllPersons(); // the returned output will be in JSON
}

মনে রাখবেন আপনি Attributeঅ্যাকশন সজ্জায় শব্দটি বাদ দিতে পারেন এবং কেবল [JsonOutput]পরিবর্তে ব্যবহার করতে পারেন [JsonOutputAttribute]


7
        config.Formatters.Remove(config.Formatters.XmlFormatter);

3
যদিও এই কোডটি প্রশ্নের উত্তর দিতে পারে, কীভাবে এবং / বা কেন এটি সমস্যার সমাধান করে তা সম্পর্কিত অতিরিক্ত প্রসঙ্গ সরবরাহ করলে উত্তরের দীর্ঘমেয়াদী মান উন্নত হবে। দয়া করে এই স্ট্যাকওভারফ্লো.com
এসআর

6

এএসপি.নেট ওয়েবএপিআই 2 এর সর্বশেষ সংস্করণ অনুসারে,

অধীনে WebApiConfig.cs, এই কাজ করবে

config.Formatters.Remove(GlobalConfiguration.Configuration.Formatters.XmlFormatter);
config.Formatters.Add(GlobalConfiguration.Configuration.Formatters.JsonFormatter);

6

উত্তরে কেন এই জটিলতা রয়েছে তা আমার কাছে অস্পষ্ট। অবশ্যই ক্যোরিস্ট্রিংস, শিরোনাম এবং বিকল্পগুলির সাহায্যে আপনি এটি করতে পারেন এমন অনেকগুলি উপায় রয়েছে ... তবে আমি যা সেরা অনুশীলন বলে বিশ্বাস করি তা সহজ। আপনি একটি সরল ইউআরএল (উদাহরণ http://yourstartup.com/api/cars:) এর জন্য অনুরোধ করুন এবং এর বিনিময়ে আপনি JSON পাবেন। আপনি যথাযথ প্রতিক্রিয়া শিরোনাম সহ JSON পান:

Content-Type: application/json

এই একই প্রশ্নের উত্তর খুঁজতে গিয়ে, আমি এই থ্রেডটি পেয়েছি এবং চালিয়ে যেতে হয়েছিল কারণ এই গৃহীত উত্তরটি ঠিক কাজ করে না। আমি এমন একটি উত্তর পেয়েছি যা আমি মনে করি যা সেরা খুব ভাল না হওয়া খুব সহজ:

ডিফল্ট ওয়েবএপিআই ফর্ম্যাটর সেট করুন

আমি এখানে আমার টিপ যোগ করব।

WebApiConfig.cs

namespace com.yourstartup
{
  using ...;
  using System.Net.Http.Formatting;
  ...
  config.Formatters.Clear(); //because there are defaults of XML..
  config.Formatters.Add(new JsonMediaTypeFormatter());
}

ডিফল্টগুলি (কমপক্ষে যাদের আমি দেখছি) কোথা থেকে এসেছে তা নিয়ে আমার একটি প্রশ্ন রয়েছে। তারা কি। নেট ডিফল্ট, বা সম্ভবত অন্য কোথাও তৈরি হয়েছে (আমার প্রকল্পের অন্য কারও দ্বারা)। আশা, আশা করি এটি সাহায্য করবে।


5

এখানে জয়েসন.সেটেনোর এবং অন্যান্য উত্তরের মতো একটি সমাধান রয়েছে তবে এর থেকে অন্তর্নির্মিত এক্সটেনশনটি ব্যবহার করা হচ্ছে System.Net.Http.Formatting

public static void Register(HttpConfiguration config)
{
    // add support for the 'format' query param
    // cref: http://blogs.msdn.com/b/hongyes/archive/2012/09/02/support-format-in-asp-net-web-api.aspx
    config.Formatters.JsonFormatter.AddQueryStringMapping("$format", "json", "application/json");
    config.Formatters.XmlFormatter.AddQueryStringMapping("$format", "xml", "application/xml");

    // ... additional configuration
 }

সমাধানটি প্রাথমিকভাবে WebApi এর প্রাথমিক প্রকাশে ওডাটা-র জন্য সমর্থন $ ফর্ম্যাট করার দিকে তত্পর হয়েছিল, তবে এটি অ-ওডাটা বাস্তবায়নের ক্ষেত্রেও প্রযোজ্য এবং Content-Type: application/json; charset=utf-8প্রতিক্রিয়াটিতে শিরোনামটি প্রদান করে ।

এটি আপনাকে ব্রাউজারের সাথে পরীক্ষা করার সময় আপনার ইউরির শেষ অংশটিকে মোকাবেলা করতে &$format=jsonবা অনুমতি দেয় &$format=xml। ব্রাউজারবিহীন ক্লায়েন্ট ব্যবহার করার সময় এটি অন্যান্য প্রত্যাশিত আচরণে হস্তক্ষেপ করে না যেখানে আপনি নিজের শিরোনাম সেট করতে পারেন।


5

আপনি নীচের হিসাবে ব্যবহার করতে পারেন:

GlobalConfiguration.Configuration.Formatters.Clear();
GlobalConfiguration.Configuration.Formatters.Add(new JsonMediaTypeFormatter());

যদি আপনি কেবল JSON বার্তা পাস করার জন্য কোনও ওয়েবএপিআই অ্যাপ্লিকেশন তৈরি করে থাকেন তবে এই উত্তরটি বিবেচনা করুন।
অ্যালেন 1

4

আপনার WebApiConfig শ্রেণিতে এই দুটি লাইন কোড যুক্ত করুন

public static class WebApiConfig
{
     public static void Register(HttpConfiguration config)
     {
          //add this two line 
          config.Formatters.Clear();
          config.Formatters.Add(new JsonMediaTypeFormatter());


          ............................
      }
}

3

আপনি কেবল এটির App_Start/WebApiConfig.csমতো পরিবর্তন করুন :

public static void Register(HttpConfiguration config)
    {
        // Web API configuration and services

        // Web API routes
        config.MapHttpAttributeRoutes();
        //Below formatter is used for returning the Json result.
        var appXmlType = config.Formatters.XmlFormatter.SupportedMediaTypes.FirstOrDefault(t => t.MediaType == "application/xml");
        config.Formatters.XmlFormatter.SupportedMediaTypes.Remove(appXmlType);
        //Default route
        config.Routes.MapHttpRoute(
           name: "ApiControllerOnly",
           routeTemplate: "api/{controller}"
       );
    }

ফর্ম্যাটর অপসারণ করা ভাল ধারণা নয়, আপনি কার্যকারিতা সরিয়ে দিচ্ছেন।
নাসপিনস্কি

প্রকৃতপক্ষে এই ক্ষেত্রে, এটি আমার পক্ষে ভাল কাজ করে, আবার অনেকেই এ জাতীয় উপায়ের পরামর্শ দেয়। আমি এটি myview.rahulnivi.net/building-spa-angular-mvc-5 বই থেকে শিখেছি !
vaheeds

2

এমএসডিএন এএসপি.এনইটি এবং অ্যাঙ্গুলারজেএস (প্রায় 41 মিনিটের মধ্যে) দিয়ে একটি একক পৃষ্ঠা অ্যাপ্লিকেশন তৈরি করা থেকে ।

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        // ... possible routing etc.

        // Setup to return json and camelcase it!
        var formatter = GlobalConfiguration.Configuration.Formatters.JsonFormatter;
        formatter.SerializerSettings.ContractResolver =
            new Newtonsoft.Json.Serialization.CamelCasePropertyNamesContractResolver();
    }

এটি বর্তমান হওয়া উচিত, আমি এটি চেষ্টা করেছিলাম এবং এটি কাজ করে।


2

এই প্রশ্নটি জিজ্ঞাসা করার (এবং উত্তর দেওয়া) কিছু সময় কেটে গেছে তবে আরেকটি বিকল্প হ'ল সার্ভারের স্বীকৃতি শিরোনামকে অনুরোধ প্রক্রিয়াকরণের সময় নীচের মত একটি বার্তা হ্যান্ডলার ব্যবহার করে ওভাররাইড করা হবে:

public class ForceableContentTypeDelegationHandler : DelegatingHandler
{
    protected async override Task<HttpResponseMessage> SendAsync(
                HttpRequestMessage request,
                CancellationToken cancellationToken)
    {
        var someOtherCondition = false;
        var accHeader = request.Headers.GetValues("Accept").FirstOrDefault();
        if (someOtherCondition && accHeader.Contains("application/xml"))
        {
            request.Headers.Remove("Accept");
            request.Headers.Add("Accept", "application/json");
        }
        return await base.SendAsync(request, cancellationToken);
    }
}

someOtherConditionব্রাউজারের ধরণ ইত্যাদিসহ কিছু যেখানে থাকতে পারে, এটি শর্তযুক্ত ক্ষেত্রে যেখানে কেবল কখনও কখনও আমরা ডিফল্ট সামগ্রী আলোচনাকে ওভাররাইড করতে চাই। অন্যথায় অন্যান্য উত্তর হিসাবে, আপনি কেবল কনফিগারেশন থেকে একটি অপ্রয়োজনীয় বিন্যাস অপসারণ করতে হবে।

আপনার অবশ্যই এটি নিবন্ধন করতে হবে। আপনি হয় বিশ্বব্যাপী এটি করতে পারেন:

  public static void Register(HttpConfiguration config) {
      config.MessageHandlers.Add(new ForceableContentTypeDelegationHandler());
  }

বা রুট ভিত্তিতে একটি রুটে:

config.Routes.MapHttpRoute(
   name: "SpecialContentRoute",
   routeTemplate: "api/someUrlThatNeedsSpecialTreatment/{id}",
   defaults: new { controller = "SpecialTreatment" id = RouteParameter.Optional },
   constraints: null,
   handler: new ForceableContentTypeDelegationHandler()
);

আর এই থেকে একটি বার্তা হ্যান্ডলার এটা অনেক একটি মত পাইপলাইন উভয় অনুরোধ এবং প্রতিক্রিয়া প্রান্ত চালানো হবে HttpModule। সুতরাং আপনি সহজেই একটি কাস্টম শিরোলেখ দিয়ে ওভাররাইড স্বীকার করতে পারেন:

public class ForceableContentTypeDelegationHandler : DelegatingHandler
{
    protected async override Task<HttpResponseMessage> SendAsync(
                HttpRequestMessage request,
                CancellationToken cancellationToken)
    {
        var wasForced = false;
        var someOtherCondition = false;
        var accHeader = request.Headers.GetValues("Accept").FirstOrDefault();
        if (someOtherCondition && accHeader.Contains("application/xml"))
        {
            request.Headers.Remove("Accept");
            request.Headers.Add("Accept", "application/json");
            wasForced = true;
        }

        var response =  await base.SendAsync(request, cancellationToken);
        if (wasForced){
          response.Headers.Add("X-ForcedContent", "We overrode your content prefs, sorry");
        }
        return response;
    }
}

2

এখানে আমি আমার অ্যাপ্লিকেশনগুলিতে সবচেয়ে সহজ উপায়টি ব্যবহার করেছি। মধ্যে কোডের 3 লাইন নিচে দেওয়া যোগ App_Start\\WebApiConfig.csমধ্যে Registerফাংশন

    var formatters = GlobalConfiguration.Configuration.Formatters;

    formatters.Remove(formatters.XmlFormatter);

    config.Formatters.JsonFormatter.SupportedMediaTypes.Add(new MediaTypeHeaderValue("application/json"));

Asp.net ওয়েব API স্বয়ংক্রিয়ভাবে আপনার রিটার্নিং অবজেক্টটি JSON এ সিরিয়ালাইজ করবে এবং হেডারটিতে application/jsonযেমন যোগ করা হবে তাই ব্রাউজার বা রিসিভার বুঝতে পারে যে আপনি JSON ফলাফলটি ফিরিয়ে দিচ্ছেন।


1

ওয়েবসিপিফনফিগ এমন এক জায়গা যেখানে আপনি জেএসন বা এক্সএমএল আউটপুট করতে চান তা কনফিগার করতে পারেন। ডিফল্টরূপে এটি এক্সএমএল। রেজিস্টার ফাংশনে আমরা আউটপুট ফর্ম্যাট করতে HTTPConfigration ফর্ম্যাটর ব্যবহার করতে পারি। System.Net.Http.Heilers => MediaTypeHeaderValue ("পাঠ্য / এইচটিএমএল") জসন ফর্ম্যাটে আউটপুট পেতে প্রয়োজনীয়। এখানে চিত্র বর্ণনা লিখুন


1

ব্যবহার ফেলিপে Leusin বছর ধরে এর উত্তর কোর লাইব্রেরি এবং Json.Net একটি সাম্প্রতিক আপডেটের পরে, আমি একটা দৌড়ে System.MissingMethodExceptionSupportedMediaTypes। আমার ক্ষেত্রে সমাধানটি আশা করি অন্যদের জন্য একই অপ্রত্যাশিত ব্যতিক্রমের জন্য সহায়ক, এটি ইনস্টল করা System.Net.Http। নিউগেট দৃশ্যত কিছু পরিস্থিতিতে এটি সরিয়ে দেয়। একটি ম্যানুয়াল ইনস্টলেশন পরে সমস্যাটি সমাধান করা হয়েছিল।


-3

আমি অনেক একটি একক ব্যবহারের ক্ষেত্রে (Get) এ পরিবর্তন করতে কোডিং প্রয়োজন উত্তর দেখতে বিস্মিত নই এক এপিআই পরিবর্তে কি একবার ইনস্টল করা হয়েছে এবং জন্য ব্যবহার করা যেতে পারে একটি সঠিক টুল ব্যবহার করে কোন এপিআই (নিজের বা 3 য় পক্ষের) এবং সমস্ত ব্যবহারের ক্ষেত্রে.

সুতরাং ভাল উত্তরটি হ'ল:

  1. আপনি যদি কেবল জসন বা অন্যান্য সামগ্রী প্রকারের অনুরোধ করতে চান তবে অনুরোধ বা অনুরূপ কোনও সরঞ্জাম ইনস্টল করুন এবং স্বীকার করুন শিরোনামটি সংশোধন করুন।
  2. আপনি যদি পোষ্টটিও খুব বেশি ব্যবহার করতে চান এবং জসন, এক্সএমএল ইত্যাদি সুন্দরভাবে ফর্ম্যাটেড করতে চান তবে পোস্টম্যান বা এআরসি এর মতো উপযুক্ত এপিআই টেস্টিং এক্সটেনশন ব্যবহার করুন ।

কেউ কেউ অতিরিক্ত সরঞ্জাম এবং লাইব্রেরি আকারে ব্লোট যোগ না করে কাজ করা পছন্দ করে।
tno2007

কেবলমাত্র এপিআইতে পরিবর্তন করা ভুল কারণ শুধুমাত্র কেউ কাজের জন্য ভুল সরঞ্জামটি ব্যবহার করছে। একটি ওয়েব ব্রাউজার এপিআইগুলির পরীক্ষার জন্য ডিজাইন করা হয়নি, এমনকি এপিআইয়ের আউটপুট দেখার জন্য নয় তবে দস্তাবেজগুলি দেখার জন্য। এটি আরও খারাপ যদি কেউ মনে করে যে কোনও এপিআই বিকাশকারীকে বাধ্যতামূলক টুলকিটের অংশের পরিবর্তে কোনও এপিআই পরীক্ষক সরঞ্জামটি স্ফোটিত হয়, এবং সত্যই আমি সামনের দিকের বিকাশকারীদেরও যুক্ত করব কারণ তাদের এপিআইয়ের সাথে ইন্টারঅ্যাক্ট এবং পরীক্ষার প্রয়োজন হয়। এটি সম্ভবত যথেষ্ট নয় কারণ অ্যাডিনগুলি ছাড়াই ব্রাউজার শিরোনাম সেট করতে, কোনও এপিআইতে পোস্ট করতে বা প্রতিক্রিয়া শিরোনামও পরিদর্শন করতে দেয় না।
ব্যবহারকারী 3285954

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