BlazeDS AMFConnectionがもしや。。。。
全国AMFファンの皆様こんばんは。BlazeDSにAMFConnectionというJavaクライアントからAMFで通信して結果をサーバから取得するAPIが出来たので使ってみた。以下を参考にしてみた。
結論:あれ?なんか使いにくいかも。
まあコードはこんな感じになる。抜粋。
AMFConnection con = new AMFConnection(); con.addHttpRequestHeader(CONTENT_TYPE, CONTENT_TYPE_AMF); con.connect(serverPath); RemotingMessage remoting = new RemotingMessage(); remoting.setClientId(UUIDUtils.createUUID()); remoting.setDestination("haiku"); remoting.setOperation("checkHaiku"); HaikuData data = new HaikuData(); flex.messaging.io.ArrayList paramList = new flex.messaging.io.ArrayList(); paramList.add(data); remoting.setParameters(paramList); AcknowledgeMessage ack = (AcknowledgeMessage) con.call( "haiku.checkHaiku", new Object[] { remoting }); HaikuComment comment = (HaikuComment) ack.getBody(); System.out.println("========[" + comment.getComment() + ":" + comment.getPoint() + "]====");
なんだか使いにくいかもと思った点。
その1。
リクエストヘッダには明示的にコンテントタイプがAMFであることを明示しないといけない。
AMFConnectionなんだからそれデフォルトでやってくれると思ってました。
その2。
AMFConnection#call(コマンド名、引数)といういかにもなメソッドがあるのですが、おかしいかなここで渡せる引数はRemotingMessageなど限られた型のもののみでした。ここに自分で作ったDTOを必死で渡してClientStatusExceptionみたいなのが多発してハマリました。また第一引数のコマンドも特に何も使われずに未だに何かわかってないw
その3。
引数も限定されるので、やはり戻り値もAcknoledgeMessageのようにBlazeDSの型に限定されます。
というように、なんだかアレ?おかしいなおかしいなと思いつつやってたら、なんだか全部自前でやってもあんまり変わらないんじゃないかとおもいました。
以下が元のコード。
ActionMessage requestMessage = new ActionMessage(); RemotingMessage remoting = new RemotingMessage(); MessageBody body = new MessageBody(); body.setData(new Object[] { remoting }); requestMessage.addBody(body); remoting.setClientId(UUIDUtils.createUUID()); remoting.setDestination("haiku"); remoting.setOperation("checkHaiku"); HaikuData data = new HaikuData(); flex.messaging.io.ArrayList paramList = new flex.messaging.io.ArrayList(); paramList.add(data); remoting.setParameters(paramList); URL url = new URL(serverPath); URLConnection conn = url.openConnection(); conn.setDoOutput(true); conn.setDoInput(true); conn.setUseCaches(false); conn.setRequestProperty(CONTENT_TYPE, CONTENT_TYPE_AMF); SerializationContext serializationContext = SerializationContext .getSerializationContext(); MessageSerializer serializer = new AmfMessageSerializer(); outputStream = conn.getOutputStream(); AmfTrace trace = new AmfTrace(); serializer.initialize(serializationContext, outputStream, trace); serializer.writeMessage(requestMessage); MessageDeserializer deserializer = new AmfMessageDeserializer(); inputStream = conn.getInputStream(); deserializer.initialize(serializationContext, inputStream, trace); System.out.println("################"); System.out.println(trace.toString()); ActionMessage responseMessage = new ActionMessage(); deserializer.readMessage(responseMessage, new ActionContext()); AcknowledgeMessage ack = (AcknowledgeMessage) responseMessage .getBody(0).getData(); HaikuComment comment = (HaikuComment) ack.getBody(); System.out.println("========["+comment.getComment() + ":" + comment.getPoint() +"]====");
結論:ちゃんと調べて自分の手で動かすと色々なことがわかる。
あと、この件でid:yone098がガン切れして手がつけられませんでした。こわいこわい><