Странное поведение JAX-RS - PullRequest
2 голосов
/ 26 ноября 2011

Я делаю веб-сервис, который передает файл изображения клиенту.Для клиента я использую API Apache HttpClient, потому что я тестирую сервисы перед тем, как начать кодировать на Android.

Image Sent Image Recieved

Как видите, половина(или около того) пикселей теряются при передаче, но я не знаю, если это из-за некоторых воров передачи или я разбираю ответ неправильно (возможно, последний).Я использую SAX для анализа, он получает InputStream в форме XML.

Формат XML выглядит следующим образом:

<Image>
    <data>some Base64 encoded bytes</data>
    <name>image name</name>
</Image>

Вот код клиента веб-службы:

private static void download() {
        try {
            System.out.println("Downloading file...");

            HttpClient client = new DefaultHttpClient();
            HttpGet request = new HttpGet(SERVICE_URL + "download/me");

            HttpResponse response = client.execute(request);

            if (response.getStatusLine().getStatusCode() != 200) {
                System.out.println("Error: HTTP error code: "
                        + response.getStatusLine().getStatusCode());
            }

            InputStream xml = response.getEntity().getContent();
            Image i = parseDownload(xml);
            System.out.println(i);

            client.getConnectionManager().shutdown();

            FileOutputStream fos = new FileOutputStream(
                    new File("D:/newMe.jpg"));
            fos.write(i.getData());
            fos.close();

        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

Вот мой код синтаксического анализа:

private static Image parseDownload(InputStream xml) {
        final Image i = new Image();
        try {
            SAXParserFactory spf = SAXParserFactory.newInstance();
            SAXParser parser = spf.newSAXParser();

            DefaultHandler handler = new DefaultHandler() {
                private boolean name = false;
                private boolean data = false;

                @Override
                public void startElement(String uri, String localName,
                        String qName, Attributes attributes)
                        throws SAXException {
                    if (qName.equals("name"))
                        name = true;
                    if (qName.equals("data"))
                        data = true;
                }

                @Override
                public void characters(char[] ch, int start, int length)
                        throws SAXException {
                    if (name) {
                        i.setName(new String(ch, start, length));
                        name = false;
                    }
                    if (data) {
                        String data = new String(ch, start, length);
                        i.setData(Base64.decodeBase64(data));
                        this.data = false;
                    }
                }
            };

            Reader reader = new InputStreamReader(xml);

            InputSource is = new InputSource(reader);
            is.setEncoding("UTF-8");

            parser.parse(is, handler);
        } catch (ParserConfigurationException e) {
            e.printStackTrace();
        } catch (SAXException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return i;
    }

Есть идеи, что я делаю неправильно?

1 Ответ

3 голосов
/ 26 ноября 2011

Да, вы снова и снова будете видеть этот ответ на этом и многих других сайтах: вызов метода characters() не гарантирует передачу всего содержимого элемента в 1 вызове метода .Вы должны объединять все вызовы методов символов в один буфер и обрабатывать их только при получении вызова метода endElement().

...