[Flex3.0] HttpService 사용시 Parameters 보내기


1. 첫번째 방법 mxml 
<mx:HTTPService>
 <mx:request>
  <paramName1>val1</paramName1 >
 </mx:request>
</mx:HTTPService>
get 방식으로 보내고자 한다면 url 속성에 바로 넘겨도 된다.
<mx:HTTPService url="urlAddress?paramName1=val1">

2. 두번째 방법 AS 
var params:Object = new Object();
params[paramName1] = "val1";
var httpService:HTTPService = new HTTPService();
httpService.contentType = HTTPService.CONTENT_TYPE_FORM;
httpService.url = "url address";
httpService.send(params);
Object 객체를 이용하여 파라미터를 넘긴다.
params[paramName1] = "val1"; 를 params.paramName1 = "val1"; 이렇게 해도 결과는 똑같다.
이는 Object가 Dynamic 객체라서 가능하다.
AS 또한 url 속성에 get 방식으로 파라미터 전송이 가능하다.



소스 파악해보기.

일단 api 를 살펴보자.
send () Methods  
public function send(parameters:Object = null):AsyncToken

HTTPService 요구를 실행합니다. Parameters는 옵션입니다만, 지정하는 경우는 contentType 에 응해, 이름과 값의 페어가 들어간 object 또는 XML object로 할 필요가 있습니다.

Parameters
parameters:Object (default = null)

반환값
AsyncToken — Asynchronous Completion Token 를 나타내는 object입니다. result 또는 fault 이벤트의 call property로 사용 가능한 object와 같게 됩니다.

요렇게만 나와있을 뿐.. 파라미터 객체를 어떻게 만들어서 넘기는지는 없다.

HttpService 의 소스중 send() 함수 소스를 보니 크게 두가지가 보인다. (역시 아는만큼 보인다 ㅠㅠ...).
1. if (contentType == CONTENT_TYPE_XML)
2. else if (contentType == CONTENT_TYPE_FORM)

첫번째는 파라미터가 xml형태로 넘어왔을때이고 두번째는 dynamic 객체가 넘어왔을 때다.
xml 을 파싱하는 소스는 복잡했다... (워... 무슨말인지... 다음에 자세하게 봐야겠다 ㅠㅠ..)

두번째.  객체를 파싱하는 소스를 보자.

else if (contentType == CONTENT_TYPE_FORM)
{
paramsToSend = {};
var val:Object;

//get all dynamic and all concrete properties from the parameters object
var classinfo:Object = ObjectUtil.getClassInfo(parameters);

for each (var p:* in classinfo.properties)
{
val = parameters[p];
if (val != null)
{
if (val is Array)
paramsToSend[p] = val;
else
paramsToSend[p] = val.toString();
}
}
}

위의 소스를 살펴보면 일단 이 객체의 맴버변수인 'contentType'이 'CONTENT_TYPE_FORM' 일때 이 분기문이 실행 된다는 것을 알 수 있다.

그리고 parameters 를 ObjectUtil.getClassInfo() 메소드로 var classinfo:Object 객체를 생성하는 것을 알 수 있다.
(ObjectUtil 클래스는 전에 Object 를 copy 할 때 썼던 클래스이다.)

getClassInfo() 메소드에 잠깐 살펴보면 "지정된 object에 관해서, 클래스 정보 및 클래스 property를 돌려줍니다."
라고 기술되어 있다. 

 다시 소스로 돌아와서 그렇게 생성한 classinfo를 for each()구문으로 모든 properties 를 p:* 로 할당하게 하였다.

for each (var p:* in classinfo.properties)
{
val = parameters[p];
if (val != null)
{
if (val is Array)
paramsToSend[p] = val;
else
paramsToSend[p] = val.toString();
}
}



소스를 보면 p를 key로 이용하여 parameters에서 해당 value을 찾아서 paramsToSend에 다시 값을 넣어주는 것을 볼수 있다.
이 paramsToSend 객체는 send() 메소드 끝부분에서 다음과 같이 쓰인다.

message.contentType = contentType;
message.method = method.toUpperCase();
if (contentType == CONTENT_TYPE_XML && message.method == HTTPRequestMessage.GET_METHOD){
message.method = HTTPRequestMessage.POST_METHOD;
}
message.body = paramsToSend;
message.httpHeaders = headers;
return invoke(message);