json - এমএল - জাভাস্ক্রিপ্ট কোড




Chrome ব্যবহার করে এক্সএমএল পরিবর্তে JSON ফিরে পেতে আমি কিভাবে ASP.NET ওয়েব API পাই? (20)

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


ASP.net WebApi 2 এর সর্বশেষ সংস্করণ অনুসারে,

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

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

MVC4 দ্রুত টিপ # 3-এএসপি.Net ওয়েব API থেকে এক্সএমএল ফরম্যাট মুছে ফেলা হচ্ছে

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();
}

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

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


WebApiConfig এমন স্থান যেখানে আপনি জন্সন বা xml এ আউটপুট করতে চান কিনা তা কনফিগার করতে পারেন। ডিফল্টরূপে এটি এক্সএমএল। নিবন্ধন ফাংশনে আমরা আউটপুট ফরম্যাট করতে HttpConfiguration ফর্ম্যাটার ব্যবহার করতে পারি। System.Net.Http.Headers => MediaTypeHeaderValue ("text / html") জson ফর্ম্যাটে আউটপুট পেতে প্রয়োজন।


আপনি 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}"
       );
    }

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

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

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

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();
    }
}

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


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

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());

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

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

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


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

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 মত পাইপলাইনের অনুরোধ এবং প্রতিক্রিয়া উভয় প্রান্তে 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;
    }
}

একবারে ইনস্টল করা উচিত এমন একটি সঠিক সরঞ্জাম ব্যবহার করার পরিবর্তে এক API এ একক ব্যবহার ক্ষেত্রে (GET) পরিবর্তন করার কোডিংয়ের জন্য অনেকগুলি প্রত্যুত্তর দেখে আমি অবাক হয়ে আছি এবং কোন API (নিজস্ব বা তৃতীয় পক্ষ) এবং সমস্তের জন্য ব্যবহার করা যেতে পারে ব্যবহারের ক্ষেত্রে.

তাই ভাল উত্তর হল:

  1. আপনি কেবল Requestly বা অন্যান্য সামগ্রী টাইপ অনুরোধ করতে চান অনুরোধ বা একই ধরণের সরঞ্জাম ইনস্টল করুন এবং Accept হেডার সংশোধন করুন।
  2. আপনি যদি POST ব্যবহার করতে চান এবং চমত্কারভাবে বিন্যাস করা হয়েছে তবে জson, এক্সএমএল ইত্যাদি Postman বা ARC মত সঠিক API Postman এক্সটেনশন ব্যবহার করুন।

এখানে jayson.centeno's এবং অন্যান্য উত্তরগুলির মতো একটি সমাধান রয়েছে, তবে System.Net.Http.Formatting . 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
 }

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

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


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

Content-Type: application/json

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

ডিফল্ট WebAPI ফর্ম্যাট সেট করুন

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

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());
}

আমার কোন প্রশ্ন আছে যেখানে ডিফল্ট (অন্তত আমি যা দেখছি) থেকে আসে। তারা কি .NET ডিফল্ট, অথবা সম্ভবত অন্য কোথাও তৈরি করেছেন (আমার প্রোজেক্টে অন্য কেউ দ্বারা)। Anways, আশা করি এই সাহায্য করে।



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

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


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

সঠিক ফর্ম্যাটটি রিটার্ন করা মিডিয়া-টাইপ ফরম্যাটের দ্বারা করা হয়। অন্যরা যেমন উল্লেখ করেছেন, আপনি ওয়েব 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"));

        ...
    }
}

আরো জন্য, চেক করুন:

যদি আপনার কাজগুলি এক্সএমএল ফিরে আসছে (যা ডিফল্ট হিসাবে কেস) এবং JSON ফিরে পাওয়ার জন্য আপনার একটি নির্দিষ্ট পদ্ধতি প্রয়োজন হয়, তখন আপনি একটি 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
}

মনে রাখবেন যে আপনি অ্যাকশন [JsonOutput] বাদ দিতে পারেন এবং [JsonOutput] পরিবর্তে কেবলমাত্র [JsonOutput] ব্যবহার করতে পারেন।


WebApiConfig.cs এ , নিবন্ধন ফাংশনের শেষে যুক্ত করুন:

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

Source


এমএসডিএন থেকে এএসপি নেট এবং অ্যাঙ্গুলারজেএস (প্রায় 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();
    }

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


আমি শুধু আমার MVC ওয়েব API প্রকল্পে App_Start / WebApiConfig.cs শ্রেণিতে নিম্নলিখিতটি যোগ করি।

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

এটি নিশ্চিত করে যে আপনি জেসনকে বেশিরভাগ প্রশ্নগুলিতে পান তবে আপনি text/xml পাঠালে xml পেতে পারেন।

আপনি যদি সাবস্ক্রিপশন Content-Type application/json হিসাবে প্রতিক্রিয়া করতে চান তবে দয়া করে নীচের টড এর উত্তর পরীক্ষা করুন।

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


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




asp.net-web-api