[개발] C# - HttpRequest GET 호출하기

in mini.topia3 months ago

안녕하세요 @realmankwon 입니다.

일전에 C#에서 HttpRequest POST 호출하기에 대해서 작성을 한 적이 있습니다.

[개발] C# 에서 POST 방식으로 웹 API 호출하기

그때 정보를 찾았을때 GET은 Method만 변경시켜주면 된다고 봤었는데 실제로 GET으로 변경을 하니 다음과 같이 에러가 발생하였습니다.

System.Net.ProtocolViolationException: 이 verb-type으로 content-body를 보낼 수 없습니다. 위치: System.Net.HttpWebRequest.CheckProtocol(Boolean onRequestStream) 위치: System.Net.HttpWebRequest.GetRequestStream(TransportContext& context) 위치: System.Net.HttpWebRequest.GetRequestStream() 위치:

다음이 그때 찾았던 소스입니다.

// Create a request using a URL that can receive a post.
WebRequest request = WebRequest.Create("http://www.contoso.com/PostAccepter.aspx ");
// Set the Method property of the request to POST.
request.Method = "POST";

// Create POST data and convert it to a byte array.
string postData = "This is a test that posts this string to a Web server.";
byte[] byteArray = Encoding.UTF8.GetBytes(postData);

// Set the ContentType property of the WebRequest.
request.ContentType = "application/x-www-form-urlencoded";
// Set the ContentLength property of the WebRequest.
request.ContentLength = byteArray.Length;

// Get the request stream.
Stream dataStream = request.GetRequestStream();
// Write the data to the request stream.
dataStream.Write(byteArray, 0, byteArray.Length);
// Close the Stream object.
dataStream.Close();

// Get the response.
WebResponse response = request.GetResponse();
// Display the status.
Console.WriteLine(((HttpWebResponse)response).StatusDescription);

// Get the stream containing content returned by the server.
// The using block ensures the stream is automatically closed.
using (dataStream = response.GetResponseStream())
{
    // Open the stream using a StreamReader for easy access.
    StreamReader reader = new StreamReader(dataStream);
    // Read the content.
    string responseFromServer = reader.ReadToEnd();
    // Display the content.
    Console.WriteLine(responseFromServer);
}

// Close the response.
response.Close();



위의 소스에서 Stream dataStream = request.GetRequestStream(); 이 구문에서 에러가 발생하였습니다.
아무래도 GET에서는 저 방법으로 리턴을 받지 않는 것 같았습니다.

그래서 Method에 따라서 호출하는 방법을 변경하였습니다.
GET 을 호출할 때는 GetRequestStream을 호출하지 않도록 하였습니다.

다음은 변경한 내용입니다.

protected String HttpCall(String p_sUrl, String p_sParam, String p_sMethod)
{
    try
    {
        HttpWebRequest httpWebRequest = null;
        // 인코딩 UTF-8
        byte[] sendData = UTF8Encoding.UTF8.GetBytes(p_sParam);

        if (p_sMethod == "POST")
        {
            httpWebRequest = (HttpWebRequest)WebRequest.Create(p_sUrl);
            httpWebRequest.ContentType = "application/x-www-form-urlencoded; charset=UTF-8";
            httpWebRequest.Method = p_sMethod;
            httpWebRequest.ContentLength = sendData.Length;

            Stream requestStream = httpWebRequest.GetRequestStream();
            requestStream.Write(sendData, 0, sendData.Length);
            requestStream.Close();
        } else if (p_sMethod == "GET")
        {
            httpWebRequest = (HttpWebRequest)WebRequest.Create(p_sUrl + "?" + p_sParam);
            httpWebRequest.Method = p_sMethod;
        }

        HttpWebResponse httpWebResponse;
        using (httpWebResponse = (HttpWebResponse)httpWebRequest.GetResponse())
        {
            StreamReader streamReader = new StreamReader(httpWebResponse.GetResponseStream(), Encoding.GetEncoding("UTF-8"));
            string result = streamReader.ReadToEnd();
            return result;
        }
    }
    catch(Exception e)
    {
        Console.WriteLine("error: " + e);
        return String.Empty;
    }
}

변경한 이후에는 잘 동작을 하고 있습니다.
참고로 호출시 입력되는 파라미터는 다음과 같은 String 형을 넘겨줍니다.

String[] data = new String[2];
data[0] = "name";   
data[1] = "phone_no";

String sData = String.Format("name={0}&phone_no={1}", data[0], data[1]);

이 또한 필요하신 분들이 계시길...^^:;