ওয়েবএপিআই মাল্টিপল পুট / পোস্ট পরামিতি


154

আমি কোনও ওয়েবএপিআই নিয়ামককে একাধিক পরামিতি পোস্ট করার চেষ্টা করছি। একটি পরম ইউআরএল থেকে, এবং অন্যটি শরীর থেকে। এখানে ইউআরএল: /offers/40D5E19D-0CD5-4FBD-92F8-43FDBB475333/prices/

এটি আমার নিয়ামক কোড:

public HttpResponseMessage Put(Guid offerId, OfferPriceParameters offerPriceParameters)
{
    //What!?
    var ser = new DataContractJsonSerializer(typeof(OfferPriceParameters));
    HttpContext.Current.Request.InputStream.Position = 0;
    var what = ser.ReadObject(HttpContext.Current.Request.InputStream);

    return new HttpResponseMessage(HttpStatusCode.Created);
}

শরীরের সামগ্রীটি JSON এ রয়েছে:

{
    "Associations":
    {
        "list": [
        {
            "FromEntityId":"276774bb-9bd9-4bbd-a7e7-6ed3d69f196f",
            "ToEntityId":"ed0d2616-f707-446b-9e40-b77b94fb7d2b",
            "Types":
            {
                "list":[
                {
                    "BillingCommitment":5,
                    "BillingCycle":5,
                    "Prices":
                    {
                        "list":[
                        {
                            "CurrencyId":"274d24c9-7d0b-40ea-a936-e800d74ead53",
                            "RecurringFee":4,
                            "SetupFee":5
                        }]
                    }
                }]
            }
        }]
    }
}

কোনও ধারণা কেন ডিফল্ট বাঁধাই offerPriceParametersআমার নিয়ামকের যুক্তির সাথে আবদ্ধ হতে পারে না ? এটি সর্বদা বাতিল হয়ে যায় set তবে আমি এটি ব্যবহার করে শরীর থেকে ডেটা পুনরুদ্ধার করতে সক্ষম হয়েছি DataContractJsonSerializer

আমি FromBodyযুক্তির বৈশিষ্ট্যটিও ব্যবহার করার চেষ্টা করি তবে এটি কার্যকর হয় না।

উত্তর:


78
[HttpPost]
public string MyMethod([FromBody]JObject data)
{
    Customer customer = data["customerData"].ToObject<Customer>();
    Product product = data["productData"].ToObject<Product>();
    Employee employee = data["employeeData"].ToObject<Employee>();
    //... other class....
}

রেফারেন্স ব্যবহার করে

using Newtonsoft.Json.Linq;

JQuery Ajax এর জন্য অনুরোধটি ব্যবহার করুন Use

var customer = {
    "Name": "jhon",
    "Id": 1,
};
var product = {
    "Name": "table",
    "CategoryId": 5,
    "Count": 100
};
var employee = {
    "Name": "Fatih",
    "Id": 4,
};

var myData = {};
myData.customerData = customer;
myData.productData = product;
myData.employeeData = employee;

$.ajax({
    type: 'POST',
    async: true,
    dataType: "json",
    url: "Your Url",
    data: myData,
    success: function (data) {
        console.log("Response Data ↓");
        console.log(data);
    },
    error: function (err) {
        console.log(err);
    }
});

3
দুর্দান্ত সমাধান। যদি এটি অন্যের কাছে ইতিমধ্যে পরিষ্কার না থাকে তবে আপনিও ব্যবহার করতে পারেন b টোঅজেক্ট <int> (), .ToObject <ডেসিমেল> (), টোস্ট্রিং (), ইত্যাদি ইত্যাদি যদি আপনি নিজের এজ্যাক্স কল থেকে সাধারণ, একাধিক পরামিতিগুলিতে পাস করছেন।
সিক্রেটওয়েপ

আপনাকে ধন্যবাদ, আমি নিজের এপিআই তৈরি করে পোস্টম্যানের মাধ্যমে এটি পরীক্ষার মাধ্যমে আপনার সমাধানটি চেষ্টা করেছি এবং এটি ভাল কাজ করছে; তবে আমি var পরীক্ষা = {"নাম": "পরীক্ষা" like এর মতো একটি চতুর্থ প্যারামিটার যুক্ত করেছি এবং এটি আমার ডেটা অবজেক্টে যুক্ত করেছি এবং এটি সফলভাবে প্রেরণ করা হয়েছিল; এটি এড়াতে এবং কেবলমাত্র আসল অবজেক্টগুলিকে সীমাবদ্ধ করার জন্য কি কোনও উপায় আছে?
Mlle116

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

63

নেটিভালি WebAPI একাধিক POST পরামিতিগুলির বাইন্ডিং সমর্থন করে না। কলিন যেমন উল্লেখ করেছেন তেমন একটি সীমাবদ্ধতা রয়েছে যা আমার ব্লগ পোস্টে সে উল্লেখ করেছে।

একটি কাস্টম প্যারামিটার বাইন্ডার তৈরি করে একটি কার্যকারিতা রয়েছে। এটি করার কোডটি কুৎসিত এবং সংশ্লেষযুক্ত, তবে আমি আমার ব্লগে একটি বিস্তারিত ব্যাখ্যা সহ কোড পোস্ট করেছি, এখানে একটি প্রকল্পে যুক্ত হতে প্রস্তুত:

ASP.NET ওয়েব API এ একাধিক সাধারণ POST মানগুলি পাস করা


1
সমস্ত কৃতিত্ব আপনার কাছে যায় :) এই প্রশ্নটি পপ আপ হওয়ার পরে আমার নিজের প্রয়োগটি শুরু করার সময় কেবলমাত্র ওয়েবএপিআইতে আপনার সিরিজগুলি পড়তে হবে।
কলিন ইয়ং

ধন্যবাদ! খুব উপকারী.
নর্মান্ড বেয়ার্ড

2
2019 হিসাবে এটি এখন।
সর্বাধিক

@ জন - এমন কোনও বেস সংস্করণ রয়েছে যা থেকে এই কার্যকারিতাটি সমর্থিত? আজ কোন সাফল্য নেই।
নিল মোস

26

যদি অ্যাট্রিবিউট রাউটিংটি ব্যবহার করা হয় তবে আপনি [FromUri] এবং [fromBody] বৈশিষ্ট্যগুলি ব্যবহার করতে পারেন।

উদাহরণ:

[HttpPost()]
[Route("api/products/{id:int}")]
public HttpResponseMessage AddProduct([FromUri()] int id,  [FromBody()] Product product)
{
  // Add product
}

1
আমি ঠিক একই পদ্ধতি ব্যবহার করেছি। আমাকে অ্যাকশনে দুটি মডেল পাস করতে হবে। আমি কোয়েরি স্ট্রিং এবং শরীর থেকে অন্যের মাধ্যমে কম বৈশিষ্ট্য সহ একটি পাস করেছি। এছাড়াও আপনার স্পষ্টতই [থেকে দেহ] বৈশিষ্ট্য নির্দিষ্ট করার দরকার নেই
সের্গেই জি।

1
আমি এই কাজটি করতে পারি না, আপনার কি আরও একটি সম্পূর্ণ উদাহরণ আছে?
ওয়ান

পোষ্ট পদ্ধতির মাধ্যমে ডেটা প্রেরণের এটি সঠিক উপায় বলে আমি মনে করি না তবে আপনি যদি পোস্টের মাধ্যমে 2 টি মডেল প্রেরণ করতে চান তবে আমি আর একটি সমাধান দেখতে পাচ্ছি না।
আলেকজান্ডার

এই উত্তরটি জাম!
লিওনার্দো ওয়াইল্ড

1
আমি এস্পনেটকোর ব্যবহার করছি এবং এর [FromRoute]পরিবর্তে আপনাকে ব্যবহার করতে হবে[FromUri]
ড্যানিয়েল

19

আমরা জেসন অবজেক্টটি এইচটিপিপস্ট পদ্ধতিতে পাস করেছি এবং এটি গতিশীল অবজেক্টে পার্স করেছি। এটা ঠিক কাজ করে। এটি নমুনা কোড:

webapi:

[HttpPost]
public string DoJson2(dynamic data)
{
   //whole:
   var c = JsonConvert.DeserializeObject<YourObjectTypeHere>(data.ToString()); 

   //or 
   var c1 = JsonConvert.DeserializeObject< ComplexObject1 >(data.c1.ToString());

   var c2 = JsonConvert.DeserializeObject< ComplexObject2 >(data.c2.ToString());

   string appName = data.AppName;
   int appInstanceID = data.AppInstanceID;
   string processGUID = data.ProcessGUID;
   int userID = data.UserID;
   string userName = data.UserName;
   var performer = JsonConvert.DeserializeObject< NextActivityPerformers >(data.NextActivityPerformers.ToString());

   ...
}

জটিল অবজেক্টের ধরণটি বস্তু, অ্যারে এবং অভিধান হতে পারে।

ajaxPost:
...
Content-Type: application/json,
data: {"AppName":"SamplePrice",
       "AppInstanceID":"100",
       "ProcessGUID":"072af8c3-482a-4b1c‌​-890b-685ce2fcc75d",
       "UserID":"20",
       "UserName":"Jack",
       "NextActivityPerformers":{
           "39‌​c71004-d822-4c15-9ff2-94ca1068d745":[{
                 "UserID":10,
                 "UserName":"Smith"
           }]
       }}
...

1
আমরা পোস্ট করতে এক জসন অবজেক্ট হিসাবে ফর্ম্যাট করা একাধিক পরামিতি রাখতে পারি এবং আমরা এটি সার্ভারের পাশেই একাধিক বস্তুর সাথে পার্স করব। এটি ভাবার অন্য উপায় হতে পারে।
বেস লে

@ একুস্টিকমার্টিন, এটি দুর্দান্ত কাজ করে, আপনার ব্যবহার করে গতিশীল প্রকারটি পার্স করতে হবে: জসনকনভার্ট.ডিজরিয়ালাইজ অবজেক্ট <ইয়োরঅজেক্টটাইপহেরা> (ডেটা.টাস্ট্রিং ()); একটি জটিল ডেটা বিষয়বস্তুর নমুনা এখানে, এটি অ্যারে এবং অভিধান অবজেক্ট অন্তর্ভুক্ত। { "APPNAME": "SamplePrice", "AppInstanceID": "100", "ProcessGUID": "072af8c3-482a-4b1c-890b-685ce2fcc75d", "আইডি": "20", "USERNAME": "জ্যাক", " NextActivityPerformers ": 39" 39c71004-d822-4c15-9ff2-94ca1068d745 ": [User" ইউজারআইডি ": 10," ইউজারনেম ":" স্মিথ "}]}}
বেস লে

1
ঠিক আছে নিশ্চিত, তবে কেবল একটি একক স্ট্রিং প্যারাম ব্যবহার করুন, কোনও ভিন্নতা নেই।
একুস্টিকমার্টিন

একক না মানে সহজ, জসন স্ট্রিং বিভিন্ন ধরণের অবজেক্টের সাথে একত্রিত হতে পারে। এটি মূল বিষয় এবং প্রশ্নগুলি সমাধান করার অন্য উপায়।
বেস লে

1
দুর্দান্ত সমাধান! ধন্যবাদ :)
কার্ল আর

10

একটি পোস্টে একাধিক পরামিতি পাস করতে একটি সাধারণ প্যারামিটার শ্রেণি ব্যবহার করা যেতে পারে:

public class AddCustomerArgs
{
    public string First { get; set; }
    public string Last { get; set; }
}

[HttpPost]
public IHttpActionResult AddCustomer(AddCustomerArgs args)
{
    //use args...
    return Ok();
}

নমুনা পোষ্ট অনুরোধটি কেমন হওয়া উচিত তা আপনি জানেন কী?
নাদিয়া সলোভিয়েভা

@ নাদিয়াসোলোয়েভা, এটি কোয়েরি স্ট্রিংয়ের চেয়ে বেশি, কারণ পোস্ট করা তথ্য শরীরে রয়েছে, কোয়েরি স্ট্রিং নয়। আমি পরীক্ষার প্রশ্নাগুলি তৈরি করতে পোস্টম্যান ব্যবহার করতে চাই এবং তারপরে আপনি দেখতে দেখতে ঠিক দেখতে দেখতে পারেন।
গ্রেগ গাম

কিছু মনে করবেন না, আমি এটি ইতিমধ্যে কীভাবে করব তা খুঁজে পেয়েছি। পোস্টের শিরোনাম: সামগ্রী-প্রকার: অ্যাপ্লিকেশন / জেসন; পোষ্ট বডি: {"প্রথম": "1", "শেষ": "1000"}
নাদিয়া সলোভিয়েভা

9

আপনি https://github.com/keith5000/ মাল্টিপোস্টপ্যারামিটারবাইন্ডিং থেকে মাল্টিপোস্টপ্যারামিটারবাইন্ডিং ক্লাসটি ব্যবহার করে একাধিক POST পরামিতিগুলিকে অনুমতি দিতে পারবেন

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

1) সোর্স ফোল্ডারে কোডটি ডাউনলোড করুন এবং এটি আপনার ওয়েব এপিআই প্রকল্পে বা সমাধানের কোনও অন্য প্রকল্পে যুক্ত করুন।

2) একাধিক POST পরামিতি সমর্থন করার প্রয়োজন এমন ক্রিয়া পদ্ধতিতে [মাল্টিপোস্টপ্যারামিটারস] বৈশিষ্ট্যটি ব্যবহার করুন ।

[MultiPostParameters]
public string DoSomething(CustomType param1, CustomType param2, string param3) { ... }

3) গ্লোবাল কনফিগারেশন.কনফিগার (ওয়েবএপিসিফিগ্রেজিগ্রিজিটার) এ কল করার আগে যেকোন জায়গায় অ্যাপ্লিকেশন_সার্ট পদ্ধতিতে এই লাইনটি Global.asax.cs এ যুক্ত করুন :

GlobalConfiguration.Configuration.ParameterBindingRules.Insert(0, MultiPostParameterBinding.CreateBindingForMarkedParameters);

৪) আপনার ক্লায়েন্টদের কোনও বস্তুর বৈশিষ্ট্য হিসাবে প্যারামিটারগুলি পাস করতে দিন। DoSomething(param1, param2, param3)পদ্ধতির জন্য JSON অবজেক্টের উদাহরণ :

{ param1:{ Text:"" }, param2:{ Text:"" }, param3:"" }

JQuery উদাহরণ:

$.ajax({
    data: JSON.stringify({ param1:{ Text:"" }, param2:{ Text:"" }, param3:"" }),
    url: '/MyService/DoSomething',
    contentType: "application/json", method: "POST", processData: false
})
.success(function (result) { ... });

পরিদর্শন লিংক আরো বিস্তারিত জানার জন্য।

দাবি অস্বীকার: আমি সরাসরি সংযুক্ত সংস্থার সাথে যুক্ত আছি।


7

চমৎকার প্রশ্ন এবং মন্তব্য - উত্তরগুলি থেকে এখানে শিখেছে :)

অতিরিক্ত উদাহরণ হিসাবে, নোট করুন যে আপনি বডি এবং রুটগুলিও মিশ্রণ করতে পারেন উদাহরণস্বরূপ

[RoutePrefix("api/test")]
public class MyProtectedController 
{
    [Authorize]
    [Route("id/{id}")]
    public IEnumerable<object> Post(String id, [FromBody] JObject data)
    {
        /*
          id                                      = "123"
          data.GetValue("username").ToString()    = "user1"
          data.GetValue("password").ToString()    = "pass1"
         */
    }
}

এভাবে কল করা:

POST /api/test/id/123 HTTP/1.1
Host: localhost
Accept: application/json
Content-Type: application/x-www-form-urlencoded
Authorization: Bearer x.y.z
Cache-Control: no-cache

username=user1&password=pass1


enter code here

আমি 2 জটিল ধরণের পরামিতি প্রেরণ করতে চাই। কীভাবে এটি করা যায় তার জন্য [এইচটিপিপিস্ট] সর্বজনীন স্ট্রিং আপলোড ফাইল (আপলোডমিডিয়া ফাইল মিডিয়া ফাইল, বাইট [] ডেটা) পছন্দ করুন Like
কায়া

2

এই ক্ষেত্রে আপনার রুট টেম্পলেটটি দেখতে কেমন?

আপনি এই url পোস্ট করেছেন:

/offers/40D5E19D-0CD5-4FBD-92F8-43FDBB475333/prices/

এটি কাজ করার জন্য আমি আপনার মধ্যে এর মতো একটি রাউটিং আশা করব WebApiConfig:

routeTemplate: {controller}/{offerId}/prices/

অন্যান্য অনুমানগুলি হ'ল: - আপনার নিয়ামককে ডাকা হয় OffersController। - আপনি অনুরোধের বডিটিতে যে JSON অবজেক্টটি প্রেরণ করছেন তা টাইপের OfferPriceParameters(কোনও উদ্ভূত ধরণের নয়) - আপনার নিয়ন্ত্রণকারীর সাথে অন্য কোনও পদ্ধতি নেই যা এইটির সাথে হস্তক্ষেপ করতে পারে (যদি আপনি তা করেন তবে তাদের মন্তব্য করার চেষ্টা করুন এবং দেখুন কী এরকম)

এবং ফিলিপ যেমন উল্লেখ করেছে এটি আপনার প্রশ্নগুলিতে সহায়তা করবে যদি আপনি '0% হারের স্বীকৃতি' হিসাবে কিছু উত্তর গ্রহণ করতে শুরু করেন তবে লোকেরা ভাবতে পারে যে তারা তাদের সময় নষ্ট করছে


আমার রুটটি "অফার / {অফারআইডি} / মূল্য"। এটি আমার নিয়ামকের একমাত্র পদ্ধতি।
নর্মান্ড বেডার্ড

2

আপনি যদি মডেলবাইন্ডিং পথে যেতে না চান তবে আপনি এটি করার জন্য ডিটিও ব্যবহার করতে পারেন। উদাহরণস্বরূপ, ডেটালেয়ারে একটি পোস্ট পদক্ষেপ তৈরি করুন যা একটি জটিল ধরণের গ্রহণ করে এবং বিজনেস লাইয়ার থেকে ডেটা প্রেরণ করে। আপনি এটি ইউআই-> এপিআই কল করার ক্ষেত্রে করতে পারেন।

এখানে নমুনা ডিটিও রয়েছে। একজন শিক্ষার্থীকে একটি শিক্ষক নিয়োগ এবং একাধিক কাগজপত্র / শিক্ষার্থীর অধীন নির্ধারণ করুন।

public class StudentCurriculumDTO
 {
     public StudentTeacherMapping StudentTeacherMapping { get; set; }
     public List<Paper> Paper { get; set; }
 }    
public class StudentTeacherMapping
 {
     public Guid StudentID { get; set; }
     public Guid TeacherId { get; set; }
 }

public class Paper
 {
     public Guid PaperID { get; set; }
     public string Status { get; set; }
 }

তারপরে ডেটালেয়ারে ক্রিয়াটি তৈরি করা যেতে পারে:

[HttpPost]
[ActionName("MyActionName")]
public async Task<IHttpActionResult> InternalName(StudentCurriculumDTO studentData)
  {
     //Do whatever.... insert the data if nothing else!
  }

বিজনেস লাইয়ার থেকে এটিকে কল করতে:

using (HttpResponseMessage response = await client.PostAsJsonAsync("myendpoint_MyActionName", dataof_StudentCurriculumDTO)
  {
     //Do whatever.... get response if nothing else!
  }

আমি যদি একসাথে একাধিক শিক্ষার্থীর ডেটা প্রেরণ করতে চাই তবে এটি এখনও কাজ করবে। MyActionনীচের মত পরিবর্তন করুন । [ফ্রমবিডি] লেখার দরকার নেই, ওয়েবএপিআই 2 ডিফল্টরূপে জটিল টাইপ [ফ্রমবডি] নেয়।

public async Task<IHttpActionResult> InternalName(List<StudentCurriculumDTO> studentData)

এবং তারপরে এটি কল করার সময়, একটি List<StudentCurriculumDTO>ডেটা পাস করুন।

using (HttpResponseMessage response = await client.PostAsJsonAsync("myendpoint_MyActionName", List<dataof_StudentCurriculumDTO>)

0

অনুরোধ পরামিতি

এখানে চিত্র বর্ণনা লিখুন

ওয়েব এপিআই কোড মত হতে

public class OrderItemDetailsViewModel
{
    public Order order { get; set; }
    public ItemDetails[] itemDetails { get; set; }
}

public IHttpActionResult Post(OrderItemDetailsViewModel orderInfo)
{
    Order ord = orderInfo.order;
    var ordDetails = orderInfo.itemDetails;
    return Ok();
}

0

আপনি স্ট্রিং হিসাবে ফর্মডাটা পেতে পারেন:

    protected NameValueCollection GetFormData()
    {
        string root = HttpContext.Current.Server.MapPath("~/App_Data");
        var provider = new MultipartFormDataStreamProvider(root);

        Request.Content.ReadAsMultipartAsync(provider);

        return provider.FormData;
    }

    [HttpPost]
    public void test() 
    {
        var formData = GetFormData();
        var userId = formData["userId"];

        // todo json stuff
    }

https://docs.microsoft.com/en-us/aspnet/web-api/overview/advanced/sending-html-form-data-part-2

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