티스토리 뷰

개발/C#

[C#/API] API 호출하기 (Json)

KIBBOMI 2021. 9. 2. 23:25

API (Application Programming Interface)를 사용하려고 할 때, API를 제공하는 곳(회사)으로부터 양식이 보통 정해져 있습니다. 또, Kakao 같은 회사는 코딩 테스트에 API 사용을 요구합니다.

 

호출하는 함수마다 헤더의 값은 어쩌고, 데이터는 어쩌고, 서로 다른 포맷을 갖고 있는데 JSON 양식을 보면서 어떻게 요청하고 응답을 받아 데이터를 파싱하는지 살펴보겠습니다.

 

대부분 Python이나 Java를 쓰겠지만 C#생태계가 좀 커졌으면 하는 바람이 있어서.. C#으로...


 

0. 사전 준비

들어가기에 앞서 C#에서 Json 객체를 사용하기 위해서는 다음과 같은 패키지가 필요합니다.

https://kibbomi.tistory.com/189

 

[C#/JSON] JSON parser 구현

XML과 비슷하게 JSON도 데이터 전송에 있어서 중요한 역할을 한다. JSON은 JavaScript Object Notation 으로, 특별한 자료구조가 아닌 그냥 JS에서 쓰던 object구조랑 똑같다. 개인적인 생각이지만 xml보단 json

kibbomi.tistory.com

 

Newtonsoft json패키지를 설치 완료하셨다면 준비는 끝났습니다!

간단해서 금방 끝납니다!

 

1. 시작하기

 

첫번째로 할 것은 Json객체를 생성하는 것이다. 요청을 해야 응답이 오기 때문에!

 

요구하는 Json양식은 2021 Kakao 2차 코딩 테스트 문제를 참고 했습니다.

 

첫 번째 API입니다.

POST /start
X-Auth-Token: {X-Auth-Token}
Content-Type: application/json

이렇게 Request 포맷을 제시하고 있다.

주목할만한 정보는 

Post,

/start

X-Auth-Token

Content-Type , application/json

가 있다.

 

또, 예를 조금 더 자세히 보여주고 있다.

curl -X POST {BASE_URL}/start \
     -H 'X-Auth-Token: {X_AUTH_TOKEN}' \
     -H 'Content-Type: application/json' \
     -d '{
         "problem": 1
     }'

curl의 X옵션(-X)은 HTTP의 메서드를 결정한다. 여기서는 POST로,

-H는 Header의 정보,

-d는 데이터다.

 

이제 위의 요청을 C# 코드로 옮겨보면,,

 

static void StartAPI()
{
    string url= "https://naver.com/start"; // base 'url/start'
    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);

    request.Method = "POST"; // method 
    request.ContentType = "application/json"; // ContentType
    request.Headers.Add("X-Auth-Token", "123a456b789c123d456e789f"); // Header에 추가

    JObject data = new JObject(); // 텅 빈 JSON instance 생성
    data.Add("problem", 1); "problem" : 1 이라는 Key : Value 1개 추가
	//data는 {"problem" : 1}이 됨
    
    StreamWriter reqStream = new StreamWriter(request.GetRequestStream());
    reqStream.Write(data); //http body에 data 쓰기
    reqStream.Close();

    try
    {
        HttpWebResponse response = (HttpWebResponse)request.GetResponse(); // 요청 보내고 응답 기다리기
        StreamReader respStream = new StreamReader(response.GetResponseStream());
        string resp = respStream.ReadToEnd();	// 결과를 string으로 읽기
        respStream.Close();

        JObject ret = JObject.Parse(resp); // JObject 정적 매서드로 string을 JSON형식으로 파싱하기

		// 포맷에 맞게 읽기
        Console.WriteLine($"auth_key : {ret["auth_key"]}");
        Console.WriteLine($"problem : {ret["problem"]}");
        Console.WriteLine($"time : {ret["time"]}");
    }
    catch (Exception e)
    {
        Console.WriteLine(e.Message);
    }
}

코드 1. 전형적인 HTTP 요청/응답

위의 코드 1과 같이 나타낼 수 있다.

 

첫 번째로 HTTP request를 만들기 위해 HttpWebRequest 객체를 만드는 것.

HttpWebRequest는 WebRequest.Create(url)로 생성되고 형변환을 해주어야 한다.

여기서, url은 API server의 주소를 써야 한다. 위의 코드에서는 예를 들기 위해서 https://www.naver.com/start로 썼지만 실제론 없는 주소다.

 

두 번째로 주어진 양식대로 Header, Data를 써넣는 부분이다.

HttpWebRequest의 Method속성에 "GET", "POST" 등을 쓸 수 있다. 직접 써서 설정해 주자.

ContentType도 주어진대로 대입해 주면 된다. Data에 있는 값이 어떤 형태인지 알려주는 역할을 한다.

 

또, Header에 Auth Key값을 넣어주어야 하는데,

X-Auth-Token : {X_AUTH_TOKEN}과 같은 양식으로 Header에 삽입해야 한다.

HttpWebRequest 객체의 Header속성에 Add()매서드를 통해서 Header를 삽입해 줄 수 있다.

.Add("Key", "Value"); 토큰은 주어지는 값이기 때문에 실제로 API를 사용할 때 서버(회사)로부터 받을 수 있다.

 

세 번째로는 HttpWebRequest에 Data를 삽입하는 과정이다.

.GetRequestStream()을 통해 HttpWebRequest의 Stream을 얻어서 StreamWriter객체를 생성한다.

생성한 StreamWriter객체를 통해 HttpWebRequest에 Data를 삽입할 수 있다.

.Write의 매개변수는 JSON 객체!

사용한 stream은 꼭 close 해주자.

 

---송신 준비(요청) 끝----

 

이제는 request.GetResponse()를 통해 요청하고 응답을 기다린다.

응답이 오면 HttpWebResponse객체를 생성함과 동시에 응답을 대입해준다.

 

앞에 Data를 삽입하는 것과 동일하게 Response로부터 Stream을 얻어오고, StreamReader를 생성하고 이 StreamReader를 통해 데이터를 읽는다.

string 변수에 읽어서 JObject.Parse(string)과 같은 정적 매서드를 통해서 JSON으로 파싱 한다.

 

JSON 객체의 KEY를 통해 Value를 얻을 수 있다.

응답도 모두 포맷이 정해져 있기 때문에 회사에서 제시하는 Key에 맞게

JSON객체["key"]와 같이 접근하면 된다.

 

2. JArray (Array)

{ "key" : "value"   }는 JSON이고

[ , , , , ]는 array로 C#에서는 JArray 객체로 만들 수 있다.

 

 

예를 들어.. 

{ "key" : [1, 2, 3] }과 같은 객체를 만들고 싶다면

JObject obj = new JObject();

JArray arr = new JArray();
arr.add(1);
arr.add(2);
arr.add(3);

obj.add("key",arr);

이렇게 나타낼 수 있고, arr[0] = 1, arr[1] = 2, arr[2] = 3으로 접근 가능하다.

 


이 정도만 알아도 충분히 API를 사용할 수 있다고 생각합니다.

 

다소 복잡한 Data format이 있는데 차분히 분석해보면 JObject(Object), JArray(Array)로 다 만들 수 있습니다.

더 사용해보면서 필요한 부분이 있으면 추가하겠습니다.

 

댓글, 지적 환영입니다~ :)

댓글
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Total
Today
Yesterday