74

Tôi muốn xử lý POST của Cuộc gọi API sau:

/v1/location/deviceid/appid

Thông số bổ sung đang đến từ Post-Body.

Tất cả điều này làm việc tốt cho tôi. Bây giờ tôi sẽ mở rộng mã của mình bằng cách cho phép "deviceid" và / hoặc "appid" và / hoặc BodyData là null:

/v1/location/deviceid
/v1/location/appid
/v1/location/

3 URL này phải được phản hồi theo cùng một lộ trình.

Cách tiếp cận đầu tiên của tôi (yêu cầu BodyData):

[Route("v1/location/{deviceid}/{appid}", Name = "AddNewLocation")]
public location_fromuser Post(string deviceid = null, string appid = null, [FromBody] location_fromuser BodyData)
{
    return repository.AddNewLocation(deviceid, appid, BodyData);
}

Điều này không hoạt động và trả về một lỗi biên dịch:

"Tham số tùy chọn phải ở cuối"

Thử tiếp theo:

[Route("v1/location/{deviceid}/{appid}", Name = "AddNewLocation")]
public location_fromuser Post([FromBody] location_fromuser BodyData, string deviceid = null, string appid = null)

Bây giờ chức năng của tôi AddNewLocation () luôn luôn nhận được BodyData=null- ngay cả khi cuộc gọi gửi Body.

Cuối cùng tôi đặt cả 3 Thông số tùy chọn:

[Route("v1/location/{deviceid}/{appid}", Name = "AddNewLocation")]
public location_fromuser Post(string deviceid = null, string appid = null, [FromBody location_fromuser BodyData = null)

Don Tiếtt làm việc:

Tham số tùy chọn BodyDatakhông được hỗ trợ bởi FormatterParameterBinding.

Tại sao tôi muốn một giải pháp với Thông số tùy chọn? Bộ điều khiển của tôi chỉ xử lý "thêm vị trí mới" thông qua POST.

Tôi muốn gửi dữ liệu sai ngoại lệ hoặc thông báo lỗi của riêng tôi. Ngay cả khi cuộc gọi bị thiếu giá trị. Trong trường hợp này, tôi muốn có thể quyết định ném ngoại lệ hoặc Đặt mặc định theo mã của mình.

|
147

Đối với một yêu cầu đến như /v1/location/1234, như bạn có thể tưởng tượng, API Web sẽ khó tự động tìm hiểu xem giá trị của phân khúc tương ứng với '1234' có liên quan đến appidvà không deviceid.

Tôi nghĩ bạn nên thay đổi mẫu tuyến đường của mình thành giống [Route("v1/location/{deviceOrAppid?}", Name = "AddNewLocation")]và sau đó phân tích cú pháp deiveOrAppidđể tìm ra loại id.

Ngoài ra, bạn cần đặt các phân đoạn trong mẫu tuyến đường tùy chọn nếu không các phân đoạn được coi là bắt buộc. Lưu ý ?nhân vật trong trường hợp này. Ví dụ: [Route("v1/location/{deviceOrAppid?}", Name = "AddNewLocation")]

|
  • 1

    ?bên trong mẫu tuyến đường là những gì tôi đang tìm kiếm. +1

    – Đỗ Ngọc Quang 19:19:53 19/10/2015
  • 1

    Tôi sẽ không nói rằng "deviceOrAppId" là sự lựa chọn thiết kế tốt nhất. Tôi nghĩ rằng API phải luôn luôn biết theo định nghĩa về những gì nó sẽ nhận được nếu có thể.

    – Vũ Việt Sơn 10:13:13 06/08/2016
  • 1

    Chỉ để biết thông tin - Khi chúng tôi đánh dấu một tham số là tùy chọn trong uri hành động bằng cách sử dụng ?ký tự thì chúng tôi phải cung cấp các giá trị mặc định cho các tham số trong chữ ký phương thức, ví dụ MyMethod (tên chuỗi = "someDefaultValue", int? Id = null).

    – Tạ Nhật Quốc 10:58:17 02/02/2017
  • 1

    @RBT bạn da MVP thật, tôi đã bị bối rối ở đó trong một phút. Cảm ơn bạn!

    – Dương Mỹ Vân 10:00:56 23/06/2017
  • 1

    Mát mẻ. Rất vui vì nó đã giúp bạn @sm Tôi đã chuyển đổi nhận xét của mình thành câu trả lời để hiển thị tốt hơn vì nó có vẻ hữu ích. Nó sẽ là một tiện ích bổ sung cho bài viết của Kiran.

    – Trịnh Xuân Bích 00:44:50 28/06/2017
40

Một thông tin khác: Nếu bạn muốn sử dụng ràng buộc lộ trình , hãy tưởng tượng rằng bạn muốn buộc tham số đó có kiểu dữ liệu int , thì bạn cần sử dụng cú pháp này:

[Route("v1/location/**{deviceOrAppid:int?}**", Name = "AddNewLocation")]

Cái gì? ký tự luôn được đặt trước ký tự } cuối cùng

Để biết thêm thông tin, hãy xem: Tham số URI tùy chọn và Giá trị mặc định

|
10

Chuyển đổi nhận xét của tôi thành câu trả lời để bổ sung cho câu trả lời của @Kiran Chala vì nó có vẻ hữu ích cho khán giả-

Khi chúng ta đánh dấu một tham số là tùy chọn trong hành động sử dụng ?ký tự thì chúng ta phải cung cấp các giá trị mặc định cho các tham số trong chữ ký phương thức như dưới đây:

MyMethod(string name = "someDefaultValue", int? Id = null)

|

Câu trả lời của bạn (> 20 ký tự)

Bằng cách click "Đăng trả lời", bạn đồng ý với Điều khoản dịch vụ, Chính sách bảo mật and Chính sách cookie của chúng tôi.

Không tìm thấy câu trả lời bạn tìm kiếm? Duyệt qua các câu hỏi được gắn thẻ hoặc hỏi câu hỏi của bạn.