HttpWebRequest 활용
웹 클라이언트 프로그래밍에서 간단한 WebClient 보다 세밀한 제어를 원할 경우, HttpWebRequest와 HttpWebResponse 클래스를 사용할 수 있다.
사실 WebClient는 HttpWebRequest와 HttpWebResponse 클래스를 내부적으로 사용하고 있는 Wrapper 클래스이다.
HttpWebRequest GET 예제
일반적으로 HttpWebRequest 객체는 WebRequest.Create() 메서드를 사용하여 생성한다. 이렇게 생성된 HttpWebRequest 객체에
GET, POST, PUT, DELETE, HEAD 등의 HTTP Verb를 Method 속성에 지정할 수 있으며, Headers 컬렉션에 필요한 HTTP 헤더를 추가할 수 있고,
기타 다양한 HttpWebRequest 속성들을 설정할 수 있다. 아래 예제는 웹 테스트 사이트인 httpbin.org에 HTTP GET을 호출한 예이다.
string url = "https://httpbin.org/get"; //테스트 사이트
string responseText = string.Empty;
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
request.Method = "GET";
request.Timeout = 30 * 1000; // 30초
request.Headers.Add("Authorization", "BASIC SGVsbG8="); // 헤더 추가 방법
using (HttpWebResponse resp = (HttpWebResponse)request.GetResponse())
{
HttpStatusCode status = resp.StatusCode;
Console.WriteLine(status); // 정상이면 "OK"
Stream respStream = resp.GetResponseStream();
using (StreamReader sr = new StreamReader(respStream))
{
responseText = sr.ReadToEnd();
}
}
Console.WriteLine(responseText);
HttpWebRequest 객체로부터 GetResponse() 메서드를 호출하면 HTTP Request를 웹서버에 보내고 HTTP Response를 받아오게 된다.
리턴된 HttpWebResponse 객체는 HTTP Response와 관련된 여러 속성들 (예: StatusCode)을 가지고 있으며, Response 데이타 내용은
GetResponseStream() 메서드로부터 얻어낸 스트림을 읽어 가져올 수 있다.
HttpWebRequest POST 예제
HttpWebRequest에서 POST를 하는 과정은 기본적으로 GET을 하는 과정과 비슷하다. 단 POST를 하는 경우에는
HttpWebRequest에서 Post할 데이타를 Request Stream에 추가하는 과정이 필요하다.
POST 데이타 추가 과정에서 가장 먼저 Post할 문자열 데이타를 바이트 배열로 변경한 후,
ContentLength 속성에 데이타 바이트수를 설정한다. 다음 HttpWebRequest 객체로부터 GetRequestStream()를 호출하여
Request Stream 객체를 얻어내고 이를 통해 데이타 바이트 배열을 쓰고 스트림을 닫으면 된다.
이후 GetResponse()을 호출하여 HTTP Response를 처리하는 과정은 GET 과 동일하다.
string url = "https://httpbin.org/post";
string data = "{ \"id\": \"101\", \"name\" : \"Alex\" }";
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
request.Method = "POST";
request.ContentType = "application/json";
request.Timeout = 30 * 1000;
//request.Headers.Add("Authorization", "BASIC SGVsbG8=");
// POST할 데이타를 Request Stream에 쓴다
byte[] bytes = Encoding.ASCII.GetBytes(data);
request.ContentLength = bytes.Length; // 바이트수 지정
using (Stream reqStream = request.GetRequestStream())
{
reqStream.Write(bytes, 0, bytes.Length);
}
// Response 처리
string responseText = string.Empty;
using (WebResponse resp = request.GetResponse())
{
Stream respStream = resp.GetResponseStream();
using (StreamReader sr = new StreamReader(respStream))
{
responseText = sr.ReadToEnd();
}
}
Console.WriteLine(responseText);
바이너리 데이타 처리 / 파일 다운로드
HttpWebRequest에서 바이너리 데이타나 파일을 다운로드 받기 위해서는 Response Stream에서 직접 바이트 데이타를 저장하면 된다.
WebResponse객체의 GetResponseStream() 메서드는 Response 스트림을 리턴하는데, 이 Stream 객체의 Read() 메서드를 사용하여 바이너리 데이타를
바이트 배열에 읽어 들일 수 있다. 바이너리 파일로의 저장은 이 바이트 배열을 파일에 쓰면 된다.
아래 예제는 테스트 사이트에서 이미지 파일을 다운받아 파일로 저장하는 예이다.
string url = "http://httpbin.org/image/png";
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
request.Method = "GET";
// Response 바이너리 데이타 처리. 이미지 파일로 저장.
using (WebResponse resp = request.GetResponse())
{
var buff = new byte[1024];
int pos = 0;
int count;
using (Stream stream = resp.GetResponseStream())
{
using (var fs = new FileStream("image.png", FileMode.Create))
{
do
{
count = stream.Read(buff, pos, buff.Length);
fs.Write(buff, 0, count);
} while (count > 0);
}
}
}