인생을 더 쉽게 만들 수있는 몇 가지 맞춤형 직렬화 필터가 있습니다 (Flex 4 필요).
HTTP 직렬화 필터를위한 복합 설계 패턴 구현. 다른 필터 인스턴스를 사용하여 5 개의 SerializationFilter 메소드를 무시하십시오.
<mx:HTTPService>
<mx:serializationFilter>
<rest:CompositeSerializationFilter>
<!-- Serialize requests in JSON -->
<rest:bodySerializer>
<rest:JSONSerializationFilter />
</rest:bodySerializer>
<!-- Deserialize replies in JSON -->
<rest:resultDeserializer>
<rest:JSONSerializationFilter />
</rest:resultDeserializer>
<!-- Build REST-style URLs dynamically -->
<rest:urlSerializer>
<rest:RESTSerializationFilter />
</rest:urlSerializer>
<!-- Use custom HTTP methods -->
<rest:parametersSerializer>
<rest:RESTSerializationFilter />
</rest:parametersSerializer>
<!-- Set request content type to application/json -->
<rest:contentTypeProvider>
<rest:RESTSerializationFilter requestContentType="application/json" />
</rest:contentTypeProvider>
</rest:CompositeSerializationFilter>
</mx:serializationFilter>
</mx:HTTPMultiService>재정의 할 수있는 SerializationFilter의 방법 :
deserializeResultgetRequestContentTypeserializeParametersserializeBodyserializeURL재정의되지 않은 메소드는 일반 직렬화 필터를 사용하여 처리됩니다.
serializeParameters , contentTypeProvider 및 serializeURL 방법을 구현합니다.
기본적으로 플래시 플레이어가 지원하지 않는 Get 또는 Post 이외의 사용자 정의 HTTP 동사를 보낼 수 있습니다. 가능한 세 가지 방법 중 하나를 지정할 수 있습니다.
methodOverride="header" ). CrossDomain.xml 파일을 업데이트하여 헤더가 다른 도메인으로 전송 될 수 있도록하는 것을 잊지 마십시오._method 매개 변수를 추가하십시오 ( methodOverride="url" )._method 매개 변수로 보내십시오 ( methodOverride="variable" ). 이렇게하면 귀하의 요청이 application/x-www-form-urlencoded 로 직렬화됩니다.이 직렬화 필터를 사용하여 토큰 화 된 매개 변수 (사각형 괄호로 둘러싸여 있음)를 연결하는 동적 URL을 구축하는 데 사용될 수 있습니다.
<fx:Declarations>
<rest:RESTSerializationFilter
id="restSerializer"
methodOverride="variable"
requestContentType="application/x-www-form-urlencoded" />
<mx:HTTPMultiService
id="service"
baseURL="http://example.com/api/"
>
<mx:serializationFilter>
<!-- contentTypeProvider is required in order to convert custom HTTP verbs to POST
and to set content type to 'application/x-www-form-urlencoded'. -->
<!-- urlSerializer will replace square bracket tokens in URLs. -->
<!-- parametersSerializer will add a '_method' variable to your requests, if needed. -->
<rest:CompositeSerializationFilter
contentTypeProvider="{restSerializer}"
urlSerializer="{restSerializer}"
parametersSerializer="{restSerializer}" />
</mx:serializationFilter>
<mx:operationList>
<!--
[ID] and any other token will be automatically
replaced by variables from operation arguments object
-->
<mx:HTTPOperation
name="getUser"
url="User/[ID]" />
<!--
Request will be sent as a POST request
with a "_method"="DELETE" variable
-->
<mx:HTTPOperation
name="deleteUser"
url="User/[ID]"
method="DELETE" />
</mx:operationList>
</mx:HTTPMultiService>
</fx:Declarations> import mx.rpc.AbstractOperation;
import mx.rpc.AsyncToken;
import vo.User;
private function getUser(userId:uint):AsyncToken
{
var operation:AbstractOperation = service.getOperation("getUser");
operation.arguments = { ID: userId }; //replace URL tokens
return operation.send();
//You can also add your variable to requests:
//return operation.send({ varname: "varvalue" });
} deserializeResult , contentTypeProvider 및 serializeBody 메소드를 구현합니다.
빠른 기본 JSON 파서 (FP11 버전에서만; FP9 버전은 AS3Corelib의 JSON 파서에 의존하고 있음)로 JSON 에서 요청을 일련의 요청 및 필사적으로 답장합니다. 요청 및 답변은 즉시 강력한 물체에서 전환 할 수 있습니다. 다음 객체 매핑 기능을 사용할 수 있습니다.
ArrayElementType 메타 태그를 사용하여 타이핑 된 객체의 배열을 맵핑 할 수 있습니다.Transient 메타 태그는 요청과 응답 모두에서 존중됩니다./Date(1325376000000)/ 의 날짜 문자열은 Date 개체로 변환 할 수 있으며 그 반대도 마찬가지입니다. 예를 들어, 당신이 이것을받을 때 :
{
"owner":{
"birthday":"/Date(1325376000000)/",
"firstName":"John",
"lastName":"Smith"
}
"wheels":[
{ "position": { "x":1, "y":1 } },
{ "position": { "x":1, "y":-1 } },
{ "position": { "x":-1, "y":1 } },
{ "position": { "x":-1, "y":-1 } }
]
}
public class User
{
public var birthday:Date;
public var firstName:String;
public var lastName:String;
}
public class Car
{
public var owner:User;
[ArrayElementType("vo.Wheel")]
public var wheels:Array;
//You can just use vectors instead
//public var wheels:Vector.<Wheel>
}
import flash.geom.Point;
public class Wheel
{
public var position:Point;
} <fx:Declarations>
<mx:HTTPMultiService
id="service"
baseURL="http://example.com/api/"
>
<mx:serializationFilter>
<rest:CompositeSerializationFilter>
<!-- Serialize requests from objects to JSON. -->
<rest:bodySerializer>
<rest:JSONSerializationFilter />
</rest:bodySerializer>
<!-- Deserialize replies from JSON to strongly-typed objects. -->
<rest:resultDeserializer>
<rest:JSONSerializationFilter />
</rest:resultDeserializer>
<!-- Forces requests content type to be 'application/json'.
This is required in order to encode requests in JSON.
If content type is not changed either this way,
or manually on an operation, Flex will handle
request body encoding by itself. -->
<rest:contentTypeProvider>
<rest:RESTSerializationFilter requestContentType="application/json" />
</rest:contentTypeProvider>
<!-- This serializer is required for JSON requests. -->
<rest:parametersSerializer>
<rest:RESTSerializationFilter />
</rest:parametersSerializer>
</rest:CompositeSerializationFilter>
</mx:serializationFilter>
<mx:operationList>
<!--
Note that there is a resultElementType
property set on the operation
-->
<mx:HTTPOperation
name="getCar"
url="Car/[ID]"
method="GET"
resultElementType="{Car}"
result="onCarLoaded(event)" />
</mx:operationList>
</mx:HTTPMultiService>
</fx:Declarations> import mx.rpc.events.ResultEvent;
import vo.Car;
import vo.User;
import vo.Wheel;
private function onCarLoaded(event:ResultEvent):void
{
var car:Car = Car(event.result);
var wheels:Vector.<Wheel> = car.wheels;
var owner:User = car.owner;
var birthday:Date = owner.birthday;
} 객체 배열이 있다면…
[
{ "x":1, "y":5 },
{ "x":2, "y":4 },
{ "x":3, "y":3 },
{ "x":4, "y":2 },
{ "x":5, "y":1 }
]resultFormat="array" 및 resultElementType="{ElementClass}" 설정하여 강하게 유형 된 객체 배열로 수신 할 수 있습니다. 기본적으로 모든 어레이는 ArrayCollection 으로 래핑됩니다. 이 동작을 피하려면 작동 인스턴스에서 makeObjectsBindable="false" 설정하십시오. <mx:HTTPOperation
name="getPoints"
url="Points/[FROM]/[TO]"
resultFormat="array"
makeObjectsBindable="false"
resultElementType="{Point}"
result="onPointsLoaded(event)" /> private function onPointsLoaded(event:ResultEvent):void
{
trace(event.result.length);
for each(var point:Point in event.result)
trace(point.x + point.y);
} JSONSerializationFilter 유형 변환을 처리하는 추상 유형의 TypedSerializationFilter 를 구현하는 반면, 구체적인 아동 클래스는 실제 데이터 직렬화 및 사막화를 처리합니다.
다른 값으로 resultFormat 설정하면 array 및 object (기본값) 외에도 JSONSerializationFilter (또는 다른 TypedSerializationFilter )가 선택된 HTTPOperation 에서 억제됩니다.
deserializeResult , contentTypeProvider 및 serializeBody 메소드를 구현합니다.
JSONSerializationFilter 와 같은 방식으로 행동합니다. 옵션 xmlEncode 및 xmlDecode 속성을 사용하여 사용자 지정 직렬화 방법을 할당 할 수 있습니다.
<mx:HTTPService>
<mx:serializationFilter>
<rest:CompositeSerializationFilter>
<!-- Serialize requests from objects to XML. -->
<rest:bodySerializer>
<rest:XMLSerializationFilter xmlEncode="{doXmlEncode}" />
</rest:bodySerializer>
<!-- Deserialize replies from XML to strongly-typed objects. -->
<rest:resultDeserializer>
<rest:XMLSerializationFilter xmlDecode="{doXmlDecode}" />
</rest:resultDeserializer>
<!-- Forces requests content type to be 'application/xml'. -->
<rest:contentTypeProvider>
<rest:RESTSerializationFilter requestContentType="application/xml" />
</rest:contentTypeProvider>
<!-- This serializer is required for XML requests. -->
<rest:parametersSerializer>
<rest:RESTSerializationFilter />
</rest:parametersSerializer>
</rest:CompositeSerializationFilter>
</mx:serializationFilter>
</mx:HTTPMultiService> private function doXmlEncode(body:Object):XMLNode
{
return new XMLNode(1, '<body id="' + body.id + '"/>');
}
private function doXmlDecode(node:XMLNode):Object
{
return { id: node.attributes.id };
} CompositeSerializationFilter username 과 password 두 가지 새로운 속성으로 확장합니다. 모든 요청에 기본 HTTP 인증 헤더를 추가합니다.
<mx:HTTPService>
<mx:serializationFilter>
<rest:BasicAuthenticationSerializationFilter username="admin" password="qwerty">
<rest:bodySerializer>
<rest:XMLSerializationFilter />
</rest:bodySerializer>
<rest:resultDeserializer>
<rest:XMLSerializationFilter />
</rest:resultDeserializer>
<rest:contentTypeProvider>
<rest:RESTSerializationFilter requestContentType="application/xml" />
</rest:contentTypeProvider>
<rest:parametersSerializer>
<rest:RESTSerializationFilter />
</rest:parametersSerializer>
</rest:BasicAuthenticationSerializationFilter>
</mx:serializationFilter>
</mx:HTTPMultiService> CompositeSerializationFilter 확장합니다. 귀하의 요청에 Oauth 헤더를 작성하고 할당하는 데 사용할 수 있습니다.
<mx:HTTPService>
<mx:serializationFilter>
<rest:OAuthSerializationFilter id="oauthFilter" keySecret="kAcSOqF21Fu85e7zjz7ZN2U4ZRhfV3WpwPAoE3Z7kBw" tokenSecret="LswwdoUaIvS8ltyTt5jkRh4J50vUPVVHtR2YPi5kE">
<rest:bodySerializer>
<rest:XMLSerializationFilter />
</rest:bodySerializer>
<rest:resultDeserializer>
<rest:XMLSerializationFilter />
</rest:resultDeserializer>
<rest:contentTypeProvider>
<rest:RESTSerializationFilter requestContentType="application/xml" />
</rest:contentTypeProvider>
<rest:parametersSerializer>
<rest:RESTSerializationFilter />
</rest:parametersSerializer>
</rest:BasicAuthenticationSerializationFilter>
</mx:serializationFilter>
<mx:operationList>
<mx:HTTPOperation
name="getUser"
url="User/[ID]" />
</mx:operationList>
</mx:HTTPMultiService> import mx.rpc.AbstractOperation;
import mx.rpc.AsyncToken;
import mx.rpc.http.OAuthHeader;
import mx.rpc.utils.OAuthUtil;
import vo.User;
private function getUser(userId:uint):AsyncToken
{
var oauthData:OAuthHeader = new OAuthHeader();
oauthData.oauth_version = "1.0";
oauthData.oauth_consumer_key = "xvz1evFS4wEEPTGEFPHBog";
oauthData.oauth_token = "370773112-GmHxMAgYyLbNEtIKZeRNFsMKPR9EyMZeS9weJAEb";
oauthData.oauth_nonce = OAuthUtil.generateNonce();
oauthData.oauth_signature_method = OAuthHeader.SIGNATURE_METHOD_HMAC_SHA1;
oauthData.oauth_timestamp = OAuthUtil.getTimestamp();
var operation:AbstractOperation = service.getOperation("getUser");
operation.arguments = { ID: userId }; //replace URL tokens
oauthFilter.oauthData = oauthData;
return operation.send();
} 정적 mx.utils.TypeUtil 클래스는 위에 나열된 모든 유형 주물에 사용할 수 있습니다.
mx.rpc.OperationResponder 사용하여 작업 핸들러를보다 간단하게 만들 수 있습니다. Flex의 AsyncResponder 클래스를 모방하지만 다른 결과/오류 기능 서명이 있습니다. 유효한 결과 핸들러 서명은 function(valueObject:Object):void . 결과 핸들러 함수는 ResultEvent.result 값을 수신하므로 핸들러에서 결과 유형을 설정할 수 있습니다 : function(valueObject:MyResultClass):void . 유효한 결함 핸들러 서명은 function(fault:Fault):void .
import mx.rpc.OperationResponder;
import vo.User;
private function getUser():void
{
service.getOperation("getUser").send().addResponder(new OperationResponder(onResult, onFault));
}
private function onResult(user:User):void
{
trace(user.firstName);
}
private function onFault(fault:Fault):void
{
trace(fault.faultDetail);
}