관리 메뉴

심재운 블로그

application/x-www-form-urlencoded 형태의 BODY 파라미터로 web api 호출 본문

닷넷관련/ASP.NET MVC & Core

application/x-www-form-urlencoded 형태의 BODY 파라미터로 web api 호출

재우니 2019. 5. 13. 19:39


application/x-www-form-urlencoded 형태의 BODY 파라미터로 web api 호출


ASP.NET MVC 의 WEB API 를 활용하여 content-type 이 application/x-www-form-urlencoded 형식 즉 '키=값&키=값' 형태로 데이터를 post 형식으로 외부에서 전송 받을 경우, 키=값 다중의 데이터를 FormDataCollection 객체를 통해 쉽게 얻을 수 있습니다.


[AllowAnonymous]
public class ValueController : ApiController
{
[AllowAnonymous]
[HttpPost]
public string Authenticate(FormDataCollection form)
{
var id = form.Get("id");
var pw = form.Get("pw");

return id + "_" + pw;
}
}


아래 2개의 샘플 예제는 http://도메인/api/Value/Authenticate 의 web api 를 호출하기 위한 wapper 클래스로 보시면 됩니다. 


첫번째 샘플예제 

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Text;
using System.Web;

namespace UnivDefault.Web.Helpers
{
/// <summary>
/// 사용법
/// MyWebRequest myRequest = new MyWebRequest("http://도메인/api/Value/Authenticate", "POST", "id=shims&pw=pwd");
/// var res = myRequest.GetResponse();
/// </summary>
public class MyWebRequest
{
private WebRequest request;
private Stream dataStream;

public string Status { get; set; }

public MyWebRequest(string url)
{
// post 로 받을 수 있는 URL 을 사용하여 REQUEST 객체를 생성한다.
request = WebRequest.Create(url);
}

public MyWebRequest(string url, string method)
: this(url)
{

if (method.Equals("GET") || method.Equals("POST"))
{
// REQUEST 의 METHOD 속성을 POST 또는 GET 으로 설정한다.
request.Method = method;
}
else
{
throw new Exception("Invalid Method Type");
}
}

public MyWebRequest(string url, string method, string data)
: this(url, method)
{
// POST 로 보낼 DATA 를 BYTE 배열로 변환하여 담는다.
string postData = data;
byte[] byteArray = Encoding.UTF8.GetBytes(postData);
// WebRequest 의 ContentType 속성에 설정한다.
request.ContentType = "application/x-www-form-urlencoded";
// WebRequest 의 ContentLength 속성에 설정한다.
request.ContentLength = byteArray.Length;
// REQUEST 의 stream 을 가져온다.
dataStream = request.GetRequestStream();
// data 를 REQUEST 의 stream 에 Write 한다.
dataStream.Write(byteArray, 0, byteArray.Length);
// Stream 객체를 닫는다.
dataStream.Close();

}

public string GetResponse()
{
// 요청에 대한 응답을 받는다.
WebResponse response = request.GetResponse();

// 응답에 대한 상태설명 값을 얻는다.
this.Status = ((HttpWebResponse)response).StatusDescription;
// 요청받은 서버에 의해 반환받은 모든 content 가 포함되어져 있는 stream 을 받는다.
dataStream = response.GetResponseStream();
// StreamReader 객체를 통해 stream 을 쉽게 접근하여 열 수 있다.
StreamReader reader = new StreamReader(dataStream);
// 모든 content 를 끝까지 읽는다.
string responseFromServer = reader.ReadToEnd();
// Stream 을 초기화한다.
reader.Close();
dataStream.Close();
response.Close();

return responseFromServer;
}

}
}


사용법은 간단합니다. post 로 보낼것인지 get 방식으로 보낼 것인지 지정하고, 키=값 형태로 데이터를 전송합니다.

MyWebRequest myRequest = new MyWebRequest("http://도메인/api/Value/Authenticate", "POST", "id=shims&pw=pwd");
var res = myRequest.GetResponse();


두번째 샘플예제

- 응답받을 때 euc-kr 일 경우를 대비함.

private string PostRequest(string url)
{
HttpWebRequest httpWebRequest = (HttpWebRequest)WebRequest.Create(url);
httpWebRequest.ContentType = "application/x-www-form-urlencoded; charset=UTF-8";
httpWebRequest.Method = "POST";

string postData = String.Format("id={0}&pw={1}", "luckshim", "XXXXXX");
byte[] sendData = UTF8Encoding.UTF8.GetBytes(postData);
httpWebRequest.ContentLength = sendData.Length;

using (var stream = httpWebRequest.GetRequestStream())
{
stream.Write(sendData, 0, sendData.Length);
stream.Close();
}

string result = "";

try
{
using (var response = httpWebRequest.GetResponse() as HttpWebResponse)
{
if (httpWebRequest.HaveResponse && response != null)
{
Encoding encode; //응답받을 때 utf-8 또는 euc-kr 인지 확인 후 읽음.
if (response.CharacterSet.ToLower() == "utf-8")
{
encode = Encoding.GetEncoding("UTF-8");
}
else
{
encode = Encoding.Default;
}

using (var reader = new StreamReader(response.GetResponseStream(), encode))
{
result = reader.ReadToEnd();
}
}
}
}
catch (WebException e)
{
if (e.Response != null)
{
using (var errorResponse = (HttpWebResponse)e.Response)
{
Encoding encode;
if (errorResponse.CharacterSet.ToLower() == "utf-8")
{
encode = Encoding.GetEncoding("UTF-8");
}
else
{
encode = Encoding.Default;
}

using (var reader = new StreamReader(errorResponse.GetResponseStream(), encode))
{
string error = reader.ReadToEnd();
result = error;
}
}

}
}

return result;

}


var res1 = PostRequest("http://도메인/api/Value/Authenticate");


0 Comments
댓글쓰기 폼