Pergunta

Tenho uma aplicação web desenvolvida em Adobe Flex 3 e Python 2.5 (implantado no Google App Engine). Um serviço web RESTful foi criado em Python e seus resultados estão atualmente em um formato XML que está sendo lido por Flex usando o objeto HTTPService.

Agora, o objetivo principal é comprimir o XML de modo que não é tão menos uma vez entre o método e resultado de eventos HTTPService send (). Olhei para cima docs Python e conseguiu uso zlib.compress () para comprimir o resultado XML.

Então eu definir o tipo de resultado HTTPService de "xml" para "texto" e tentou usar bytearrays para descompactar a volta string para XML. Aqui é onde eu falhei. Eu estou fazendo algo parecido com isto:

var byteArray:ByteArray = new ByteArray();
byteArray.writeUTF( event.result.toString() );
byteArray.uncompress();
var xmlResult:XML = byteArray.readUTF();

Seu jogando uma exceção em ByteArray.uncompress () e diz incapaz de descomprimir o byteArray. Além disso, quando eu traço o comprimento do byteArray ele recebe 0.

Não é possível para descobrir o que eu estou fazendo errado. Toda a ajuda é apreciada.

- Edit -

O código:

# compressing the xml result in Python
print zlib.compress(xmlResult)

# decompresisng it in AS3
var byteArray:ByteArray = new ByteArray();
byteArray.writeUTF( event.result.toString() );
byteArray.uncompress()

Event é do tipo ResultEvent.

O erro:

Erro: Erro # 2058:. Houve um erro descomprimir os dados

O erro pode ser porque o valor de ByteArray.bytesAvailable = 0 significa que o pitão cru bytes gerado não tem sido escrito em byteArray adequadamente ..

- Sri

Foi útil?

Solução

O que é byteArray.writeUTF( event.result.toString() ); deveria fazer? O resultado da zlib.compress () não é nem unicode nem "UTF" (sentido sem um número após ele !?); é binário aka bytes brutos; você deve nem decodificá-lo, nem codificá-lo, nem aplicar qualquer outra transformação para ele. O receptor deve descomprimir imediatamente os bytes brutos que recebe, a fim de recuperar os dados que foram transmitidos para zlib.compress ().

Atualizar Qual a documentação que você tem que apoiar a noção de que byteArray.uncompress() está esperando um verdadeiro zlib córrego e não um deflate fluxo (ou seja, uma zlib transmitir depois que você cortou os primeiros 2 bytes e o último 4)?

A documentação Flex 3 de ByteArray dá este exemplo:

bytes.uncompress(CompressionAlgorithm.DEFLATE);

mas inutilmente não diz o que o padrão (se houver) é. Se houver um padrão, ele não está documentado em qualquer lugar óbvio, por isso seria uma idéia muito boa para você usar

bytes.uncompress(CompressionAlgorithm.ZLIB);

para tornar óbvio o que você pretende.

E o docs falar sobre um método writeUTFBytes, não é um método writeUTF. Tem certeza que você copiar / colar o código receptor exato na sua pergunta?

Update 2

Obrigado pela URL. Parece que eu tenho de segurar a "ajuda", não os docs reais: = (Um par de pontos:.

(1) Sim, existe um método inflate() explícito. No entanto uncompress tem um arg algoritmo; ele pode ser CompressionAlgorithm.ZLIB (o padrão) ou CompressionAlgorithm.DEFLATE ... curiosamente o último é no entanto só está disponível em Adobe Air, não no Flash Player. Pelo menos sabemos que a chamada uncompress () aparece OK, e podemos voltar para o problema de obter os bytes-primas para o fio e de novo em uma ocorrência de ByteArray.

(2) Mais importante ainda, não são ambos writeUTF (Grava uma cadeia UTF-8 para o fluxo de bytes. O comprimento da cadeia UTF-8 em bytes é escrito em primeiro lugar, como um 16- bit inteiro, seguido pelos bytes que representam os caracteres da cadeia) e writeUTFBytes (escreve uma cadeia UTF-8 para o fluxo de bytes. Semelhante à writeUTF () método, mas writeUTFBytes () não prefixo a corda com um comprimento de palavra de 16 bits).

Independentemente do mérito de fornecimento de bytes codificado-UTF8 (nil, IMHO), você não quer um comprimento de prefixo de 2 bytes lá; usando writeUTF () é garantido para causar uncompress () para Bork .

Obtendo-lo para o fio: usando Python impressão na dados binários não parece ser uma boa idéia (a menos que sys.stdout foi nobbled para executar no modo cru, que você não apareceu em seu código) <. / p>

Da mesma forma fazendo event.result.toString () recebendo uma string (semelhante a um objeto unicode Python, sim / não?) -. Com o que e, em seguida, a codificação-lo em UTF-8 parece bastante improvável ao trabalho

Uma vez eu não sabia que o Flex existiu até hoje, eu realmente não posso ajudá-lo efetivamente. Aqui estão algumas sugestões adicionais para a auto-suficiência em caso ninguém que sabe mais flexível vem logo:

(1) Faça alguma depuração. Comece com um documento XML mínimo. Mostrar repr(xml_doc). Mostrar repr(zlib_compress_output). Em (uma versão reduzida do) seu roteiro flexível, use a função / método mais próximo a repr() que você pode encontrar para mostrar: event.result, event.result.toString() eo resultado da writeUTF*(). Certifique-se de compreender os efeitos de tudo o que pode acontecer depois zlib.compress (). Lendo os docs cuidadosamente pode ajudar.

(2) olhada em como você pode obter bytes matérias fora do event.result.

HTH, John

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top