มี serializationfilters แบบกำหนดเองหลายอย่างที่สามารถทำให้ชีวิตของคุณง่ายขึ้น (ต้องใช้ Flex 4)
การใช้รูปแบบการออกแบบคอมโพสิตสำหรับตัวกรองการทำให้เป็นอนุกรม HTTP แทนที่วิธีการใด ๆ ของ 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วิธีการที่ไม่ได้รับการแทนที่จะถูกจัดการโดยใช้ serializationFilter ปกติ
ใช้วิธีการ serializeParameters , contentTypeProvider และวิธีการ serializeURL
อนุญาตให้คุณส่งคำกริยา HTTP ที่กำหนดเองนอกเหนือจาก Get หรือ Post ซึ่งไม่ได้รับการสนับสนุนโดย Flash Player โดยค่าเริ่มต้น คุณสามารถระบุหนึ่งในสามวิธีที่เป็นไปได้ในการทำเช่นนั้น:
methodOverride="header" ) อย่าลืมอัปเดตไฟล์ crossdomain.xml ของคุณเพื่ออนุญาตให้ส่งส่วนหัวไปยังโดเมนอื่น ๆ_method กับ URL ทั้งหมด ( methodOverride="url" )_method ( methodOverride="variable" ) สิ่งนี้จะบังคับให้คำขอของคุณเป็นอนุกรมเป็น application/x-www-form-urlencodedตัวกรองการทำให้เป็นอนุกรมนี้ยังสามารถใช้ในการสร้าง URL แบบไดนามิกที่พารามิเตอร์ tokenized containt (ล้อมรอบในวงเล็บเหลี่ยม)
<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
การร้องขอแบบอนุกรมและ deserialize ตอบกลับใน JSON ด้วยตัวแยกวิเคราะห์ JSON พื้นเมืองที่รวดเร็ว (เฉพาะในเวอร์ชัน FP11; เวอร์ชัน FP9 นั้นอาศัยตัวแยกวิเคราะห์ JSON ของ AS3Corelib) การร้องขอและการตอบกลับสามารถแปลงจากและเป็นวัตถุที่พิมพ์ได้ทันที มีคุณสมบัติการแมปวัตถุต่อไปนี้:
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 ที่จัดการกับการเปลี่ยนแปลงประเภทในขณะที่ชั้นเด็กคอนกรีตจัดการกับการทำให้เป็นอนุกรมข้อมูลจริงและ deserialization
การตั้ง 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 สามารถใช้เพื่อให้ตัวจัดการการดำเนินงานตรงไปตรงมามากขึ้น มันเลียนแบบคลาส AsyncResponder ของ Flex แต่มีฟังก์ชั่นผลลัพธ์/ความผิดที่แตกต่างกัน ลายเซ็น Handler ผลลัพธ์ที่ถูกต้องคือ function(valueObject:Object):void ฟังก์ชั่นตัวจัดการผลลัพธ์จะได้รับ ResultEvent.result ค่าดังนั้นคุณสามารถตั้งค่าประเภทผลลัพธ์ของคุณในตัวจัดการ: function(valueObject:MyResultClass):void ลายเซ็น Handler Fault Fault ที่ถูกต้องคือ 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);
}