Mô tả cách Web API liên kết các tham số và cách tùy chỉnh quy trình liên kết trong ASP.NET 4.x.

Bạn đang xem : tham số chuỗi truy vấn định tuyến api web

Tham số Ràng buộc trong ASP.NET Web API

Trong bài viết này

Cân nhắc sử dụng ASP.NET Core web API . Nó có những ưu điểm sau so với API Web ASP.NET 4.x:

  • ASP.NET Core là một khuôn khổ đa nền tảng, mã nguồn mở để xây dựng các ứng dụng web hiện đại, dựa trên đám mây trên Windows, macOS và Linux.
  • Bộ điều khiển ASP.NET Core MVC và bộ điều khiển API web là hợp nhất.
  • Được kiến ​​trúc để có thể kiểm tra.
  • Khả năng phát triển và chạy trên Windows, macOS và Linux.
  • Mã nguồn mở và tập trung vào cộng đồng.
  • Tích hợp các quy trình phát triển và khuôn khổ phía khách hàng hiện đại và quy trình làm việc.
  • Hệ thống cấu hình dựa trên môi trường, sẵn sàng cho đám mây.
  • Chèn phụ thuộc được tích hợp sẵn.
  • Đường dẫn yêu cầu HTTP mô-đun nhẹ, hiệu suất cao và hiệu suất cao.
  • Khả năng lưu trữ trên Kestrel , IIS , HTTP.sys , Nginx , Apache < / span> và Docker .
  • Lập phiên bản song song.
  • Công cụ giúp đơn giản hóa việc phát triển web hiện đại.

Bài viết này mô tả cách API Web liên kết các tham số và cách bạn có thể tùy chỉnh quy trình liên kết. Khi API Web gọi một phương thức trên bộ điều khiển, nó phải đặt giá trị cho các tham số, một quá trình được gọi là ràng buộc.

Theo mặc định, Web API sử dụng các quy tắc sau để liên kết các tham số:

  • Nếu tham số là loại “đơn giản”, Web API sẽ cố gắng lấy giá trị từ URI. Các kiểu đơn giản bao gồm .NET kiểu nguyên thủy ( int , bool , double , v.v.), cộng với < strong> TimeSpan , DateTime , Guid , decimal string , cùng với bất kỳ loại nào có loại trình chuyển đổi có thể chuyển đổi từ một chuỗi. (Tìm hiểu thêm về bộ chuyển đổi kiểu sau.)
  • Đối với các loại phức tạp, Web API cố gắng đọc giá trị từ nội dung thư bằng cách sử dụng media-type formatter .

Ví dụ: đây là phương pháp trình điều khiển API Web điển hình:

  HttpResponseMessage Put (int id, Product item) {...}
 

Tham số id là loại “đơn giản”, vì vậy Web API cố gắng lấy giá trị từ URI yêu cầu. Tham số item là một loại phức tạp, vì vậy Web API sử dụng một trình định dạng loại phương tiện để đọc giá trị từ phần thân yêu cầu.

Để nhận một giá trị từ URI, Web API sẽ tìm trong dữ liệu tuyến đường và chuỗi truy vấn URI. Dữ liệu tuyến đường được điền khi hệ thống định tuyến phân tích cú pháp URI và khớp nó với một tuyến đường. Để biết thêm thông tin, hãy xem Lựa chọn định tuyến và hành động .

Trong phần còn lại của bài viết này, tôi sẽ chỉ cho bạn cách bạn có thể tùy chỉnh quy trình liên kết mô hình. Tuy nhiên, đối với các loại phức tạp, hãy cân nhắc sử dụng các bộ định dạng kiểu phương tiện bất cứ khi nào có thể. Nguyên tắc chính của HTTP là tài nguyên được gửi trong nội dung thông báo, sử dụng thương lượng nội dung để chỉ định đại diện của tài nguyên. Bộ định dạng loại phương tiện được thiết kế cho chính xác mục đích này.

Sử dụng [FromUri]

Để buộc API Web đọc một kiểu phức tạp từ URI, hãy thêm thuộc tính [FromUri] vào tham số. Ví dụ sau xác định kiểu GeoPoint , cùng với phương thức bộ điều khiển lấy GeoPoint từ URI.

  lớp công khai GeoPoint
{
    công khai đôi Latitude {get; bộ; }
    công đôi Kinh độ {get; bộ; }
}

giá trị công cộngController: ApiController
{
    public HttpResponseMessage Get ([FromUri] Vị trí GeoPoint) {...}
}
 

Máy khách có thể đặt các giá trị Vĩ độ và Kinh độ trong chuỗi truy vấn và API Web sẽ sử dụng chúng để tạo GeoPoint . Ví dụ:

http: // localhost / api / values ​​/? Latitude = 47.678558 & amp; Longitude = -122.130989

Sử dụng [FromBody]

Để buộc API Web đọc một loại đơn giản từ nội dung yêu cầu, hãy thêm thuộc tính [FromBody] vào tham số:

  bài đăng HttpResponseMessage công khai (tên chuỗi [FromBody]) {...}
 

Trong ví dụ này, Web API sẽ sử dụng trình định dạng kiểu phương tiện để đọc giá trị của tên từ phần thân yêu cầu. Đây là một yêu cầu mẫu của khách hàng.

  ĐĂNG http: // localhost: 5076 / api / values ​​HTTP / 1.1
Tác nhân người dùng: Fiddler
Máy chủ: localhost: 5076
Loại nội dung: ứng dụng / json
Nội dung-Độ dài: 7

"Alice"
 

Khi một tham số có [FromBody], Web API sử dụng tiêu đề Loại-Nội dung để chọn một định dạng. Trong ví dụ này, loại nội dung là “application / json” và nội dung yêu cầu là một chuỗi JSON thô (không phải đối tượng JSON).

Tối đa một tham số được phép đọc từ nội dung thư. Vì vậy, điều này sẽ không hoạt động:

  // Chú ý: Sẽ không hoạt động!
public HttpResponseMessage Post ([FromBody] int id, [FromBody] string name) {...}
 

Lý do cho quy tắc này là nội dung yêu cầu có thể được lưu trữ trong một luồng không có bộ đệm mà chỉ có thể đọc một lần.

Công cụ chuyển đổi loại

Bạn có thể làm cho API Web coi một lớp là một loại đơn giản (để API Web sẽ cố gắng liên kết nó với URI) bằng cách tạo TypeConverter và cung cấp chuyển đổi chuỗi.

Đoạn mã sau đây hiển thị lớp GeoPoint đại diện cho một điểm địa lý, cùng với TypeConverter chuyển đổi từ các chuỗi thành các bản sao GeoPoint . Lớp GeoPoint được trang trí bằng thuộc tính [TypeConverter] để chỉ định trình chuyển đổi kiểu. (Ví dụ này được lấy cảm hứng từ bài đăng trên blog của Mike Stall Cách liên kết với các đối tượng tùy chỉnh trong chữ ký hành động trong MVC / WebAPI .)

  [TypeConverter (typeof (GeoPointConverter))]
GeoPoint lớp công cộng
{
    công khai đôi Latitude {get; bộ; }
    công đôi Kinh độ {get; bộ; }

    public static bool TryParse (chuỗi s, ra kết quả GeoPoint)
    {
        kết quả = null;

        var part = s.Split (',');
        if (part.Length! = 2)
        {
            trả về sai;
        }

        vĩ độ, kinh độ kép;
        if (double.TryParse (phần [0], ngoài vĩ độ) & amp; & amp;
            double.TryParse (phần [1], ngoài kinh độ))
        {
            result = new GeoPoint () {Longitude = kinh độ, Latitude = vĩ độ};
            trả về true;
        }
        trả về sai;
    }
}

lớp GeoPointConverter: TypeConverter
{
    ghi đè công khai bool CanConvertFrom (ITypeDescriptorContext context, Type sourceType)
    {
        if (sourceType == typeof (string))
        {
            trả về true;
        }
        return base.CanConvertFrom (context, sourceType);
    }

    ghi đè công khai đối tượng ConvertFrom (ngữ cảnh ITypeDescriptorContext,
        Văn hóa CultureInfo, giá trị vật thể)
    {
        if (giá trị là chuỗi)
        {
            Điểm địa lý;
            if (GeoPoint.TryParse ((string) value, out point))
            {
                điểm trở lại;
            }
        }
        return base.ConvertFrom (ngữ cảnh, văn hóa, giá trị);
    }
}
 

Giờ đây, Web API sẽ coi GeoPoint là một loại đơn giản, có nghĩa là nó sẽ cố gắng liên kết các tham số GeoPoint từ URI. Bạn không cần đưa [FromUri] vào tham số.

  public HttpResponseMessage Get (Vị trí GeoPoint) {...}
 

Máy khách có thể gọi phương thức với một URI như sau:

http: // localhost / api / values ​​/? location = 47.678558, -122.130989

Chất kết dính mô hình

Một tùy chọn linh hoạt hơn công cụ chuyển đổi loại là tạo một chất kết dính mô hình tùy chỉnh. Với trình kết dính mô hình, bạn có quyền truy cập vào những thứ như yêu cầu HTTP, mô tả hành động và các giá trị thô từ dữ liệu tuyến đường.

Để tạo trình kết dính mô hình, hãy triển khai giao diện IModelBinder . Giao diện này xác định một phương pháp duy nhất, BindModel :

  bool BindModel (HttpActionContext actionContext, ModelBindingContext bindingContext);
 

Đây là chất kết dính mô hình cho các đối tượng GeoPoint .

 public class GeoPointModelBinder: IModelBinder
{
    // Danh sách các vị trí đã biết.
    private static ConcurrentDictionary & lt; string, GeoPoint & gt; _locations
        = new ConcurrentDictionary & lt; string, GeoPoint & gt; (StringComparer.OrdinalIgnoreCase);

    tĩnh GeoPointModelBinder ()
    {
        _locations ["redmond"] = new GeoPoint () {Latitude = 47,67856, Kinh độ = -122.131};
        _locations ["paris"] = new GeoPoint () {Latitude = 48.856930, Kinh độ = 2.3412};
        _locations ["tokyo"] = new GeoPoint () {Latitude = 35.683208, Kinh độ = 139.80894};
    }

    public bool BindModel (HttpActionContext actionContext, ModelBindingContext bindingContext)
    {
        if (bindContext.ModelType! = typeof (GeoPoint))
        {
            trả về sai;
        }

        ValueProviderResult val = bindContext.ValueProvider.GetValue (
            ràng buộcContext.ModelName);
        if (val == null)
        {
            trả về sai;
        }

        string key = val.RawValue as string;
        if (key == null)
        {
            bindContext.ModelState.AddModelError (
                bindContext.ModelName, "Loại giá trị sai");
            trả về sai;
        }

        Kết quả GeoPoint;
        if (_locations.TryGetValue (key, out result) || GeoPoint.TryParse (key, out result))
        {
            ràng buộcContext.Model = kết quả;
            trả về true;
        }

        bindContext.ModelState.AddModelError (
            bindContext.ModelName, "Không thể chuyển đổi giá trị thành GeoPoint");
        trả về sai;
    }
}
 

Một trình kết dính mô hình nhận các giá trị đầu vào thô từ một nhà cung cấp giá trị. Thiết kế này phân tách hai chức năng riêng biệt:

  • Nhà cung cấp giá trị nhận yêu cầu HTTP và điền vào từ điển các cặp khóa-giá trị.
  • Trình kết dính mô hình sử dụng từ điển này để điền vào mô hình.

Nhà cung cấp giá trị mặc định trong API Web nhận các giá trị từ dữ liệu tuyến đường và chuỗi truy vấn. Ví dụ: nếu URI là http: // localhost / api / values ​​/ 1? Location = 48, -122 , thì nhà cung cấp giá trị sẽ tạo các cặp khóa-giá trị sau:

  • id = “1”
  • vị trí = “48, -122”

(Tôi giả sử mẫu tuyến đường mặc định, là “api / {controller} / {id}”.)

Tên của tham số để liên kết được lưu trữ trong thuộc tính ModelBindingContext.ModelName . Trình kết dính mô hình tìm kiếm một khóa có giá trị này trong từ điển. Nếu giá trị tồn tại và có thể được chuyển đổi thành GeoPoint , trình kết nối mô hình sẽ gán giá trị liên kết cho thuộc tính ModelBindingContext.Model .

Lưu ý rằng chất kết dính mô hình không giới hạn ở một chuyển đổi kiểu đơn giản. Trong ví dụ này, trước tiên, trình kết dính mô hình tìm kiếm trong một bảng các vị trí đã biết và nếu không thành công, trình kết nối sẽ sử dụng chuyển đổi loại.

Đặt chất kết dính mô hình

Có một số cách để thiết lập chất kết dính mô hình. Trước tiên, bạn có thể thêm thuộc tính [ModelBinder] vào tham số.

  public HttpResponseMessage Get ([ModelBinder (typeof (GeoPointModelBinder))] Vị trí GeoPoint)
 

Bạn cũng có thể thêm thuộc tính [ModelBinder] vào loại. Web API sẽ sử dụng chất kết dính mô hình được chỉ định cho tất cả các tham số của loại đó.

  [ModelBinder (typeof (GeoPointModelBinder))]
GeoPoint lớp công cộng
{
    // ...
}
 

Cuối cùng, bạn có thể thêm nhà cung cấp chất kết dính mô hình vào HttpConfiguration . Nhà cung cấp chất kết dính mô hình chỉ đơn giản là một lớp nhà máy tạo ra chất kết dính mô hình. Bạn có thể tạo nhà cung cấp bằng cách lấy từ lớp ModelBinderProvider . Tuy nhiên, nếu chất kết dính mô hình của bạn xử lý một loại duy nhất, sẽ dễ dàng hơn khi sử dụng SimpleModelBinderProvider tích hợp, được thiết kế cho mục đích này. Đoạn mã sau đây cho biết cách thực hiện việc này.

  public static class WebApiConfig
{
    public static void Register (cấu hình HttpConfiguration)
    {
        var nhà cung cấp = new SimpleModelBinderProvider (
            typeof (GeoPoint), GeoPointModelBinder ()) mới;
        config.Services.Insert (typeof (ModelBinderProvider), 0, nhà cung cấp);

        // ...
    }
}
 

Với nhà cung cấp liên kết mô hình, bạn vẫn cần thêm thuộc tính [ModelBinder] vào tham số để cho Web API biết rằng nó nên sử dụng trình kết nối mô hình chứ không phải trình định dạng loại phương tiện. Nhưng bây giờ bạn không cần chỉ định loại chất kết dính mô hình trong thuộc tính:

  public HttpResponseMessage Get ([ModelBinder] GeoPoint location) {...}
 

Nhà cung cấp giá trị

Tôi đã đề cập rằng trình kết dính mô hình nhận các giá trị từ nhà cung cấp giá trị. Để viết nhà cung cấp giá trị tùy chỉnh, hãy triển khai giao diện IValueProvider . Dưới đây là một ví dụ lấy các giá trị từ cookie trong yêu cầu:

  public class CookieValueProvider: IValueProvider
{
    Từ điển riêng & lt; string, string & gt; _giá trị;

    public CookieValueProvider (HttpActionContext actionContext)
    {
        if (actionContext == null)
        {
            ném ArgumentNullException mới ("actionContext");
        }

        _values ​​= new Dictionary & lt; string, string & gt; (StringComparer.OrdinalIgnoreCase);
        foreach (var cookie trong actionContext.Request.Headers.GetCookies ())
        {
            foreach (Trạng thái CookieState trong cookie.Cookies)
            {
                _values ​​[state.Name] = state.Value;
            }
        }
    }

    public bool ContainsPrefix (tiền tố chuỗi)
    {
        return _values.Keys.Contains (tiền tố);
    }

    public ValueProviderResult GetValue (khóa chuỗi)
    {
        Chuỗi giá trị;
        if (_values.TryGetValue (key, out value))
        {
            trả về ValueProviderResult mới (giá trị, giá trị, CultureInfo.InvariantCulture);
        }
        trả về null;
    }
}
 

Bạn cũng cần tạo nhà máy cung cấp giá trị bằng cách lấy từ lớp ValueProviderFactory .

  public class CookieValueProviderFactory: ValueProviderFactory
{
    ghi đè công khai IValueProvider GetValueProvider (HttpActionContext actionContext)
    {
        trả về CookieValueProvider mới (actionContext);
    }
}
 

Thêm nhà máy cung cấp giá trị vào HttpConfiguration như sau.

  public static void Register (HttpConfiguration config)
{
    config.Services.Add (typeof (ValueProviderFactory), CookieValueProviderFactory mới ());

    // ...
}
 

Web API tổng hợp tất cả các trình cung cấp giá trị, vì vậy khi trình kết nối mô hình gọi ValueProvider.GetValue , trình kết nối mô hình sẽ nhận giá trị từ trình cung cấp giá trị đầu tiên có thể tạo ra nó.

Ngoài ra, bạn có thể đặt nhà máy cung cấp giá trị ở cấp thông số bằng cách sử dụng thuộc tính ValueProvider như sau:

  public HttpResponseMessage Get (
    [ValueProvider (typeof (CookieValueProviderFactory))] Vị trí GeoPoint)
 

Điều này yêu cầu API Web sử dụng liên kết mô hình với nhà máy cung cấp giá trị được chỉ định và không sử dụng bất kỳ nhà cung cấp giá trị đã đăng ký nào khác.

HttpParameterBinding

Chất kết dính mô hình là một ví dụ cụ thể của một cơ chế tổng quát hơn. Nếu bạn nhìn vào thuộc tính [ModelBinder] , bạn sẽ thấy rằng nó bắt nguồn từ lớp ParameterBindingAttribute trừu tượng. Lớp này xác định một phương thức duy nhất, GetBinding , trả về đối tượng HttpParameterBinding :

  public abstract class Tham sốBindingAttribute: Thuộc tính
{
    công khai trừu tượng HttpParameterBinding GetBinding (tham số HttpParameterDescriptor);
}
 

HttpParameterBinding chịu trách nhiệm liên kết một tham số với một giá trị. Trong trường hợp [ModelBinder] , thuộc tính trả về triển khai HttpParameterBinding sử dụng IModelBinder để thực hiện liên kết thực tế. Bạn cũng có thể triển khai HttpParameterBinding của riêng mình.

Ví dụ: giả sử bạn muốn nhận ETags từ các tiêu đề if-match if-none-match trong yêu cầu. Chúng ta sẽ bắt đầu bằng cách xác định một lớp để đại diện cho ETags.

  ETag lớp công khai
{
    chuỗi công khai Tag {get; bộ; }
}
 

Chúng tôi cũng sẽ xác định một bảng liệt kê để cho biết liệu nên lấy ETag từ tiêu đề if-match hay tiêu đề if-none-match .

  công khai ETagMatch
{
    IfMatch,
    IfNoneMatch
}
 

Đây là HttpParameterBinding lấy ETag từ tiêu đề mong muốn và liên kết nó với một tham số thuộc loại ETag:

 lớp công khai ETagParameterBinding: HttpParameterBinding
{
    ETagMatch _match;

    công khai ETagParameterBinding (tham số HttpParameterDescriptor, đối sánh ETagMatch)
        : base (tham số)
    {
        _match = trận đấu;
    }

    ghi đè công khai Task ExecuteBindingAsync (Siêu dữ liệu ModelMetadataProvider,
        HttpActionContext actionContext, CancelToken hủy bỏToken)
    {
        EntityTagHeaderValue etagHeader = null;
        chuyển đổi (_match)
        {
            trường hợp ETagMatch.IfNoneMatch:
                etagHeader = actionContext.Request.Headers.IfNoneMatch.FirstOrDefault ();
                phá vỡ;

            trường hợp ETagMatch.IfMatch:
                etagHeader = actionContext.Request.Headers.IfMatch.FirstOrDefault ();
                phá vỡ;
        }

        ETag etag = null;
        if (etagHeader! = null)
        {
            etag = new ETag {Tag = etagHeader.Tag};
        }
        actionContext.ActionArguments [Descriptor.ParameterName] = etag;

        var tsc = new TaskCompletionSource & lt; object & gt; ();
        tsc.SetResult (null);
        trả về tsc.Task;
    }
}
 

Phương thức ExecuteBindingAsync thực hiện liên kết. Trong phương pháp này, hãy thêm giá trị tham số liên kết vào từ điển ActionArgument trong HttpActionContext .

Lưu ý

Nếu phương thức ExecuteBindingAsync của bạn đọc phần nội dung của thông báo yêu cầu, hãy ghi đè thuộc tính WillReadBody để trả về true. Nội dung yêu cầu có thể là một luồng không có bộ đệm chỉ có thể được đọc một lần, vì vậy Web API thực thi quy tắc rằng nhiều nhất một liên kết có thể đọc nội dung thư.

Để áp dụng HttpParameterBinding tùy chỉnh, bạn có thể xác định thuộc tính bắt nguồn từ ParameterBindingAttribute . Đối với ETagParameterBinding , chúng tôi sẽ xác định hai thuộc tính, một cho các tiêu đề if-match và một cho các tiêu đề if-none-match . Cả hai đều bắt nguồn từ một lớp cơ sở trừu tượng.

  public abstract class ETagMatchAttribute: ParameterBindingAttribute
{
    ETagMatch _match riêng tư;

    public ETagMatchAttribute (đối sánh ETagMatch)
    {
        _match = trận đấu;
    }

    ghi đè công khai HttpParameterBinding GetBinding (tham số HttpParameterDescriptor)
    {
        if (tham số.ParameterType == typeof (ETag))
        {
            trả về ETagParameterBinding mới (tham số, _match);
        }
        tham số trả về.BindAsError ("Kiểu tham số sai");
    }
}

lớp công khai IfMatchAttribute: ETagMatchAttribute
{
    public IfMatchAttribute ()
        : base (ETagMatch.IfMatch)
    {
    }
}

lớp công khai IfNoneMatchAttribute: ETagMatchAttribute
{
    public IfNoneMatchAttribute ()
        : base (ETagMatch.IfNoneMatch)
    {
    }
}
 

Đây là phương thức bộ điều khiển sử dụng thuộc tính [IfNoneMatch] .

  public HttpResponseMessage Get ([IfNoneMatch] ETag etag) {...}
 

Bên cạnh ParameterBindingAttribute , còn có một hook khác để thêm HttpParameterBinding tùy chỉnh. Trên đối tượng HttpConfiguration , thuộc tính ParameterBindingRules là tập hợp các hàm ẩn danh thuộc loại ( HttpParameterDescriptor – & gt; HttpParameterBinding ). Ví dụ: bạn có thể thêm quy tắc mà bất kỳ tham số ETag nào trên phương thức GET đều sử dụng ETagParameterBinding với if-none-match :

  config.ParameterBindingRules.Add (p = & gt;
{
    if (p.ParameterType == typeof (ETag) & amp; & amp;
        p.ActionDescriptor.SupportedHttpMethods.Contains (HttpMethod.Get))
    {
        trả về ETagParameterBinding mới (p, ETagMatch.IfNoneMatch);
    }
    khác
    {
        trả về null;
    }
});
 

Hàm phải trả về null cho các tham số không thể áp dụng liên kết.

IActionValueBinder

Toàn bộ quá trình liên kết tham số được kiểm soát bởi một dịch vụ có thể cắm được, IActionValueBinder . Việc triển khai mặc định của IActionValueBinder thực hiện những việc sau:

  1. Tìm kiếm ParameterBindingAttribute trên tham số. Điều này bao gồm [FromBody] , [FromUri] [ModelBinder] hoặc các thuộc tính tùy chỉnh.

  2. Nếu không, hãy tìm trong HttpConfiguration.ParameterBindingRules để biết hàm trả về HttpParameterBinding không phải null.

  3. Nếu không, hãy sử dụng các quy tắc mặc định mà tôi đã mô tả trước đây.

    • Nếu loại tham số là “đơn giản” hoặc có bộ chuyển đổi kiểu, hãy liên kết từ URI. Điều này tương đương với việc đặt thuộc tính [FromUri] vào tham số.
    • Nếu không, hãy thử đọc tham số từ nội dung thư. Điều này tương đương với việc đặt [FromBody] vào tham số.

Nếu muốn, bạn có thể thay thế toàn bộ dịch vụ IActionValueBinder bằng một triển khai tùy chỉnh.

Tài nguyên Bổ sung

Mẫu ràng buộc thông số tùy chỉnh

Mike Stall đã viết một loạt bài đăng blog hay về ràng buộc tham số API Web:


Xem thêm những thông tin liên quan đến chủ đề tham số chuỗi truy vấn định tuyến api web

Thủ Thuật Chặn Trang Web Tự Động Gửi Thông Báo Trên Trình Duyệt Google Chrome

  • Tác giả: Anh Tu
  • Ngày đăng: 2022-07-13
  • Đánh giá: 4 ⭐ ( 8373 lượt đánh giá )
  • Khớp với kết quả tìm kiếm: Cảm ơn anh em đã đến và xem video “Thủ Thuật Chặn Trang Web Tự Động Gửi Thông Báo Trên Trình Duyệt Google Chrome” . Chắc chắn anh sử dụng máy tính đặc biệt là sử dụng trình duyệt để vào các trang web đọc tin tức hay xem phim thì sẽ bị các trang web đó gửi thông báo. Chính điều này gây ra sự phiền toái cũng như mất thời gian của anh em. Chính vì thế hôm nay mình hướng dẫn cho anh em cách thiết lập chặn gửi thông báo trên trang web. Giúp anh em có thể trải nghiệm duyệt web không bị phiền hà .

Truy xuất các tham số chuỗi truy vấn GET bằng Express

  • Tác giả: tech-wiki.online
  • Đánh giá: 4 ⭐ ( 3365 lượt đánh giá )
  • Khớp với kết quả tìm kiếm:

Cách truy cập URI và Tham số truy vấn bên trong API Kumologica

  • Tác giả: helpex.vn
  • Đánh giá: 4 ⭐ ( 6312 lượt đánh giá )
  • Khớp với kết quả tìm kiếm: Là một nhà phát triển API, bạn sẽ thiết kế và phát triển các API REST nhằm mục đích thực hiện một số hành động đối với một tài nguyên cụ thể, truy xuất hoặc lọc tập hợp các tài nguyên. Những…

8 phương pháp hay nhất để thiết kế REST API

  • Tác giả: funix.edu.vn
  • Đánh giá: 4 ⭐ ( 4529 lượt đánh giá )
  • Khớp với kết quả tìm kiếm: Thiết kế REST API đúng cách để khi sử dụng không gặp phải bất kỳ sự cố nào là điều mà rất nhiều lập trình viên quan tâm. Hãy cùng FUNiX tìm hiểu 8 phương pháp hay nhất để thiết kế REST API.

Lập trình ESP32 với Arduino AsyncWebServer

  • Tác giả: vidieukhien.xyz
  • Đánh giá: 5 ⭐ ( 8290 lượt đánh giá )
  • Khớp với kết quả tìm kiếm:

Truy vấn Tham số (Parameter Query) trong Access 2016

  • Tác giả: quantrimang.com
  • Đánh giá: 4 ⭐ ( 8369 lượt đánh giá )
  • Khớp với kết quả tìm kiếm: Truy vấn tham số là một trong những truy vấn đơn giản và hữu ích nhất mà bạn có thể tạo trong Access. Chính vì lý do đó mà ta có thể dễ dàng cập nhật để lấy kết quả ngay từ các từ khóa tìm kiếm.

Tạo truy vấn tham số (Power Query)

  • Tác giả: support.microsoft.com
  • Đánh giá: 5 ⭐ ( 9691 lượt đánh giá )
  • Khớp với kết quả tìm kiếm: Tạo tham số viết tắt cho giá trị mà bạn có thể thường xuyên thay đổi, chẳng hạn như máy chủ, cơ sở dữ liệu, thư mục, tên tệp, giá trị vị trí hoặc bộ lọc.

Xem thêm các bài viết khác thuộc chuyên mục: WordPress

See also  Các quyền NTFS được đề xuất cho thư mục Home - Windows 2016 - phương pháp hay nhất về quyền đối với thư mục chính