奇怪的JAX-RS行为

时间:2011-11-26 01:40:29

标签: java httpclient sax jax-rs

我正在制作一个将图像文件传输到客户端的Web服务。对于客户端,我使用Apache HttpClient API,因为我在开始在android上编码之前测试服务。

Image Sent Image Recieved

正如你所看到的那样,一半(左右)的像素在传输过程中丢失了,但我不知道是不是因为一些转移窃贼或我正在解析错误的答案(可能是后者)。我正在使用SAX进行解析,它以XML格式接收InputStream

XML格式如下:

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

以下是Web服务客户端代码:

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 个答案:

答案 0 :(得分:3)

是的,您将在本网站及其他许多网站上一次又一次地看到此答案:characters()方法调用无法保证在1方法调用中为您提供所有元素的内容必须将所有字符方法调用聚合到一个缓冲区中,并且只有在获得endElement()方法调用时才处理它们。