วิธีส่งพารามิเตอร์หลายตัวไปยังวิธีควบคุม Web API

ในโพสต์ก่อนหน้านี้เราได้สำรวจการเชื่อมโยงพารามิเตอร์ใน Web API ในโพสต์นี้เราจะเรียนรู้วิธีส่งพารามิเตอร์หลายตัวไปยังวิธีการควบคุม Web API

Web API มีวิธีการดำเนินการที่จำเป็นสำหรับการดำเนินการ HTTP GET, POST, PUT และ DELETE โดยทั่วไปคุณจะส่งผ่านออบเจ็กต์เดียวเป็นพารามิเตอร์ไปยังวิธีการดำเนินการ PUT และ POST โปรดทราบว่า Web API ไม่สนับสนุนการส่งผ่านพารามิเตอร์ POST หลายตัวไปยังวิธีการควบคุม Web API ตามค่าเริ่มต้น แต่จะเกิดอะไรขึ้นถ้าคุณต้องการส่งคำขอ POST โดยส่งผ่านวัตถุหลายชิ้นเป็นพารามิเตอร์ไปยังวิธีควบคุม Web API?

ทำความเข้าใจกับปัญหา

Web API ไม่อนุญาตให้คุณส่งผ่านออบเจ็กต์ที่ซับซ้อนหลายรายการในลายเซ็นของเมธอดตัวควบคุม Web API คุณสามารถโพสต์ค่าเดียวไปยังเมธอดการดำเนินการ Web API ค่านี้สามารถเป็นวัตถุที่ซับซ้อนได้ เป็นไปได้ที่จะส่งผ่านค่าหลายค่าแม้ว่าในการดำเนินการ POST หรือ PUT โดยการแมปพารามิเตอร์หนึ่งกับเนื้อหาจริงและค่าที่เหลือผ่านสตริงการสืบค้น

คลาสคอนโทรลเลอร์ต่อไปนี้มีเมธอด POST ชื่อ Save ที่รับพารามิเตอร์หลายตัว

AuthorsController ระดับสาธารณะ: ApiController

    {

        [HttpPost]

        สาธารณะ HttpResponseMessage Save (int Id, string FirstName, string LastName, string Address)

        {

            // รหัสปกติ

            ส่งคืน Request.CreateResponse (HttpStatusCode.OK, "สำเร็จ ... ");

        }

   }

ตอนนี้สมมติว่าคุณพยายามเรียกใช้เมธอด Web API controller จาก JQuery ดังที่แสดงด้านล่าง

$ .ajax ({

 url: 'api / ผู้เขียน',

 ประเภท: 'POST',

 ข้อมูล: {Id: 1, FirstName: 'Joydip', LastName: 'Kanjilal', ที่อยู่: 'Hyderabad'},

 dataType: 'json',

 ความสำเร็จ: ฟังก์ชัน (ข้อมูล) {

การแจ้งเตือน (ข้อมูล);

}});

ขออภัยการเรียกนี้จะล้มเหลวเนื่องจากไม่สามารถดำเนินการตามคำขอนี้โดย Web API ในทำนองเดียวกันหากคุณมีเมธอด Web API controller ที่ยอมรับอ็อบเจ็กต์ที่ซับซ้อนหลายตัวคุณจะไม่สามารถเรียกใช้เมธอดนี้โดยตรงจากไคลเอนต์ในลักษณะตรงไปตรงมา

[HttpPost]

สาธารณะ HttpResponseMessage PostAuthor (ผู้เขียนผู้เขียนการพิสูจน์ตัวตนสตริงโทเค็น)

{

  // รหัสปกติ

  ส่งคืน Request.CreateResponse (HttpStatusCode.OK, "สำเร็จ ... ");

}

คุณสามารถส่งผ่านพารามิเตอร์ไปยังวิธีการควบคุม Web API โดยใช้แอตทริบิวต์ [FromBody] หรือ [FromUri] โปรดทราบว่าแอตทริบิวต์ [FromBody] สามารถใช้ได้เพียงครั้งเดียวในรายการพารามิเตอร์ของวิธีการ หากต้องการย้ำอีกครั้งคุณได้รับอนุญาตให้ส่งค่าเพียงค่าเดียว (แบบง่ายหรือแบบซับซ้อน) เป็นพารามิเตอร์ไปยังเมธอด Web API Controller เมื่อใช้แอตทริบิวต์ [FromBody] คุณสามารถส่งพารามิเตอร์จำนวนเท่าใดก็ได้โดยใช้แอตทริบิวต์ [FromUri] แต่นั่นไม่ใช่ทางออกที่ดีในกรณีของเรา

และตอนนี้วิธีแก้ปัญหา

ตอนนี้เราเข้าใจแล้วว่าปัญหาคืออะไรเมื่อส่งพารามิเตอร์ไปยังวิธีการควบคุม Web API เรามาดูวิธีแก้ปัญหาที่เป็นไปได้ วิธีหนึ่งในการบรรลุเป้าหมายนี้คือการส่งผ่านอ็อบเจกต์เชิงซ้อนเป็นแอตทริบิวต์ [FromBody] และพารามิเตอร์สตริงผ่าน Uri ดังที่แสดงในข้อมูลโค้ดด้านล่าง

$ .ajax ({

 url: 'api / authors? authenticationToken = abcxyz',

 ประเภท: 'POST',

  ข้อมูล: JSON.stringify (ผู้สร้าง),

 dataType: 'json',

 ความสำเร็จ: ฟังก์ชัน (ข้อมูล) {

   การแจ้งเตือน (ข้อมูล);

}});

คุณจะต้องแก้ไขวิธีการควบคุม Web API ของคุณเพื่อแยกวิเคราะห์สตริงการสืบค้นดังที่แสดงด้านล่าง

[HttpPost]

สาธารณะ HttpResponseMessage PostAuthor (ผู้เขียนผู้เขียน)

{

  ข้อมูล var = Request.RequestUri.ParseQueryString ();

  เกณฑ์สตริง = queryItems ["authenticationToken"];

  // รหัสปกติในการจัดเก็บข้อมูลในฐานข้อมูล

  ส่งคืน Request.CreateResponse (HttpStatusCode.OK, "สำเร็จ ... ");

}

แต่ถ้าคุณมีวัตถุที่ซับซ้อนหลายตัวที่จะส่งผ่านเป็นพารามิเตอร์ไปยังวิธีควบคุม Web API คุณสามารถสร้างออบเจ็กต์เดียวที่รวมพารามิเตอร์หลายตัว อ้างถึงคลาส AuthorRequest ที่ระบุด้านล่าง

AuthorRequest ระดับสาธารณะ

   {

      สาธารณะ Author Author {get; ชุด; }

      โทเค็นสตริงสาธารณะ {get; ชุด; }

   }

โดยพื้นฐานแล้วคุณสามารถรวมพารามิเตอร์หลายตัวในคลาสเดียวและใช้คลาสนี้เป็นพารามิเตอร์สำหรับวิธีควบคุม Web API ของคุณ

นี่คือวิธีการควบคุม Web API ที่อัปเดต

[HttpPost]

สาธารณะ HttpResponseMessage PostAuthor (คำขอ AuthorRequest)

  {

       var author = request.Author;

       var token = request.Token;

       // รหัสปกติในการจัดเก็บข้อมูลในฐานข้อมูล

       ส่งคืน Request.CreateResponse (HttpStatusCode.OK, "สำเร็จ ... ");

  }

คุณยังสามารถใช้ JObject เพื่อแยกวิเคราะห์ค่าพารามิเตอร์หลายค่าจากนอกวัตถุ

[HttpPost]

สาธารณะ HttpResponseMessage PostAuthor (JObject jsonData)

{

    ไดนามิก json = jsonData;

    JObject jauthor = json.Author;

    โทเค็นสตริง = json.Token;

    ผู้เขียน var = jauthor ToObject ();

    // รหัสปกติในการจัดเก็บข้อมูลในฐานข้อมูล

    ส่งคืน Request.CreateResponse (HttpStatusCode.OK, "สำเร็จ ... ");

}

อีกวิธีหนึ่งในการแก้ปัญหานี้คือการใช้ FormDataCollection อนึ่ง FormDataCollection เป็นคอลเลกชันคู่คีย์ / ค่าเหมือนกับ FormCollection ใน MVC

[HttpPost]

        สาธารณะ HttpResponseMessage PostAuthor (ฟอร์ม FormDataCollection)

        {

            var author = form.Get ("ผู้แต่ง");

            var token = form.Get ("โทเค็น");

            // รหัสปกติในการจัดเก็บข้อมูลในฐานข้อมูล

            ส่งคืน Request.CreateResponse (HttpStatusCode.OK, "สำเร็จ ... ");

        }

ด้วยความสามารถในการขยายเฟรมเวิร์ก Web API คุณยังสามารถสร้างตัวประสานพารามิเตอร์ที่กำหนดเองของคุณเองได้โดยการขยายคลาส HttpParameterBinding เพื่อให้การสนับสนุนสำหรับการรวมพารามิเตอร์หลายตัว

วิธีทำเพิ่มเติมใน ASP.NET และ ASP.NET Core:

  • วิธีใช้การแคชในหน่วยความจำใน ASP.NET Core
  • วิธีจัดการข้อผิดพลาดใน ASP.NET Web API
  • วิธีส่งพารามิเตอร์หลายตัวไปยังวิธีควบคุม Web API
  • วิธีบันทึกข้อมูลเมตาการร้องขอและการตอบกลับใน ASP.NET Web API
  • วิธีการทำงานกับ HttpModules ใน ASP.NET
  • การกำหนดเวอร์ชันขั้นสูงใน ASP.NET Core Web API
  • วิธีใช้การฉีดพึ่งพาใน ASP.NET Core
  • วิธีการทำงานกับเซสชันใน ASP.NET
  • วิธีทำงานกับ HTTPHandlers ใน ASP.NET
  • วิธีใช้ IHostedService ใน ASP.NET Core
  • วิธีการใช้บริการ WCF SOAP ใน ASP.NET Core
  • วิธีปรับปรุงประสิทธิภาพของแอปพลิเคชัน ASP.NET Core
  • วิธีใช้ ASP.NET Core Web API โดยใช้ RestSharp
  • วิธีการทำงานกับการเข้าสู่ระบบใน ASP.NET Core
  • วิธีใช้ MediatR ใน ASP.NET Core
  • วิธีการทำงานกับสถานะเซสชันใน ASP.NET Core
  • วิธีใช้ Nancy ใน ASP.NET Core
  • ทำความเข้าใจการผูกพารามิเตอร์ใน ASP.NET Web API
  • วิธีอัพโหลดไฟล์ใน ASP.NET Core MVC
  • วิธีใช้การจัดการข้อยกเว้นส่วนกลางใน ASP.NET Core Web API
  • วิธีใช้การตรวจสอบความสมบูรณ์ใน ASP.NET Core
  • แนวทางปฏิบัติที่ดีที่สุดในการแคชใน ASP.NET
  • วิธีใช้ Apache Kafka Messaging ใน. NET
  • วิธีเปิดใช้งาน CORS บน Web API ของคุณ
  • เมื่อใดควรใช้ WebClient กับ HttpClient เทียบกับ HttpWebRequest
  • วิธีการทำงานกับ Redis Cache ใน. NET
  • เมื่อใดควรใช้ Task.WaitAll กับ Task whenAll ใน. NET