>  기사  >  백엔드 개발  >  ASP.NET WEB API 적용 시나리오의 첫 번째 예

ASP.NET WEB API 적용 시나리오의 첫 번째 예

PHPz
PHPz원래의
2017-04-04 15:52:233129검색

이전 블로그에서 HTTP 프로토콜과 RestFul API의 관계에 대해 간략하게 소개했으며, 이러한 지식을 바탕으로 오늘은 몇 가지 기본적인 HTTP 프로토콜 지식을 소개하겠습니다. 함께 WEB API의 적용 가능한 시나리오에 대해 논의한 후 첫 번째 WEB API 인터페이스를 작성하고 이를 간단하게 호출하는 방법을 보여줍니다.

많은 사람들이 혼란스러워합니다. WCF가 있는데 왜 WEB API가 필요한가요? WEB API가 WCF를 대체하나요?

제 생각에는 WCF는 RPC 구현 모음을 제공합니다. WCF의 디자인은 SOA 시나리오와 다양한 RPC 문제를 더 많이 고려합니다. 많은 사람들은 RestFul API도 일종의 RPC이며 WCF에도 RestFul 구현이 있다고 말합니다. 많은 자료에서 RPC와 RestFul 사이에는 스타일 개념에 약간의 차이가 있습니다. 사실 둘 사이의 차이점은 더 주관적이며 WCF에서는 주로 학문적인 문제에 중점을 둡니다. , WS-* 시리즈 프로토콜뿐만 아니라 매우 높은 성능의 전용 통신 프로토콜을 제공하는 좀 더 간결한 프로토콜을 포함하여 많은 지원 프로토콜이 있으며 WCF도 서비스 검색과 같은 기능을 제공하는 것이 더 적합하다고 생각합니다. 내부 시스템의 경우 커뮤니티에서 선택할 수 있는 다른 RPC 솔루션도 있습니다. 예를 들어 gRPC, Avor 및 thrift는 모두 WCF와 동일한 위치에 있는 제품이지만 WEB API는 다음에 중점을 둡니다. HTTP RestFul 스타일을 기반으로 어떤 언어, 어떤 터미널이든 쉽게 연결될 수 있으며, 개발, 디버깅, 로드 밸런싱, 컨텐츠 배포를 위해 매우 성숙한 다양한 HTTP 인프라 및 솔루션을 활용할 수 있습니다. 따라서 WEB API는 RestFul 스타일 개방형 API의 신속한 개발에 중점을 둔 HTTP용 개발 프레임워크입니다. 현재로서는 WCF를 대체할 수 없는 것으로 보입니다. 각각의 적합한 시나리오가 있으므로 WEB API는 WCF를 대체할 수 없습니다.

이제 첫 번째 WEB API 인터페이스 세트를 개발해 보겠습니다! VS2012 이상 버전에는 미리 만들어진 WEB API 생성 템플릿이 있으므로 이를 따라 생성하면 프로젝트에 MVC 및 WEB API 프로젝트가 있게 되며, WEB API는 MVC에 의존하므로 별도로 생성할 수 없습니다. WEB API와 MVC 모두 유사한 라우팅 메커니즘을 사용하므로 기본 경로에서 WEB API는


/api/{controller}/{id}

를 경로로 사용하고 / api/section을 추가합니다. MVC와 웹 API를 구별합니다.

다음으로 ApiController에서 상속되는 PersonController라는 WEB API 컨트롤러를 추가합니다. 이 컨트롤러를 생성할 때 리소스를 정의합니다. Person, PersonController의 모든 작업은 모두 Person 리소스를 중심으로 진행됩니다. 다음으로 추가, 삭제, 수정 및 확인 작업 집합을 정의하기 시작합니다.

Web API에서 기본 라우팅은 규칙을 채택합니다. 라우팅은 조건자를 기반으로 하며 메서드 이름의 접두사는 메서드를 호출하는 데 사용되는 HTTP 조건자입니다. 코드 예는 다음과 같습니다.


/// <summary>

    /// Person 为资源,对Person进行的一组操作    /// </summary>

    public class PersonController : ApiController

    {        private static List<Person> _personLst = new List<Person>();       

        /// <summary>

        /// 获取一个Person        /// </summary>

        /// <param name="id">Person的ID</param>

        /// <returns>Person</returns>

        public Person GetPerson(long id)

        {            return _personLst.Find(x => x.Id == id);

        } 

        /// <summary>

        /// 添加一个Person        /// </summary>

        /// <param name="person">Person</param>

        public void PostAddPerson(Person person)

        {

            _personLst.Add(person);

        } 

        /// <summary>

        /// 修改一个        /// </summary>

        /// <param name="id">Person Id</param>

        /// <param name="person">新</param>

        public void PutModifyPerson(long id, Person person)

        {            var p = _personLst.Find(x => x.Id == id);

            p.Age = person.Age;

            p.Name = person.Name;

            p.Sex = person.Sex;

        } 

        /// <summary>

        /// 删除一个Person        /// </summary>

        /// <param name="id">Person ID</param>

        public void DeletePerson(long id)

        {

            _personLst.RemoveAll(x => x.Id == id);

        }

}

리소스에 대한 CRUD 작업을 위한 간단한 API는 구문 분석 없이도 괜찮습니다. 입력을 연결할 필요가 없습니다. 간단합니다! 산책하자!

요청 보내기: 조건자는 POST이고 의미는 Person을 생성하는 것이며 Person은 Body에 설명되고 Body는 Json을 통해 직렬화되도록 head에 선언되었습니다.

응답 수신: 응답 코드 204, 2XX 유형에 속, 실행 성공, Body에 데이터 없음

보내는 요청: 조건자는 GET, 의미는 쿼리 ID 1인 Person Resource는 XML을 사용하여 직렬화된 데이터를 수신하겠다고 헤드에 선언합니다.

응답 수신: 응답 코드는 200, 실행 성공, Body에 데이터가 있고 데이터가 직렬화되어 있습니다. XML 사용

요청 보내기: 조건자는 PUT이고 의미는 ID 1의 Person 리소스를 수정하는 것이며 수정된 콘텐츠는 Body, Content-Type에 있습니다. Body가 Json 직렬화를 사용한다는 것을 나타냅니다. Body에서 Name Modify를 Test1Changed에 입력했습니다

응답 수신, 응답 코드는 204, 실행 성공

보내기 request: predicate는 GET, semantics는 query Person ID 1 Resource, Accept는 Json 데이터 수신을 희망함을 나타냅니다.

수신된 응답: Body는 Json을 사용하여 직렬화된 콘텐츠이고 Name 속성임을 알 수 있습니다. Test1Changed로 변경되었습니다

요청 보내기: 조건자는 DELETE이고 의미는 ID가 1인 Person 리소스를 삭제하는 것

응답 수신: 응답 코드 204, 실행 성공

发送请求:谓词为GET,语义为查询ID为1的Person资源,Accept标明希望接收到Json数据

收到响应:响应码为200,执行成功,响应内容为null,资源已删除

 

这就是我用Fiddler来发送、调用的一组RestFul接口,大家可以看到,整个调用过程使用到了HTTP的语义,用到了谓词路由、内容协商。在增、删、改操作中,我都是使用void作为返回值,根据HTTP Code 判断,大家也可以自定义一些返回数据来做出更进一步的操作描述。

 

在写了这些API后,我们需要在程序中调用,我以C#为例写一组对这些接口调用的实现。在C#中,传统调用HTTP接口一般有两种办法: WebRequest/WebResponse组合的方法调用和WebClient类进行调用。第一种方法抽象程度较低,使用较为繁琐;而WebClient主要面向了WEB网页场景,在模拟Web操作时使用较为方便,但用在RestFul场景下却比较麻烦,在Web API发布的同时,.NET提供了两个程序集:System.Net.Http和System.Net.Http.Formatting。这两个程序集中最核心的类是HttpClient。在.NET4.5中带有这两个程序集,而.NET4需要到Nuget里下载Microsoft.Net.Http和Microsoft.AspNet.WebApi.Client这两个包才能使用这个类,更低的.NET版本就只能表示遗憾了只能用WebRequest/WebResponse或者WebClient来调用这些API了。

       在使用中,System.Net.Http这个程序集提供了HttpClient类以及相关的HTTP调用,而System.Net.Http.Formatting提供了一些针对HttpClient的帮助扩展,更好地支持了内容协商、Content创建等功能。下面我就和大家一起写一下这个例子:

       我们新建一个控制台程序:

       代码如下:


public class Person

    {        public long Id { get; set; }        public string Name { get; set; } 

        public int Age { get; set; } 

        public string Sex { get; set; } 

        public override string ToString()

        {            return $"Id={Id} Name={Name} Age={Age} Sex={Sex}";

        }

    } 

    class Program

    {        static void Main(string[] args)

        {            var client = new HttpClient();

 

            client.BaseAddress = new Uri("http://localhost:22658/"); //基本的API URL
            client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); //默认希望响应使用Json序列化
 

 

            Run(client);

 

            Console.ReadLine();

 

        } 

        static async void Run(HttpClient client)

        {            var result = await AddPerson(client);

            Console.WriteLine($"添加结果:{result}"); //添加结果:true

 

            var person = await GetPerson(client);

            Console.WriteLine($"查询结果:{person}"); //查询结果:Id=1 Name=test Age=10 Sex=F
 

            result = await PutPerson(client);

            Console.WriteLine($"更新结果:{result}"); //更新结果:true
 

            result = await DeletePerson(client);

            Console.WriteLine($"删除结果:{result}"); //删除结果:true
        } 

        static async Task<bool> AddPerson(HttpClient client)

        {            return await client.PostAsJsonAsync("api/Person", new Person() { Age = 10, Id = 1, Name = "test", Sex = "F" }) //向Person发送POST请求,Body使用Json进行序列化
                                     .ContinueWith(x => x.Result.IsSuccessStatusCode);  //返回请求是否执行成功,即HTTP Code是否为2XX
        } 

        static async Task<Person> GetPerson(HttpClient client)

        {            return await await client.GetAsync("api/Person/1") //向Person发送GET请求
                .ContinueWith(x => x.Result.Content.ReadAsAsync<Person>(                              //获取返回Body,并根据返回的Content-Type自动匹配格式化器反序列化Body

                    new List<MediaTypeFormatter>() {new JsonMediaTypeFormatter()/*这是Json的格式化器*/

                                                    ,new XmlMediaTypeFormatter()/*这是XML的格式化器*/}));

 

        } 

        static async Task<bool> PutPerson(HttpClient client)

        {            return await client.PutAsJsonAsync("api/Person/1", new Person() { Age = 10, Id = 1, Name = "test1Change", Sex = "F" }) //向Person发送PUT请求,Body使用Json进行序列化
                                    .ContinueWith(x => x.Result.IsSuccessStatusCode);  //返回请求是否执行成功,即HTTP Code是否为2XX
        } 

        static async Task<bool> DeletePerson(HttpClient client)

        {            return await client.DeleteAsync("api/Person/1") //向Person发送DELETE请求
                .ContinueWith(x => x.Result.IsSuccessStatusCode); //返回请求是否执行成功,即HTTP Code是否为2XX
        }

}

 

    这就完成了这组API的调用,是不是非常简单方便?HTTPClient使用全异步的方法,并且他有良好的扩展性,我会在之后的博客中再聊这个问题。

    OK,到此为止一组简单的Restful API和C#的调用客户端就完成了,但这只是开始,Web API是一个很强大的框架,他的扩展点非常丰富,这些扩展能为我们的开发提供很多的帮助,下一篇博文我将为大家带来WEB API中Filter的使用。

    博文中如有不正确的地方欢迎大家指正。

위 내용은 ASP.NET WEB API 적용 시나리오의 첫 번째 예의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.