[C#] HTTP 원격 통신 - HttpWebRequest를 이용해 원격 웹사이트에서 데이터를 읽어오는 방법
서버에서 원격 웹사이트의 데이터를 받아서 처리를 할 때 C#으로 구현하는 방법입니다.
원격 웹사이트에서 데이터를 읽어올 때는 원격 사이트의 전송 요청 규약과 데이터에 맞춰서 요청을 해야 합니다.
원격 데이터를 읽을 때는 HttpWebRequest 객체를 사용합니다.
HttpWebRequest httpwebrequest = (HttpWebRequest)HttpWebRequest.Create("원격URL");
생성한 HttpWebRequest 객체의 환경설정을 합니다.
필요한 항목들만 값을 설정하면 됩니다.
전송 타입은 필수 항목으로 설정해야 합니다.
수신 데이터의 인코딩 설정은 데이터를 실제로 읽는 스트림리더(StreamReader)에서 설정합니다.
httpwebrequest.Method = "GET"; //GET, POST
httpwebrequest.Timeout = 30 * 1000; // 요청 타임 아웃 시간 - ms
httpwebrequest.Headers.Add("Authorization", "인증값"); // 요청 헤더 값 추가. 파라메터, 인증 정보, 인증키 등
httpwebrequest.UserAgent = ".NET Framework 4.8"; // User Agent 값. 없어도 가능
httpwebrequest.ContentType = "application/json"; //컨텐츠 타입과 인코딩 설정
HttpWebRequest 객체에 직접 인코딩 설정을 하려면
ContentType에 인코딩 값을 추가하면 됩니다.
유니코드는 "utf-8", 한글은 "euc-kr"을 사용합니다.
httpwebrequest.ContentType = "application/json;charset=utf-8;"; //컨텐츠 타입과 인코딩 설정
요청 객체 환경설정을 한 후, 원격 서버에 응답을 요청합니다.
httpwebresponse = (HttpWebResponse)httpwebrequest.GetResponse();
원격서버에서 받은 응답에서 스트림리더(StreamReader)로 데이터를 읽어서 후속 작업을 진행합니다.
스트림리더로 데이터를 읽을 때 인코딩 설정을 해서 한글 데이터를 올바르게 읽을 수 있도록 파라미터에 인코딩 코드를 같이 넣어줍니다.
StreamReader reader = new StreamReader(httpwebresponse.GetResponseStream(), Encoding.GetEncoding("EUC-KR"));
인코딩 파라메터 값은 다음처럼 Encoding 객체에서 얻어올 수 있습니다.
모두 올바른 사용 방법이므로 코딩 환경에 맞춰 사용할 수 있습니다.
인코딩 클래스를 사용하려면 "System.Text" 네임스페이스가 필요합니다.
Encoding.GetEncoding("EUC-KR");
Encoding.GetEncoding(51949); //euc-kr 코드 페이지 번호
System.Text.Encodng.GetEncoding("euc-kr"); //대소문자 구분하지 않음
Encoding.GetEncoding("UTF-8");
System.Text.Encoding.UTF8;
Encoding.GetEncoding(65001); //utf-8 코드 페이지 번호
Encoding.UTF8;
인코딩 전체 코드 목록은 다음 경로에서 확인할 수 있습니다.
https://learn.microsoft.com/en-us/dotnet/api/system.text.encoding?view=net-7.0
Encoding Class (System.Text)Represents a character encoding.learn.microsoft.com
원격 사이트에서 데이터를 읽는 완성 샘플 코드는 다음과 같습니다.
//HttpWebRequest 객체 생성
HttpWebRequest httpwebrequest = (HttpWebRequest)HttpWebRequest.Create("https://remotedomain.com/url/getjson?params=");
//객체 환경 설정
httpwebrequest.Method = "GET"; //GET, POST
httpwebrequest.Timeout = 30 * 1000; // 요청 타임 아웃 시간 - ms
httpwebrequest.Headers.Add("Authorization", "인증값"); // 요청 헤더 값 추가. 파라메터, 인증 정보, 인증키 등
httpwebrequest.UserAgent = ".NET Framework 4.8"; // User Agent 값. 없어도 가능
httpwebrequest.ContentType = "application/json"; //
//요청을 전송해서 응답 객체에 결과를 받음
HttpWebResponse httpwebresponse = null;
try
{
httpwebresponse = (HttpWebResponse)httpwebrequest.GetResponse();
}
catch (WebException we)
{
httpwebresponse = (HttpWebResponse)we.Response;
}
// 응답 코드가 완료 값이 200(HttpStatusCode.OK) 이면 데이터 처리
if (httpwebresponse.StatusCode == HttpStatusCode.OK)
{
//응답 데이터 인코딩에 맞춰 스트림 리더로 데이터 읽을 준비
StreamReader reader = new StreamReader(httpwebresponse.GetResponseStream(), Encoding.GetEncoding("EUC-KR")); //EUC-KR, UTF-8
//응답 텍스트 데이터를 얻고
string responseText = reader.ReadToEnd();
//데이터가 있으면
if(!string.IsNullOrEmpty(responseText))
{
//데이터 처리 코드 추가
}
reader.Close();
}
//응답 객체 닫기
httpwebresponse.Close();