-1

Xây dựng JSON Web APIs với ASP.NET MVC 4 và ASP.NET Web API

Dưới đây là một số trong những thứ đó là được cải thiện trong MVC 4. CÁC TÍNH NĂNG MỚI TRONG MVC 4

ASP.NET Web API
Làm mới và hiện đại hóa các mẫu dự án mặc định
Mẫu dự án trên điện thoại di động
Nhiều tính năng mới để hỗ trợ các ứng dụng di động
Tùy chỉnh sinh code
Tăng cường hỗ trợ cho các phương pháp bất đồng bộ
Đọc danh sách đầy đủ tính năng trong các ghi chú phát hành

Bạn có thể đã nghe tôi nói về LEGO trong quá khứ, và cho thấy làm thế nào bạn có thể làm việc với nhau tốt hơn với NuGet.Dưới đây là một sơ đồ tôi đã thể hiện một vài lần.

Tất cả các bộ phận của ASP.NET, tất cả các hệ thống con đều là một phần của cộng đồng ASP.NET lớn hơn

Trong thực tế, vì lợi ích của việc tập trung vào ASP.NET, "WCF Web API" bây giờ là ASP.NET Web API và nó đi kèm với ASP.NET MVC bây giờ. Bạn có thể sử dụng Web API trong ASP.NET Web Forms không có vấn đề . TẠI SAO BẠN MUỐN CÓ MỘT API WEB?

Nếu ứng dụng của bạn - mô hình dữ liệu kinh doanh của bạn - có một API, sau đó đột nhiên API Web của bạn được mở ra cho các ứng dụng bản địa, các ứng dụng iPhone, Windows 8 ứng dụng, bất cứ điều gì, ứng dụng. Đó là dịch vụ Web.

Tôi có thể sử dụng XML hoặc JSON hay cái gì khác với API của tôi. JSON tốt cho các ứng dụng điện thoại di động với kết nối chậm, ví dụ. Bạn có thể gọi một API từ jQuery và sử dụng tốt hơn máy của khách hàng và trình duyệt. Bạn có thể làm cho Gmail là kiểu đơn hay lai; nó thuộc vào bạn. LÀM THẾ NÀO TẤT CẢ đặt trong ASP.NET

Ý tưởng đằng sau Một ASP.NET là tôi muốn folks để có thể làm cho các ứng dụng mà có các thành phần thời gian thực với SignalR, sạch sẽ, các API đơn giản với Web API, tất cả trong một trang với KnockoutJS, trang với MVC, Web Forms hay Web Pages, cũng như các hệ thống hiện có như ASP.NET OData, ASMX, và nhiều hơn nữa. Tôi muốn dự án mã nguồn mở như JSON.NET, KnockoutJS, SignalR, Backbone, MongoDB , Scaffolding, NHibernate, Ninject (và hơn nữa) cho tất cả các trò chơi trong cùng một sandbox ASP.NET LEGO. Chúng tôi sẽ đặt tất cả các phần phụ trên NuGet và họ sẽ sống cùng với các thành phần công cộng và bạn sẽ có thể xây dựng các ứng dụng ASP.NET bắt đầu từ một số mẫu cơ sở và đó là phần bạn muốn. Chúng tôi bắt đầu từ ở đó. Tôi muốn folks để sử dụng các phần mà họ muốn, và trao đổi trên các phần mà họ không có. Tất cả mọi thứ sẽ làm việc cùng nhau. Tôi đã luôn nói rằng tôi muốn mở nguồn tất cả mọi thứ chúng ta có thể nhanh như Microsoft có thể mất nó, và tôi sẽ tiếp tục đẩy mạnh nếu nó giết tôi ông chủ của tôi. NOTTWITTER

Lemme làm một ứng dụng NotTwitter thật nhanh chóng. Dưới đây là một mô hình nhanh:

public class NotATweet
{
    public int ID { get; set; }
    public string Username { get; set; }
    public string Text { get; set; }
    public DateTime Published { get; set; }
}

Tôi sẽ sử dụng scaffolding mặc định để có được giao diện người dùng, nhưng sau đó tôi sẽ cài đặt thêm gói NuGet MvcScaffolding và scaffolding bằng cách sử dụng một mô hình Repository.

PS> Scaffold -ModelType NotATweet -DbContext NotTwitterContext -Scaffolder Repository -Force

Sau đó, tôi sẽ scaffolding một controller sử dụng Repo này (bạn có thể làm điều này từ giao diện người dùng hoặc từ gói NuGet console):

Scaffold -Controller NotATwitter -ModelType NotATweet -DbContext NotTwitterContext -Scaffolder MvcScaffolding.Controller -Repository

Và đây là kết quả Scaffolded UI.

Nó Không Twitter

Các controller cho trang web của tôi là chuẩn. Bây giờ tôi sẽ thêm một controller thông qua Add để tạo một API cho ứng dụng NotTwitter tôi.

Tôi sẽ thay đổi tuyến đường của tôi để thực hiện / api vào controller API ứng dụng của tôi;

routes.MapHttpRoute (
    Tên: "DefaultApi" ,
    routeTemplate: "api / {id}" ,
    mặc định: mới {controller = "NotATwitterAPI" , id = RouteParameter.Optional}
);

Dưới đây là mã controller Web API của tôi. Một số điều cần chú ý. Tôi đang nói chuyện với các IRepository mà controller sử dụng trang. Tôi trả về HTTP Status Codes thích hợp cho mỗi câu trả lời.Xem như thế nào sau khi Tạo (nơi tôi POST một đại diện của JSON NotATweet) mà tôi trả về HttpStatusCode.Created 201 và thiết lập vị trí của tiêu đề để đưa vào vị trí của các nguồn tài nguyên mới?

public class NotATwitterAPIController : ApiController
{
    private readonly INotATweetRepository notatweetRepository;
    public NotATwitterAPIController(INotATweetRepository notatweetRepository)
    {
        this.notatweetRepository = notatweetRepository;
    }
    // GET /api/notatwitterapi
    public IQueryable<NotATweet> Get()
    {
        return notatweetRepository.All;
    }
    // GET /api/notatwitterapi/5
    public NotATweet Get(int id)
    {
        var notatweet = notatweetRepository.Find(id);
        if (notatweet == null)
            throw new HttpResponseException(HttpStatusCode.NotFound);
        return notatweet;
    }
    // POST /api/notatwitterapi
    public HttpResponseMessage<NotATweet> Post(NotATweet value)
    {
        if (ModelState.IsValid)
        {
            notatweetRepository.InsertOrUpdate(value);
            notatweetRepository.Save();
            //Created!
            var response = new HttpResponseMessage<NotATweet>(value, HttpStatusCode.Created);
            //Let them know where the new NotATweet is
            string uri = Url.Route(null, new { id = value.ID });
            response.Headers.Location = new Uri(Request.RequestUri, uri);
            return response;
        }
        throw new HttpResponseException(HttpStatusCode.BadRequest);
    }
    // PUT /api/notatwitterapi/5
    public HttpResponseMessage Put(int id, NotATweet value)
    {
        if (ModelState.IsValid)
        {
            notatweetRepository.InsertOrUpdate(value);
            notatweetRepository.Save();
            return new HttpResponseMessage(HttpStatusCode.NoContent);
        }
        throw new HttpResponseException(HttpStatusCode.BadRequest);
    }
    // DELETE /api/notatwitterapi/5
    public void Delete(int id)
    {
        var notatweet = notatweetRepository.Find(id);
        if (notatweet == null)
            throw new HttpResponseException(HttpStatusCode.NotFound);
        notatweetRepository.Delete(id);
    }
}

Sau đó, tôi sẽ nhấn / api với Fiddler . Chú ý JSON popped ra đầu kia?

ASP.NET Web API trong Fiddler

Tôi sẽ thay đổi tiêu đề để chấp nhậnAccept: application / xml và xml bật ra. Bạn có thể cắm riêng của bạn và làm cho Web API cho ra iCal hoặc bất cứ điều gì bạn muốn. Bạn có thể làm cho định dạng media hoặc thậm chí cắm vào cái khác cho mặc định. Ví dụ, đây là một Formatter JSON.NET cho Web API .

GET trả về một 200 và một danh sách XML của NotTweets

Bây giờ chúng ta có thể làm cho NotTweets? Bạn có thể sử dụng các công cụ như JSON Formatter để thủ JSON để thử nghiệm . Bây giờ tôi sẽ POST một JSON NotTweet đăng:

POST sẽ trở lại một HTTP 201

Chú ý rằng kết quả là một HTTP 201. Nếu tôi sau đó GET / api, tôi có thể nhìn thấy nó ở đó:

Standard / api GET

Tôi cũng có thể ảnh hưởng đến mọi thứ với các URL và truy vấn như này GET /api?$orderby=Username HTTP/1.1 vì vậy tôi có thể truy vấn mà không phải vào URL kiểu OData nếu tôi không muốn.

Web API với một chuỗi truy vấn orderby

Như tôi đã nói, tôi có thể sử dụng XML hoặc JSON hay cái gì khác với API của tôi. JSON là tốt cho các ứng dụng điện thoại di động với kết nối chậm, ví dụ. Bạn có thể gọi API này từ jQuery và sử dụng tốt hơn máy của khách hàng và trình duyệt.

Ngoài ra còn có các "kêu gọi" phụ của điều này, đó là HttpClient. Bạn có thể gọi đến các API khác như Twitter và xác thực bằng OAuth . Những người khác có thể gọi API của bạn từ phía khách hàng sử dụng jQuery và Javascript hoặc từ phía máy chủ sử dụng HttpClient .

Web API có nhiều khả năng hơn so với ví dụ này. Hãy dành một chút thời gian trên blog của Henrik (ông đã giúp phát minh ra HTTP!Về Hanselminutes Podcast )

Chúng tôi đã có một phần mới trên các trang web ASP.NET http://asp.net/web-api với rất nhiều thông tin.Dưới đây là một số tài nguyên để dễ dàng thêm một API cho ứng dụng của bạn. Bạn thậm chí có thể tự chủ Web API mà không IIS trong một dịch vụ hay ứng dụng khác!

Nguồn: http://d.jou.vn


All Rights Reserved

Viblo
Let's register a Viblo Account to get more interesting posts.