javascript - কিভাবে ওয়েব এপিআই পদ্ধতিতে একটি বস্তু হিসাবে জসন POST তথ্য পাস?




asp.net-mvc json (6)

1) আপনার ক্লায়েন্ট পাশে আপনি নীচের মত স্ট্রিং http.post অনুরোধ পাঠাতে পারেন

var IndexInfo = JSON.stringify(this.scope.IndexTree);
this.$http.post('../../../api/EvaluationProcess/InsertEvaluationProcessInputType', "'" + IndexInfo + "'" ).then((response: any) => {}

2) তারপর আপনার ওয়েব এপিআই নিয়ামক আপনি এটি deserialize করতে পারেন

public ApiResponce InsertEvaluationProcessInputType([FromBody]string IndexInfo)
    {
var des = (ApiReceivedListOfObjects<TempDistributedIndex>)Newtonsoft.Json.JsonConvert.DeserializeObject(DecryptedProcessInfo, typeof(ApiReceivedListOfObjects<TempDistributedIndex>));}

3) আপনার ApiReceivedListOfObjects বর্গ নীচের মত হওয়া উচিত

public class ApiReceivedListOfObjects<T>
    {
        public List<T> element { get; set; }

    }

4) নিশ্চিত করুন যে আপনার সিরিয়ালাইজড স্ট্রিং (IndexInfo এখানে) JsonConvert এর আগে স্ট্রাকচারের মতো হয়ে গেছে। Step 2 এ DeeserializeObject কমান্ড

var resp = @"
    {
        ""element"": [
        {
            ""A"": ""A Jones"",
            ""B"": ""500015763""
        },
        {
            ""A"": ""B Smith"",
            ""B"": ""504986213""
        },
        {
            ""A"": ""C Brown"",
            ""B"": ""509034361""
        }
        ]
    }";

ASP.NET MVC4 ওয়েব API অ্যাপ্লিকেশন গ্রাহকের সংরক্ষণ করার জন্য পোস্ট পদ্ধতি সংজ্ঞায়িত করে। গ্রাহক POST অনুরোধ শরীরের মধ্যে জসন বিন্যাসে পাস করা হয়। পোস্ট পদ্ধতিতে গ্রাহক পরামিতি বৈশিষ্ট্যগুলির জন্য নুল মান রয়েছে।

কিভাবে এই ঠিক করা যাতে পোস্ট তথ্য গ্রাহক অবজেক্ট হিসাবে পাস হবে?

সম্ভব হলে বিষয়বস্তু-প্রকার: অ্যাপ্লিকেশন / এক্স-www-form-urlencoded ব্যবহার করা উচিত কারণ আমি ফর্ম পোস্ট করে জাভাস্ক্রিপ্ট পদ্ধতিতে কীভাবে এটি পরিবর্তন করতে পারি তা জানি না।

নিয়ন্ত্রক:

public class CustomersController : ApiController {

  public object Post([FromBody] Customer customer)
        {
            return Request.CreateResponse(HttpStatusCode.OK,
            new
            {
                customer = customer
            });
        }
    }
}

public class Customer
    {
        public string company_name { get; set; }
        public string contact_name { get; set; }
     }

অনুরোধ:

POST http://localhost:52216/api/customers HTTP/1.1
Accept: application/json, text/javascript, */*; q=0.01
X-Requested-With: XMLHttpRequest
Content-Type: application/x-www-form-urlencoded; charset=UTF-8

{"contact_name":"sdfsd","company_name":"ssssd"}

JSON ফর্ম্যাটে স্ট্রিং পেতে JSON.stringify () ব্যবহার করুন, এটি নিশ্চিত করুন যে AJAX কলটি তৈরি করার সময় আপনি উল্লেখ করা বৈশিষ্ট্যগুলি নীচে প্রেরণ করুন:

  • কন্টেন্ট টাইপ: 'অ্যাপ্লিকেশন / জসন'
  • তথ্য টাইপ: 'জসন'

Aj.net ওয়েব এপিআই এ AJAX পোস্ট কল করতে জিকির কোডটি নীচে দেওয়া হল:

var product =
    JSON.stringify({
        productGroup: "Fablet",
        productId: 1,
        productName: "Lumia 1525 64 GB",
        sellingPrice: 700
    });

$.ajax({
    URL: 'http://localhost/api/Products',
    type: 'POST',
    contentType: 'application/json',
    dataType: 'json',
    data: product,
    success: function (data, status, xhr) {
        alert('Success!');
    },
    error: function (xhr, status, error) {
        alert('Update Error occurred - ' + error);
    }
});


আমি শুধু এই সঙ্গে বাজানো হয়েছে এবং একটি বরং অদ্ভুত ফলাফল আবিষ্কৃত করেছি। বলুন আপনার # এ C # এ আপনার শ্রেণিতে পাবলিক বৈশিষ্ট্য রয়েছে:

public class Customer
{
    public string contact_name;
    public string company_name;
}

তারপর আপনাকে অবশ্যই JSON.stringify কৌশলটি যেমন শ্যামু দ্বারা প্রস্তাবিত করা উচিত এবং এটি এটিকে কল করুন:

var customer = {contact_name :"Scott",company_name:"HP"};
$.ajax({
    type: "POST",
    data :JSON.stringify(customer),
    url: "api/Customer",
    contentType: "application/json"
});

যাইহোক, আপনি যদি আপনার শ্রেণিতে গেটস এবং সেট্টারগুলি সংজ্ঞায়িত করেন তবে:

public class Customer
{
    public string contact_name { get; set; }
    public string company_name { get; set; }
}

তারপর আপনি এটা আরো সহজভাবে কল করতে পারেন:

$.ajax({
    type: "POST",
    data :customer,
    url: "api/Customer"
});

এটি HTTP হেডার ব্যবহার করে:

Content-Type:application/x-www-form-urlencoded

আমি এখানে কি ঘটছে তা নিশ্চিত নই তবে এটি কাঠামোর মধ্যে একটি বাগ (বৈশিষ্ট্য?) মনে হচ্ছে। সম্ভবত বিভিন্ন বাঁধাই পদ্ধতি বিভিন্ন "অ্যাডাপ্টার" কল করছে, এবং অ্যাপ্লিকেশন / জসন জন্য অ্যাডাপ্টারের একটি পাবলিক বৈশিষ্ট্য সঙ্গে কাজ করে, ফর্ম এনকোড করা তথ্য জন্য এক নয়।

আমি যদিও কোন ভাল ধারণা বিবেচনা করা হবে, যা কোন ধারণা আছে।


ওয়েবপিতে পোস্ট দিয়ে কাজ করা চতুর হতে পারে! ইতিমধ্যে সঠিক উত্তর যোগ করতে চান।

জিইটি সঙ্গে ডিলিং হিসাবে POST উপর বিশেষভাবে ফোকাস তুচ্ছ হয়। আমি webapis সঙ্গে GET সঙ্গে একটি সমস্যা সমাধানের জন্য কাছাকাছি অনুসন্ধান করা হবে মনে হয় না। যাইহোক ..

যদি আপনার প্রশ্ন হয় - এমভিসি ওয়েব অ্যাপিতে কিভাবে জেনারেটিক HTTP ক্রিয়া ব্যতীত কাস্টম অ্যাকশন পদ্ধতির নাম ব্যবহার করবেন? - একাধিক পোস্ট সঞ্চালন? - একাধিক সহজ ধরনের পোস্ট? - jQuery মাধ্যমে জটিল ধরনের পোস্ট?

তারপর নিম্নলিখিত সমাধান সাহায্য করতে পারে:

প্রথম, ওয়েব API এ কাস্টম অ্যাকশন পদ্ধতিগুলি ব্যবহার করার জন্য, একটি ওয়েব API রুট যেমনটি যোগ করুন:

public static void Register(HttpConfiguration config)
{
    config.Routes.MapHttpRoute(
        name: "ActionApi",
        routeTemplate: "api/{controller}/{action}");
}

এবং তারপর আপনি কর্ম পদ্ধতি তৈরি করতে পারেন:

[HttpPost]
public string TestMethod([FromBody]string value)
{
    return "Hello from http post web api controller: " + value;
}

এখন, আপনার ব্রাউজার কনসোল থেকে নিম্নলিখিত jQuery আগুন

$.ajax({
    type: 'POST',
    url: 'http://localhost:33649/api/TestApi/TestMethod',
    data: {'':'hello'},
    contentType: 'application/x-www-form-urlencoded',
    dataType: 'json',
    success: function(data){ console.log(data) }
});

দ্বিতীয়ত, একাধিক পোস্ট সঞ্চালনের জন্য, এটি সহজ, একাধিক অ্যাকশন পদ্ধতি তৈরি করুন এবং [HttpPost] attrib দিয়ে সজ্জিত করুন। কাস্টম নামগুলি নির্দিষ্ট করতে [অ্যাকশন নাম ("MyAction")] ব্যবহার করুন, ইত্যাদি নীচের চতুর্থ বিন্দুতে jQuery এ আসবে

তৃতীয়, সর্বপ্রথম, একক পদক্ষেপে একাধিক SIMPLE পোস্ট পোস্ট করা সম্ভব নয়। তাছাড়া, এমনকি একটি সাধারণ টাইপ পোস্ট করার জন্য একটি বিশেষ বিন্যাস রয়েছে (ক্যোয়ারী স্ট্রিং বা REST স্টাইলের পরামিতি পাশে)। এই পয়েন্টটি ছিল যে আমাকে বিশ্রাম ক্লায়েন্টদের সাথে আমার মাথা ঠেলে দিয়েছিল (যেমন ফিডলার এবং ক্রোমের উন্নত REST ক্লায়েন্ট এক্সটেনশান) এবং অবশেষে নিম্নলিখিত URL টি সাহায্যের পক্ষে প্রমাণিত হয়ে প্রায় 5 ঘন্টা ধরে ওয়েবে খোঁজাচ্ছিল। লিঙ্কের জন্য প্রাসঙ্গিক কন্টেন্ট উদ্ধৃত করা হতে পারে মৃত পরিণত!

Content-Type: application/x-www-form-urlencoded
in the request header and add a = before the JSON statement:
={"Name":"Turbo Tina","Email":"[email protected]"}

PS: অদ্ভুত সিনট্যাক্স নোটিশ?

http://forums.asp.net/t/1883467.aspx?The+received+value+is+null+when+I+try+to+Post+to+my+Web+Api

যাইহোক, আমাদের যে গল্প উপর পেতে দিন। সরানো:

চতুর্থ, জাভাস্ক্রিপ্ট, অফকোর্স, $ .ajax () এর মাধ্যমে জটিল ধরনের পোস্ট পোস্টে অবিলম্বে আসছে:

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

var person = { PersonId:1, Name:"James" }
$.ajax({
    type: 'POST',
    url: 'http://mydomain/api/TestApi/TestMethod',
    data: JSON.stringify(person),
    contentType: 'application/json; charset=utf-8',
    dataType: 'json',
    success: function(data){ console.log(data) }
});

এবং কর্ম মত চেহারা হবে:

[HttpPost]
public string TestMethod(Person person)
{
    return "Hello from http post web api controller: " + person.Name;
}

উপরে সব, আমার জন্য কাজ !! চিয়ার্স!


XML কোড পরিবর্তে জেসন বিন্যাসে তথ্য ফেরত দেওয়ার জন্য নিম্নলিখিত কোডটি: -

Global.asax ফাইলে নিম্নলিখিত লাইন রাখুন

GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore;
        GlobalConfiguration.Configuration.Formatters.Remove(GlobalConfiguration.Configuration.Formatters.XmlFormatter);

সম্পাদন করুন : 31/10/2017

একই কোড / পদ্ধতি Asp.Net Core 2.0 এর জন্যও কাজ করবে। প্রধান পার্থক্য হল, ASP.NET কোরে, উভয় ওয়েব এপিআই কন্ট্রোলার এবং এমভিসি কন্ট্রোলারগুলি একক কন্ট্রোলার মডেলের সাথে একত্রিত হয়। সুতরাং আপনার রিটার্ন টাইপ IActionResult বা এটির বাস্তবায়ন হতে পারে (Ex: OkObjectResult )

ব্যবহার

contentType:"application/json"

আপনি এটি পাঠানোর সময় JSON স্ট্রিং রূপান্তর করতে JSON.stringify পদ্ধতিটি ব্যবহার করতে হবে,

এবং মডেল বাইন্ডার আপনার ক্লাস অবজেক্টে জসন ডেটা জুড়ে দেবে।

নিচের কোড জরিমানা (পরীক্ষা করা হবে)

$(function () {
    var customer = {contact_name :"Scott",company_name:"HP"};
    $.ajax({
        type: "POST",
        data :JSON.stringify(customer),
        url: "api/Customer",
        contentType: "application/json"
    });
});

ফল

contentType সম্পত্তি সার্ভারকে বলে যে আমরা JSON বিন্যাসে ডেটা পাঠাচ্ছি। যেহেতু আমরা একটি JSON ডেটা কাঠামো পাঠিয়েছি, মডেল বাইন্ডিং সঠিকভাবে ঘটবে।

যদি আপনি AJAX অনুরোধের শিরোনামগুলি পরিদর্শন করেন তবে আপনি দেখতে পারেন যে Content-Type মান application/json হিসাবে সেট করা আছে।

আপনি যদি বিষয়বস্তু টাইপ স্পষ্টভাবে উল্লেখ না করেন তবে এটি ডিফল্ট সামগ্রী টাইপ ব্যবহার করবে যা application/x-www-form-urlencoded; এক্স- application/x-www-form-urlencoded;

মন্তব্য উত্থাপিত অন্যান্য সম্ভাব্য সমস্যা মোকাবেলার নভেম্বর 2015 এ সম্পাদনা করুন

একটি জটিল বস্তু পোস্ট করা

আসুন আপনার মত জটিল জটিল মডেল ক্লাসটি আপনার ওয়েব এপিআই অ্যাকশন পদ্ধতি প্যারামিটার হিসাবে এইরকম

public class CreateUserViewModel
{
   public int Id {set;get;}
   public string Name {set;get;}  
   public List<TagViewModel> Tags {set;get;}
}
public class TagViewModel
{
  public int Id {set;get;}
  public string Code {set;get;}
}

এবং আপনার ওয়েব api শেষ বিন্দু মত

public class ProductController : Controller
{
    [HttpPost]
    public CreateUserViewMode Save([FromBody] CreateUserViewModel m)
    {
        // I am just returning the posted model as it is. 
        // You may do other stuff and return different response.
        // Ex : missileService.LaunchMissile(m);
        return m;
    }
}

এই লেখার সময়, ASP.NET MVC 6 সর্বশেষ স্থিতিশীল সংস্করণ এবং MVC6 এ, উভয় ওয়েব API কন্ট্রোলার এবং MVC কন্ট্রোলার Microsoft.AspNet.Mvc.Controller বেস ক্লাস থেকে উত্তরাধিকারী হয়।

ক্লায়েন্ট পার্শ্ব থেকে পদ্ধতিতে তথ্য পাঠাতে, নিচের কোডটি ভাল কাজ করা উচিত

//Build an object which matches the structure of our view model class
var model = {
    Name: "Shyju",
    Id: 123,
    Tags: [{ Id: 12, Code: "C" }, { Id: 33, Code: "Swift" }]
};

$.ajax({
    type: "POST",
    data: JSON.stringify(model),
    url: "../product/save",
    contentType: "application/json"
}).done(function(res) {       
    console.log('res', res);
    // Do something with the result :)
});

কিছু বৈশিষ্ট্য জন্য মডেল বাঁধাই কাজ, কিন্তু সব না! কেন?

আপনি [FromBody] বৈশিষ্ট্য সহ ওয়েব api পদ্ধতি পরামিতি সাজাইয়া না

[HttpPost]
public CreateUserViewModel Save(CreateUserViewModel m)
{
    return m;
}

এবং বিষয়বস্তু নির্দিষ্ট না করে মডেল (কাঁচা জাভাস্ক্রিপ্ট বস্তু, JSON ফর্ম্যাটে নয়) সম্পত্তি মান টাইপ করুন

$.ajax({
    type: "POST",
    data: model,
    url: "../product/save"
}).done(function (res) {
     console.log('res', res);
});

মডেল বাইন্ডিং মডেলের সমতল বৈশিষ্ট্যগুলির জন্য কাজ করবে, কোনও বৈশিষ্ট্যটি জটিল / অন্য কোন ধরণের বৈশিষ্ট্য নয়। আমাদের ক্ষেত্রে, Id এবং Name বৈশিষ্ট্যাবলী সঠিকভাবে প্যারামিটার m থেকে আবদ্ধ হবে, তবে Tags সম্পত্তি একটি খালি তালিকা হবে।

আপনি যদি সংক্ষিপ্ত সংস্করণটি ব্যবহার করেন তবে একই সমস্যা ঘটবে, $.post যা অনুরোধ পাঠানোর সময় ডিফল্ট সামগ্রী-প্রকার ব্যবহার করবে।

$.post("../product/save", model, function (res) {
    //res contains the markup returned by the partial view
    console.log('res', res);
});





asp.net-web-api