Le transfert de tableau d'octets à partir de savon de service pour android
J'ai un android client qui fait une demande pour un service soap. Le service soap lit une image en une série d'octets, et renvoie un tableau d'octets (assez grande). Serait-ce considéré comme une primitive de type de transfert? La raison pour laquelle je demande parce que j'ai le code de la fonction qui lit une image et imprime les 5 premiers octets. Ensuite, il retourne le tableau d'octets.
@Override
public byte[] getImage() {
byte[] imageBytes = null;
try {
File imageFile = new File("C:\\images\\car.jpg");
BufferedImage img = ImageIO.read(imageFile);
ByteArrayOutputStream baos = new ByteArrayOutputStream(1000);
ImageIO.write(img, "jpg", baos);
baos.flush();
imageBytes = baos.toByteArray();
baos.close();
} catch (IOException ioe) {
ioe.printStackTrace();
}
System.out.println("Got request");
System.out.println("****** FIRST 5 BYTES: ");
for(int i=0; i<5; i++) {
System.out.println("****** " + imageBytes[i]);
}
return imageBytes;
}
De la sortie de service sur le serveur est
****** FIRST 5 BYTES:
****** -119
****** 80
****** 78
****** 71
****** 13
Lorsque je reçois sur mon émulateur android, j'ai l'impression que les 5 premiers octets et ils sont complètement différents de ceux imprimés sur le serveur. Voici mon code android:
androidHttpTransport.call(SOAP_ACTION, envelope);
SoapPrimitive resultsRequestSOAP = (SoapPrimitive) envelope.getResponse();
String result = resultsRequestSOAP.toString();
System.out.println("****** RESULT: " + result);
byte[] b = result.getBytes();
System.out.println("****** FIRST 5 BYTES: ");
for(int i=0; i<5; i++) {
System.out.println("****** " + b[i]);
}
Et la sortie est
****** FIRST 5 BYTES:
****** 105
****** 86
****** 66
****** 79
****** 82
Il fonctionne très bien si je l'ai tester avec un simple service client écrit en java. Toutes les idées peuvent expliquer ce qui se passe?
OriginalL'auteur Joeblackdev | 2011-07-24
Vous devez vous connecter pour publier un commentaire.
Il semble que vous êtes absent une importante étape de décodage. Le code qui génère la réponse SOAP doit être codage du tableau d'octets, de sorte qu'il peut être représenté comme une chaîne de caractères dans le fichier XML. Il est difficile de dire comment vous devriez être décodé sans connaître le mécanisme de codage utilisée sur le serveur (base64, etc.).
Dans votre code ci-dessus vous appelez String#getBytes(), qui code pour la chaîne en tant que données binaires en utilisant le jeu de caractères par défaut (qui est en UTF-8 sur Android). Ce n'est pas le même que le décodage de l'image d'origine des données. UTF-8 ne peut pas être utilisé comme mécanisme de codage, car il ne peut pas représenter n'importe quelle séquence d'octets (tous les octets de séquences UTF-8 valide).
Vérifier le code de service pour voir comment il est le codage binaire des données et utiliser un mécanisme de décodage sur le côté client, et cela devrait résoudre votre problème.
HTH.
MODIFIER: Cette faq (pour une version plus ancienne, mais probablement s'applique toujours) recommande codant pour le tableau d'octets en base64 et en l'enveloppant dans un SoapPrimitive. Personnellement, je utiliser Communes Codec et ses Base64 classe pour coder le tableau d'octets en une chaîne de caractères sur le côté serveur et de l'utiliser sur le côté client pour décoder cette chaîne à l'origine du tableau d'octets.
Une chose à surveiller... Android fait bundles une version plus ancienne de Communes Codec qui pourraient vous passionner. En particulier, il ne comprend pas le
encodeBase64String
méthode de convenance, de sorte que vous aurez besoin d'expérimenter ou de faire un peu de recherche pour trouver ce que les méthodes de décodage existent sur la plate-forme Android. Vous pouvez utiliser android.util.Base64 sur le côté client, mais assurez-vous d'utiliser la bonne drapeaux qui correspondent le style d'encodage utilisé sur le côté serveur. Bonne chance.J'ai édité ma réponse. Espérons que cela aide.
Bonjour Michael. Ce qui a du sens et qui est très instructif, merci beaucoup pour ce. Je vais donner la réponse, donnez-lui un aller et d'en faire rapport. Merci encore.
Très instructif. Merci beaucoup.
OriginalL'auteur Michael Sims
@Michael, qui a travaillé un charme. Voici mon dernier code de travail qui va envoyer un jpeg à partir d'un service soap pour un émulateur android et l'afficher. Je suis à l'aide de jax-ws. Ici, c'est le service de la mise en œuvre de haricot pour le fonctionnement getImage(), qui retourne une chaîne encodée en base64 de l'image en octets.
Maintenant, voici le code android qui appelle le service et de vous faire de l'encodage du contenu de l'image, de décodage à un tableau d'octets, de créer une image et l'afficher dans l'émulateur:
J'espère que cela est utile pour quelqu'un d'autre qui en ont besoin. Vous devez également définir l'autorisation:
<uses-permission android:name="android.permission.INTERNET"></uses-permission>
. Notez également que l'émulateur est de se connecter à la machine localhost sur 10.0.2.2, pas 127.0.0.1OriginalL'auteur Joeblackdev
nous avons besoin pour mettre en œuvre la sérialisation avant de nous envoyer le tableau d'octets sinon, nous sommes d'erreur ne peut pas sérialiser tableau d'octets.voir exemple ci-dessous
En passant, vous êtes le véritable Andy Rubin? 🙂
Je viens de penser la même chose moi-même! 😉
Non c'est un sockpuppet de l'utilisateur hotveryspicy.
OriginalL'auteur Bugs bunny