C#에서 rest api 호출하는 방법을 확인해보겠습니다.
WebClient 클래스와, WebRequest 클래스를 활용해 보겠습니다.
샘플 API는 고속도로 공공데이터 포털의 API를 활용하겠습니다.
인증키 없이도 호출할 수 있어 채택했습니다.
샘플 API 주소 : http://data.ex.co.kr/openapi/safeDriving/forecast?key=test&type=json
위 샘플 API를 호출하면 아래와 같은 JSON 스트링 결과를 확인 할 수 있습니다.
리턴되는 규격은 아래와 같습니다.
C# 코드에서 호출해보도록 하겠습니다.
WebClient 활용 샘플
:WebClient 클래스를 객체를 생성하고
OpenRead(호출할url) 메소드를 통해 api를 호출해줍니다.
결과 값은 StreamReader 를 통해 string으로 읽어 return해줍니다.
client.Headers.Add() 코드를 통해 원하는 헤더를 설정할 수 도 있습니다.
public static string callWebClient()
{
string result = string.Empty;
try
{
WebClient client = new WebClient();
//특정 요청 헤더값을 추가해준다.
client.Headers.Add("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; .NET CLR 1.0.3705;)");
using (Stream data = client.OpenRead(targetURL))
{
using (StreamReader reader = new StreamReader(data))
{
string s = reader.ReadToEnd();
result = s;
reader.Close();
data.Close();
}
}
}
catch (Exception e)
{
//통신 실패시 처리로직
Console.WriteLine(e.ToString());
}
return result;
}
WebRequest 활용 샘플
WebReuqest 객체를 생성하고,
request.Method 속성을 통해 GET, POST 호출 방식을 정의합니다.
request.ContentType 속성을 통해 요청데이터가 어떤형식으로 전달될지 정의합니다.
request.Headers[""] = "" 를 통해 커스텀 헤더를 정의합니다.
그리고 StreamReader를 통해 호출결과를 string으로 읽어냅니다.
public static string callWebRequest()
{
string responseFromServer = string.Empty;
try
{
WebRequest request = WebRequest.Create(targetURL);
request.Method = "GET";
request.ContentType = "application/json";
request.Headers["user-agent"] = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; .NET CLR 1.0.3705;)";
using (WebResponse response = request.GetResponse())
using (Stream dataStream = response.GetResponseStream())
using (StreamReader reader = new StreamReader(dataStream))
{
responseFromServer = reader.ReadToEnd();
}
}
catch (Exception e)
{
Console.WriteLine(e.ToString());
}
return responseFromServer;
}
아래는 전체 코드입니다.
각 메소드를 통해 리턴받은 string값을 json으로 변환하여 콘솔창에 출력해보았습니다.
전체 코드
using Newtonsoft.Json.Linq;
using System;
using System.IO;
using System.Net;
using System.Net.Http;
using System.Threading.Tasks;
namespace vmpoStudy01
{
class Program
{
static string targetURL = "http://data.ex.co.kr/openapi/safeDriving/forecast?key=test&type=json";
static void Main(string[] args)
{
//1.WebClient 클래스 활용
string webClientResult = callWebClient();
var r = JObject.Parse(webClientResult);
var list = r["list"];
Console.WriteLine(r);
foreach (var o in list)
{
Console.WriteLine(string.Format("{0} : {1}", "날짜" , o["sdate"]));
Console.WriteLine(string.Format("{0} : {1}", "전국교통량" , o["cjunkook"]));
Console.WriteLine(string.Format("{0} : {1}", "지방교통량" , o["cjibangDir"]));
Console.WriteLine(string.Format("{0} : {1}", "서울->대전 소요시간" , o["csudj"]));
Console.WriteLine(string.Format("{0} : {1}", "서울->대구 소요시간" , o["csudg"]));
Console.WriteLine(string.Format("{0} : {1}", "서울->울산 소요시간" , o["csuus"]));
}
Console.WriteLine("*************************************************************");
string wbRequestResult = callWebRequest();
var r2 = JObject.Parse(webClientResult);
var list2 = r["list"];
Console.WriteLine(r2);
foreach (var o in list2)
{
Console.WriteLine(string.Format("{0} : {1}", "날짜", o["sdate"]));
Console.WriteLine(string.Format("{0} : {1}", "전국교통량", o["cjunkook"]));
Console.WriteLine(string.Format("{0} : {1}", "지방교통량", o["cjibangDir"]));
Console.WriteLine(string.Format("{0} : {1}", "대전->서울 버스 소요시간", o["cdjsu_bus"]));
Console.WriteLine(string.Format("{0} : {1}", "대구->서울 버스 소요시간", o["cdgsu_bus"]));
Console.WriteLine(string.Format("{0} : {1}", "울산->서울 버스 소요시간", o["cussu_bus"]));
}
}
public static string callWebClient()
{
string result = string.Empty;
try
{
WebClient client = new WebClient();
//특정 요청 헤더값을 추가해준다.
client.Headers.Add("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; .NET CLR 1.0.3705;)");
using (Stream data = client.OpenRead(targetURL))
{
using (StreamReader reader = new StreamReader(data))
{
string s = reader.ReadToEnd();
result = s;
reader.Close();
data.Close();
}
}
}
catch (Exception e)
{
//통신 실패시 처리로직
Console.WriteLine(e.ToString());
}
return result;
}
public static string callWebRequest()
{
string responseFromServer = string.Empty;
try
{
WebRequest request = WebRequest.Create(targetURL);
request.Method = "GET";
request.ContentType = "application/json";
using (WebResponse response = request.GetResponse())
using (Stream dataStream = response.GetResponseStream())
using (StreamReader reader = new StreamReader(dataStream))
{
responseFromServer = reader.ReadToEnd();
}
}
catch (Exception e)
{
Console.WriteLine(e.ToString());
}
return responseFromServer;
}
}
}
각 클래스를 통해 2번 호출한 결과입니다.
정상적으로 출력된 것을 확인할 수 있습니다.
C# 코드로 API 호출 프로그램을 간단하게 구현할 수 있었습니다.
'C#' 카테고리의 다른 글
[C#] JsonProperty attribute 순서 정렬해서 직렬화 하기 (order by) (0) | 2019.10.23 |
---|---|
[c#] JsonConvert.SerializeObject ignore null field (json 직렬화 null 제외) (0) | 2019.10.23 |
최근댓글