본문 바로가기

IT프로그래밍/C Sharp

[C#]10분만에 rest api server 만들기 / rest api server example

C#(C Sharp)API 서버를 구현 #1

C#에서도 API Server를 구현하여 Request에 Response를 줄 수 있습니다.

 

우선 이번 #1에서는 Server 구성을 하기 위해서는 어떤 클래스를 써야하는지 살펴보고,

해당 서버를 오픈 시켜놓은 상태에서 진짜로 Reqeust가 들어오는지 까지 테스트해 보겠습니다.

 

1. HttpListener Class

HttpListener는 간단하게 말하면 http프로토콜 요청을 주고 받을 수 있게 해주는 송수신기 입니다.

이 클래스가 결국 Rest API Server를 구현하는 핵심이며, 전부라고 해도 과언이 아닙니다.

 

자세한 사항은 링크로 갈음 해놓으니, 꼭 살펴보시기 바랍니다.

 

 



2. WinForm에서 restAPI Server구현

- 구현 내용

 1. 서버 구동 버튼을 눌렀을 때, Server(HttpListener)가 스타트 된다.

 2. 서버는 요청(Request)을 대기하고 있는 상태이며,

     요청(Request) 수신 시 해당 요청의 HttpMethod와 RawUrl을 표출한다.

 


- WinForm 디자인

WinForm 디자인

Server를 켜는 스위치 역할을 하는 버튼하나와

요청(Request)의 속성을 표출할 RichTextBox 만으로 이루어져 있습니다.

 


- 코드

우선 전역 변수로 httpListener를 선언합니다.

이 변수를 통해서 서버를 구동 할 것입니다.

HttpListener httpListener;

 

버튼이 눌러졌을 때, 실행될 메서드는

private void serverInit()
{
    if(httpListener == null)
    {
        httpListener = new HttpListener();
        httpListener.Prefixes.Add(string.Format("http://+:8686/"));
        serverStart();
    }
}

입니다.

우선 httpListener를 new를 통해 할당 시킵니다. 그리고 Prefixes.Add를 통해서 Prefixes를 추가합니다.

더보기

Prefixes란?

 - 들어오는 요청에서 비교되는 URI 정보를 식별하는 String입니다. 이 접두사는 슬래시("/")로 종결되어야 합니다.

PreFixes는 API 호출을 위한 기본주소( 첫번째 슬래시("/" )까지의 주소)입니다.

"http://+:8686/" 에서 +라고 표기한 것은 해당 pc의 모든 ip로의 접근이라는 의미이며8686은 접속 포트를 의미합니다.

 ※모든 IP : 127.0.0.1, localhost, 외부IP, 내부IP 등..

즉 httpListener의 프리픽스를 현재 IP뒤에 :8686이라고 붙은걸로 하겠다. 라는것을 추가한것입니다.

(:8686은 결국 포트를 8686으로 하겠다란 얘기죠)

Prefixes.add는 한번만 하는 것은 아니고 표현대로 add입니다. 다른 주소체계를 더 추가시키고 싶다면 .add를 사용하여

더 추가 할 수 있습니다.

 

그럼 주소까지 할당 했으니 실제 서버를 start 해보도록 하겠습니다.

 

private void serverStart()
{

    if (!httpListener.IsListening)
    {
        httpListener.Start();
        richTextBox1.Text = "Server is started";

        Task.Factory.StartNew(() =>
        {
            while (httpListener != null)
            {
                HttpListenerContext context = this.httpListener.GetContext();

                string rawurl = context.Request.RawUrl;
                string httpmethod = context.Request.HttpMethod;

                string result = "";

                result += string.Format("httpmethod = {0}\r\n", httpmethod);
                result += string.Format("rawurl = {0}\r\n", rawurl);

                if (richTextBox1.InvokeRequired)
                    richTextBox1.Invoke(new MethodInvoker(delegate { richTextBox1.Text = result; }));
                else
                    richTextBox1.Text = result;

                context.Response.Close();

            }
        });

    }
}

httpListener.Start()를 통해서 이제 요청을 받을 수 있는 상태가 되었습니다.

그리고 richTextBox에 서버가 시작되었다는 문구를 남깁니다.

 

요청을 한번만 받고 끝낼 것이 아니기 때문에 while문으로 감쌌으며, 조건은 httpListener이 null이 아니라고 정해두었습니다.

Task는 이후에 있을 비동기를 구현하기 위한 것이므로 이 글에서는 가볍게 지나가셔도 될것같습니다.

 

이 serverStart() 메서드에서 핵심은

HttpListenerContext context = this.httpListener.GetContext();

입니다.

 

디버깅을 찍어보시면 해당 구문에서 더이상 진행이 되지 않는 것을 보실 수 있습니다.

컨텍스트는 클라이언트의 요청에 대한 모든정보를 담고 있습니다.

 

즉 해당 구문은 http 요청이 왔을 때 값을 받아올 수 있으므로 요청이 오지 않은 경우에는 계속 대기상태입니다.

 

http 요청이 들어오면, 해당 요청에 대한 httpMethod, rawURL을 string result에 저장하고

richTextBox에 표출합니다.

 

마지막으로 context.Response.Close(); 를 수행해줘야 합니다.

해당 구문은 응답을 닫겠다? 끝내겠다? 라는 의미정도로 생각을 하시면 될것같습니다.

(이후 테스트에서 이 contextResponse에 응답을 실어서 보낼 예정입니다)

 



3. 테스트

- 준비사항 : http요청을 보낼 수 있는 툴

저는 크롬 확장 프로그램인 Talend API Tester를 이용해 보겠습니다.

 

그럼 프로그램을 실행 시킨 뒤, 버튼을 눌러서 Server가 요청(Request)을 받을 수 있도록 합니다.

 

Talend API Tester는 아래와 같이 작성하였습니다.

 

클릭하셔서 크게 보세요

 

이제 우측 상단의 SEND를 누릅니다.

 

http Request의 속성

텍스트 박스에 Request에 대한 속성을 확인 할 수 있습니다.

 

이번에는 http://127.0.0.1:8686/를

http://127.0.0.1:8686/TEST로 변경하여 SEND합니다.

 

rawurl이 /TEST로 변경된 것을 확인 할 수 있습니다.

즉, Prefixes는 http 통신에서 공통으로 사용하는 url을

rawurl은 프리픽스 이후의 url이란 것을 확인 할 수 있습니다.

 

이번에는 Talend API Tester의 좌측상단에 있는 METHOD를 POST로 변경해봅시다.

클릭해서 크게 보세요

 

 

프로그램에서 확인해 보면 httpmethod가 POST를 수신한 것을 알 수 있습니다.


 


이제 우리는 httpListener를 통해서 C#에서 http Request를 수신 할 수 있습니다.

다음포스팅에서는 이 요청을 어떻게 처리할 지, 또 응답을 어떻게 보낼 수 있는지에 대해 작성하도록 하겠습니다.

 

그럼 행복하세요~!