[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();