![]() |
|
||||||||||
|
|||||
|
Регистрация: Dec 2008
Сообщений: 12
|
Доброго дня
я новайс во Флексе, посему извините за быть может дурной вопрос суть вопроса такова - как более оптимально передавать объекты на вебсервис и обратно? Простые типы, вроде интов и стрингов туда-сюда ходят нормально а вот какой-то класс чуток посложнее вызывает у меня трудности. Сразу пример есть класс package my.entity;
import java.io.Serializable;
public class Unit implements Serializable {
private int id;
private int type;
private String name;
public Unit() {
}
public Unit(int type, String name) {
this.type = type;
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getType() {
return type;
}
public void setType(int type) {
this.type = type;
}
@Override
public String toString() {
return "Unit: " + ":" + type + ":" + name;
}
}
если я рассматриваю результат operation, как xml, то получаю следующую: <getTurnResponse xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns="http://my/xsd">
<return type="my.entity.Unit">
<name>unit1</name>
<type>1</type>
</return>
</getTurnResponse>
И как с клиента на сервер передавать? Тоже переводить руками в xml, а на стороне сервера собирать объект? Думаю, что есть нормальные решения, однако в хелпе не нашел и первая попытка прогуглить тоже успеха не принесла PS. Впрочем распарсить сие тоже не получается. Как в хелпе - не работает |
|
|||||
|
Flash Aксакал
Регистрация: Jun 2005
Сообщений: 636
|
Для класс мапинга класс надо регистрировать в mx.rpc.xml.SchemaTypeRegistry (смотреть >> тут << ). Потом ваш VO объект должен содержать либо public свойства, либо get | set свойства, а не getter/setter методы.
Что то типа Потом, если Вы пользуетесь Flex Builder'ом, то начиная с 3 версии, у него есть генератор набора классов для клиента под WSDL вебсервиса. Menu - > Data - > Import Web Service. Один раз просматрев что генерируется можно лучше понять как именно флекс работает с вебсервисами. Последний раз редактировалось 7thsky™; 10.12.2008 в 03:39. |
|
|||||
|
Регистрация: Dec 2008
Сообщений: 12
|
Супер! По идее это отличная возможность решения проблемы, но...
после автогенерации классов из wsdl я пытаюсь дернуть один из методов и получаю ошибку TypeError: Error #1090: XML parser failure: element is malformed. at mx.rpc.soap::SOAPEncoder/encodeOperationAsDocumentLiteral()[E:\dev\3.0.x\frameworks\projects\rpc\src\mx\rpc\soap\SOAPEncoder.as:379] at mx.rpc.soap::SOAPEncoder/encodeBody()[E:\dev\3.0.x\frameworks\projects\rpc\src\mx\rpc\soap\SOAPEncoder.as:322] at mx.rpc.soap::SOAPEncoder/encodeEnvelope()[E:\dev\3.0.x\frameworks\projects\rpc\src\mx\rpc\soap\SOAPEncoder.as:188] at mx.rpc.soap::SOAPEncoder/encodeRequest()[E:\dev\3.0.x\frameworks\projects\rpc\src\mx\rpc\soap\SOAPEncoder.as:158] at webservices::BaseWS/call()[D:\Work\Flex\TestWS\src\webservices\BaseWS.as:225] at webservices::BaseWS/getTestUnit()[D:\Work\Flex\TestWS\src\webservices\BaseWS.as:177] at webservices::WS/getTestUnit()[D:\Work\Flex\TestWS\src\webservices\WS.as:88] at webservices::WS/getTestUnit_send()[D:\Work\Flex\TestWS\src\webservices\WS.as:98] at testWS/__myButton_click()[D:\Work\Flex\TestWS\src\testWS.mxml:3] <?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" xmlns:srv="webservices.*">
<mx:Button id="myButton" label="Call operation" click="myService.getTestUnit_send()" />
<srv:WS id="myService">
<srv:login_request_var>
<srv:Login_request username="7thsky" />
</srv:login_request_var>
</srv:WS>
</mx:Application>
public class WS {
public boolean login(String username){
log.error("login:" + username);
return true;
}
}
![]() |
|
|||||
|
Flash Aксакал
Регистрация: Jun 2005
Сообщений: 636
|
еще б знать что такое WS и что конкретно делает метод getTestUnit () да и посмотреть что приходит и уходит с сервера.
А так только гадать. |
|
|||||
|
Регистрация: Dec 2008
Сообщений: 12
|
сделаем поправку на позднее время. Повторил перегенерацию кода в клиенте - ошибка пропала. Но всё равно не всё ладно в датском королевстве.
теперь в евенте сидит объект правильного типа (ура!), но пустой ([object Unit] : NaN:NaN:null) ![]() я приаттачил сырцы в архив, чтоб не делать огромный пост тут и не было угадайки, надеюсь, получится в них глянуть? !.zip - там два серверных класса, WS (вебсервис) и сам Unit, а так же сгенеренный wsdl и то, что сгенерил ФлексБилдер на стороне клиента |
|
|||||
|
Flash Aксакал
Регистрация: Jun 2005
Сообщений: 636
|
в архиве нету описания xsd твоего типа Unit (XSD линкованный: xmlns:ns0="http://entity.my/xsd").
Потом стоит все таки посмотреть что именно между сервером и флэшем проходит (в каком нить снифере например) А так вроде все правильно. З.Ы. А генератор адобе подравили в 2.0.1 был такой ужасный. З.Ы. Если клиент только на флэше, может стоит посмотреть в сторону AMF (там и класс маппинг проще, и все что нужно уже для этого встроенно в флэш плеер) AMF, OpenAMF, BlazeDS |
|
|||||
|
Регистрация: Dec 2008
Сообщений: 12
|
Цитата:
вот: <xs:schema xmlns:ax21="http://entity.my/xsd" attributeFormDefault="qualified" elementFormDefault="qualified" targetNamespace="http://entity.my/xsd">
<xs:complexType name="Unit">
<xs:sequence>
<xs:element minOccurs="0" name="id" type="xs:int"/>
<xs:element minOccurs="0" name="name" nillable="true" type="xs:string"/>
<xs:element minOccurs="0" name="type" type="xs:int"/>
</xs:sequence>
</xs:complexType>
</xs:schema>
Цитата:
Цитата:
)По правде говоря, я к вебсервисам вышел после того, как попробовал HTTPService, но они чем-то мне не понравились... Потом я взялся за OpenAMF, но там погряз окончательно... мало документации, не понятная, туториала не нашел... короче, забросил и остались мне вебсервисы. Жаль, что я не наткнулся на BlazeDS раньше. Спасибо за подсказку. PS. Наверное вскорости стоит ожидать вопросов по теме BlazeDS ![]() PPS. И, для закрытия гештальта, в каких случаях стоит использовать вебсервисы, а в каких можно обойтись маппингом, который предоставляет тот же BlazeDS? Если у меня несколько разных приложений работает с сервером (типа сайт, удаленный клиент), то лучше вебсервис? Или по другому критерию нужность определяется? Последний раз редактировалось jerzy; 14.12.2008 в 21:56. |
|
|||||
|
Flash Aксакал
Регистрация: Jun 2005
Сообщений: 636
|
Проглядел я описание
![]() Насчет что лучше: (Я тоже не большой спец) Если использовать несколько клиентов, то я б использовал более общий протокол - типа SOAP, а не AMF. А посмотреть результат можно впринципе и без снифера, поставив breakpoint в result handler'e и пробежавшись по стэку вызовов методов. З.Ы. Я обычно таким образом вызываю методы Вебсервисов var wsInstance:WS = new WS (); var token:AsyncToken = wsInstance.getTestUnit(); token.addResponder = new mx.rpc.Responder ( wsGetTestUnitResultHandler, wsGetTestUnitFaultHandler); function wsGetTestUnitResultHandler (evt:ResultEvent):void {} function wsGetTestUnitFaultHandler (evt:FaultEvent):void {} |
![]() |
![]() |
Часовой пояс GMT +4, время: 19:33. |
|
|
« Предыдущая тема | Следующая тема » |
| Теги |
| webservice , xml |
|
|