카테고리 없음

HTTP Operations GET, POST, PUT and DELETE From .NET Client

기하 2021. 8. 30. 02:32

이 기사의 목적은 우리 자신의 HttpClient를 이해하고 구성하는 것입니다. 

HTTP 프로토콜을 조금 더 자세히 살펴보는 데 관심이 많다면 이 기사가 만족스러울 수 있기를 바랍니다. 

자, 이야기를 시작하겠습니다.

 

 우리는 먼저 HTTP 프로토콜의 기본 아이디어(많지 않고 기본 사항만)를 명확히 한 다음

콘솔 응용 프로그램의 HttpClient 구현 부분으로 직접 이동하여 Web API RESTful 서비스를 사용할 것입니다.

 

HTTP는 이 기사를 읽고 있는 프로토콜이며 Anazon.com에서 책을 구입하고

Facebook에서 친구와 채팅하고(내가 가장 좋아하는) 웹에서 더 많은 일을 합니다. 

이 기사 링크를 클릭하여 읽었을 때 시나리오에 대해 생각해 봅시다. 

당신도 모르는 사이에 몇 가지 작업이 발생했습니다. 작업(operation)은 무엇입니까?

 

링크를 클릭하면 브라우저가 관련 정보가 포함된 HTTP GET 메시지를 생성하고

c-sharocorner.com의 서버에 요청( request)했습니다. 

이제 질문은 요청이 어떻게 보이는가 하는 것입니다. 

자, 여기에서 GET request의 개요(약간 지나치게 단순화되었지만 실제와 매우 유사함)를 볼 수 있습니다. 

가장 간단한 예가 여기에 있습니다.

 

GET: http://c-sharpcorner.com/Articles/myarticle.aspx HTTP/1.1
Host: c-sharpcorner.com

 

정확한 요청에는 더 나은 응답을 위해 서버에 도움이 되는 많은 헤더 정보가 있을 수 있기 때문에

이것이 정확한 요청이 아닐 수도 있다고 이미 말했습니다.

 

첫 번째 줄을 이해합시다. 구조는 다음과 같습니다.

 

[Method] [URL] [HTTP 버전]

Method : request 유형을 정의합니다. 여기서 요청 유형은 GET입니다.  
             POST, PUT 및 DELETE와 같은 다른 많은 것들이 있습니다.

URL : URL은 서버에서 얻고자 하는 특정 URL을 정의합니다.      
        분명히 이 URL은 임의적이며 우리의 이해를 위해 제공되었습니다.

HTTP 버전: HTTP 버전은 이 요청의 현재 HTTP 버전을 정의합니다.  
        HTTP 버전은 1.1로 1.0 이후 최신 버전이며 1999년부터 WWW를 지배하고 있습니다.

 

자, 우리는 첫 번째 줄의 의미를 배웠습니다. 

이제 두 번째 줄로 가보겠습니다. 두 번째 줄은 하나의 헤더 정보일 뿐입니다. 

헤더 이름은 호스트입니다. HTTP 요청 및 응답에는 n개의 헤더가 있을 수 있습니다. 

"Host" 헤더를 제외하고는 모두 선택 사항입니다. 호스트 헤더에는 서버 이름이 포함됩니다.

 

좋습니다, 우리는 실제 주제에 집중하기 위해 HTTP 프로토콜에 대해 더 깊이 들어가지 않을 것입니다. 

Web API의 서비스를 사용하는 자체 HTTP 클라이언트 응용 프로그램 구성을 시작하겠습니다. 

이를 위해 두 개의 서로 다른 응용 프로그램을 만들어야 합니다. 

하나는 서버(Web API)이고 콘솔 응용 프로그램은 HttpClient입니다.

RESTful 서비스를 호스팅하기 위한 Web API 생성

이 애플리케이션에서는 RESTful API에서 HTTP 서비스를 호스팅하는 매우 간단한 웹 API를 구현합니다. 

다음 코드를 살펴보십시오.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Web;
using TestWEB_API.Models;
using System.Web.SessionState;using System.Web.Http;
using System.Web.Mvc

namespace TestWEB_API.Controllers
{
    public class ValuesController : ApiController
    {
        public List<string> Get()
        {
            List<string> Li = new List<string>();
            Li.Add("Sourav");
            Li.Add("Ajay");
            Li.Add("Manish");
            return Li;
        }
    }
}

Get() 작업은 매우 간단하게 구현됩니다. 단지 문자열 모음을 클라이언트에 보내는 것뿐입니다. 

이제 클라이언트 구현 부분에 집중해야 합니다.

 

콘솔 애플리케이션에서 HTTP 클라이언트 구현

계속하기 전에 몇 가지 기본 개념을 명확히 합시다. 

HTTP 클라이언트의 고전적인 예는 무엇입니까? 네, 브라우저입니다. 

브라우저는 HTTP 요청을 구성하는 방법을 잘 알고 있습니다. 

어떤 종류의 요청인지는 중요하지 않습니다. 

헤더 정보를 설정합니다(하나의 헤더가 아니라 시간-날짜, 선호하는 데이터 유형과 같이 많은 것이 있음).

 

호스트 주소와 적절한 HTTP 프로토콜 유형을 설정하고 이를 목적지로 보냅니다. 

그러나 이 예제에서는 처음부터 구현합니다

(.NET 클래스 라이브러리의 Httpclient 클래스를 사용할 것이기 때문에 정확히 처음부터가 아닙니다). 

다음 예를 살펴보십시오.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Net.Http;
using System.Net.Http.Headers;

namespace HttpClientAPP
{
    class Program
    {
        static void Main(string[] args)
        {
            HttpClient client = new HttpClient();
            client.BaseAddress = new Uri("http://localhost:11129/");
            // Add an Accept header for JSON format.
            client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
            // List all Names.
            HttpResponseMessage response = client.GetAsync("api/Values").Result;  // Blocking call!
            if (response.IsSuccessStatusCode)
            {
                var products = response.Content.ReadAsStringAsync().Result;
            }
            else
            {
                Console.WriteLine("{0} ({1})", (int)response.StatusCode, response.ReasonPhrase);
            }
        }
    }
}

 

여기서 우리는 서비스 애플리케이션의 RESTful URL에 불과한 기본 주소를 설정했습니다. 

그런 다음 예상되는 콘텐츠 유형 헤더를 설정하여 JSON 형식으로 데이터를 반환하도록 서버에 요청합니다. 

그런 다음 응답 정보를 비동기적으로 읽습니다.

출력에서 예상되는 JSON 형식의 데이터를 가져옵니다.

우리는 Web API에 GET 요청을 한 첫 번째 HTTP 클라이언트를 만들었습니다.

이제 API 호출 시 작성한 요청 및 응답 메시지를 확인하고 응답을 받는 데 관심이 있습니다. 

다음은 이에 대한 샘플 구현입니다.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Net.Http;
using System.Net.Http.Headers;

namespace HttpClientAPP
{
    class Program
    {
        static void Main(string[] args)
        {
            HttpClient client = new HttpClient();
            client.BaseAddress = new Uri("http://localhost:11129/");
            // Add an Accept header for JSON format.
            client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
            // List all Names.
            HttpResponseMessage response = client.GetAsync("api/Values").Result;  // Blocking call!
            if (response.IsSuccessStatusCode)
            {
                Console.WriteLine("Request Message Information:- \n\n" + response.RequestMessage + "\n");
                Console.WriteLine("Response Message Header \n\n" +  response.Content.Headers + "\n");
            }
            else
            {
                Console.WriteLine("{0} ({1})", (int)response.StatusCode, response.ReasonPhrase);
            }
            Console.ReadLine();
        }
    }
}

녹색 상자는 HttpClient 클래스가 우리를 위해 형성한 요청 메시지 형식을 보여줍니다. 

요청 유형은 GET이고 HTTP 프로토콜 버전은 1.1입니다. 

헤더 부분에는 하나의 헤더 정보만 있습니다. 

요청은 응답 메시지 본문에 JSON 데이터를 예상하고 있습니다.

빨간색 상자는 응답 메시지를 보여줍니다.

 

포스트 요청 방법

이 기사에서는 .NET 클라이언트를 사용하여 Web API에 데이터를 게시하는 방법을 살펴보겠습니다. 

우리는 RESTful API가 다른 서비스를 보다 원활하게 사용할 수 있고

HTTP를 이해하는 모든 클라이언트가 Web API를 사용할 수 있다는 것을 알고 있습니다. 

 

.NET 프레임워크는

모든 유형의 .NET 애플리케이션에서 웹 서비스를 사용할 수 있는 멋진 클래스를 제공했습니다. 

이 기사에서는 Web API에서 서비스를 사용하는 콘솔 애플리케이션을 빌드합니다. 

그럼 먼저 Web API 파트를 만들어 보겠습니다. 다음 코드를 살펴보십시오.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Web.Http;

namespace WebAPI.Controllers
{
    public class person
    {
        public string name { get; set; }
        public string surname { get; set; }
    }
    public class personController : ApiController
    {
        [HttpPost]
        public void Post([FromBody] person p)
        {
        }
    }
}

person controller는 이해하기 쉽습니다. [HttpPost] 속성으로 장식한 Post() 메서드는 하나만 유지했습니다. 

나는 우리의 액션 이름이 HTTP 동사와 일치할 때 속성 장식이 별로 도움이 되지 않는다고 생각합니다. 어쨌든 post 메소드는 HTTP 요청의 본문에서 제공할 하나의 인수를 취하고 있으며 인수 유형은 개인 클래스의 객체 유형입니다. 그래서 우리는 .NET 클라이언트에서 복잡한 개체를 보내고 있습니다.

이제 .NET 코드를 살펴보겠습니다. 클라이언트에서도 Web API에 정의한 것과 동일한 클래스를 복제했음을 알 수 있습니다. 그런 다음 Main() 함수 내에서 Web API로 보낼 해당 클래스의 객체 하나를 생성합니다.

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using ClassLibrary; using System.Threading; using System.Net.Http; using System.Net.Http.Headers; using System.Net.Http.Formatting; using Newtonsoft.Json; namespace ConsoleAPP { public class person { public string name { get; set; } public string surname { get; set; } } class Program { static void Main(string[] args) { using (var client = new HttpClient()) { person p = new person { name = "Sourav", surname = "Kayal" }; client.BaseAddress = new Uri("http://localhost:1565/"); var response = client.PostAsJsonAsync("api/person", p).Result; if (response.IsSuccessStatusCode) { Console.Write("Success"); } else Console.Write("Error"); } } } }

씨#

복사

API의 URL을 지정하고 "PostAsAsync" 메서드를 사용하여 개인 컨트롤러의 Post 작업에 데이터를 보냈습니다. 결과는 응답 변수를 저장한 다음 개체의 "IsSuccessStatuscode"를 확인합니다.

이제 클라이언트 애플리케이션 개발 중에 고려해야 할 한 가지입니다. 응용 프로그램에 다음 패키지를 설치하는 것이 좋습니다.

<?xml version="1.0" encoding="utf-8"?> <packages> <package id="EntityFramework" version="5.0.0" targetFramework="net45" /> <package id="Microsoft.AspNet.WebApi.Client" version="5.1.2" targetFramework="net45" /> <package id="Microsoft.AspNet.WebApi.Core" version="5.1.2" targetFramework="net45" /> <package id="Newtonsoft.Json" version="6.0.3" targetFramework="net45" /> </packages>

마크업

복사

넣기 및 삭제 요청 방법

이 예에서는 .NET 클라이언트에서 Web API의 Put() 및 Delete() 작업을 호출합니다. 나는 당신이 이미 HTTP 동사와 Web API와의 관계에 익숙하기를 바랍니다.

자, 이제 Put() 메서드를 구현하는 방법을 살펴보겠습니다. Put()이 RESTful 서비스에서 무언가를 업데이트할 수 있다는 것을 알고 있습니다. 다음은 Web API이며 Put() 메서드에 대한 인수로 복합 유형 개체를 전달합니다.

using System; using System.Collections.Generic; using System.Linq; using System.Net; using System.Net.Http; using System.Web.Http; namespace WebAPI.Controllers { public class person { public string name { get; set; } public string surname { get; set; } } public class personController : ApiController { [HttpPut] public void Put([FromBody] person p) { } } }

씨#

복사

자, 이제 Web API에 대해 Put() 작업을 수행하는 클라이언트 응용 프로그램을 구현합니다. 다음 코드를 살펴보십시오.

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using ClassLibrary; using System.Threading; using System.Net.Http; using System.Net.Http.Headers; using System.Net.Http.Formatting; using Newtonsoft.Json; namespace ConsoleAPP { public class person { public string name { get; set; } public string surname { get; set; } } class Program { static void Main(string[] args) { using (var client = new HttpClient()) { person p = new person { name = "Sourav", surname = "Kayal" }; client.BaseAddress = new Uri("http://localhost:1565/"); var response = client.PutAsJsonAsync("api/person", p).Result; if (response.IsSuccessStatusCode) { Console.Write("Success"); } else Console.Write("Error"); } } } }

씨#

복사

Put() 작업/메서드를 예상하는 동일한 개체 유형을 Web API에 보내고 있습니다. 애플리케이션을 실행하면 Put() 작업을 사용하여 데이터를 얻은 것을 볼 수 있습니다.

Delete() 작업도 마찬가지입니다. 이제 Delete() 작업을 간단히 살펴보겠습니다. 다음은 클라이언트 코드입니다. Delete()의 경우 정수 유형인 키 값을 전송합니다.

using (var client = new HttpClient()) { client.BaseAddress = new Uri("http://localhost:1565/"); var response = client.DeleteAsync("api/person/10").Result; if (response.IsSuccessStatusCode) { Console.Write("Success"); } else Console.Write("Error"); }

씨#

복사

그리고 API의 Delete() 작업.

[HttpDelete] public void Delete([FromUri] Int32 Id) { }

씨#

복사

모든 것이 정상이면 다음 예제에서 볼 수 있는 것처럼 값 10을 전달하여 Delete() 작업을 호출합니다.

.NET 클라이언트에서 Web API의 Put() 및 Delete() 작업을 호출하는 방법을 살펴보았습니다.

결론

이 기사에서는 .NET 라이브러리의 HttpClient 클래스를 사용하여 자체 HTTP 클라이언트를 만드는 방법을 배웠습니다. 클라이언트가 비동기식으로 응답을 받기 때문에 .NET 4.5를 사용하여 비동기식 작업을 지원해야 합니다.

 

[출처 번역인용] https://www.c-sharpcorner.com/UploadFile/dacca2/http-request-methods-get-post-put-and-delete/