Как загрузить файл xml с сервера без заголовков http

Я пытаюсь загрузить файл xml для анализа с сервера, но сервер не отправляет заголовки HTTP, а только текст xml. Я перепробовал почти все способы загрузки файлов с URL-адресом, которые смог найти, но все выдавало исключение ввода-вывода. Я могу загрузить файл в WebView, но не могу загрузить файл сам.

Как я могу открыть соединение и загрузить файл xml без заголовков HTTP?

РЕДАКТИРОВАТЬ: все еще дает мне исключение ввода-вывода, вот код, который я использую:

    private class UpdateTask extends AsyncTask<Void, Void, Void> {
    protected Void doInBackground(Void...voids ) {
        String url = "http://192.168.1.92/state.xml";
        try{
            //get XML Pull parser
            XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
            factory.setNamespaceAware(true);
            //factory.setValidating(false);
            XmlPullParser xpp = factory.newPullParser();        

            HttpGet httpGet = new HttpGet(url);
            DefaultHttpClient client = new DefaultHttpClient();
            HttpResponse response = client.execute(httpGet);

            if(response == null) return null;

            HttpEntity httpEntity = response.getEntity();
            InputStream inStream  = null;
            StringBuilder sb      = null;
            if (httpEntity == null) return null;

            try {
                inStream = httpEntity.getContent();
                BufferedReader reader = new BufferedReader(new InputStreamReader(inStream, "UTF-8"));
                sb = new StringBuilder();
                String line = null;

                while((line = reader.readLine()) != null) {
                    sb.append(line + "\n");
                }

                inStream.close();
                } catch (Exception ex) {
                }
                String xmlString = sb.toString();

                xpp.setInput(new StringReader(xmlString));
                int eventType = xpp.getEventType();

                String name = null;
                String text = null;
                while (eventType != XmlPullParser.END_DOCUMENT) {
                    if(eventType == XmlPullParser.START_TAG) { // <name>
                        name = xpp.getName();
                        System.out.println("got name: " + name);
                    } else if(eventType == XmlPullParser.END_TAG) {// </name> (xpp.getName();
                    } else if(eventType == XmlPullParser.TEXT) { // <>text</>
                        text = xpp.getText();
                        System.out.println("got text: " + text);

                    }
                    eventType = xpp.next();
                }
                finished = true;
            }catch(MalformedURLException e){
                System.out.println("Malformed URL");
            }catch(IOException e){
                System.out.println("IO Exception updating " + name + " at address: " + address);
            }catch(XmlPullParserException e){
                System.out.println("XML Pull Parser Error updating " + name + " at address: " + address);
            }catch(Exception e){
            }
        return null;
    }
}

Дает мне исключение ввода-вывода каждый раз. Однако, если я укажу на сервер, предоставляющий HTTP-заголовок, он будет нормально загружен. Серверы — это устройства, которые мы изготавливаем сами, а более старые устройства не предоставляли заголовки HTTP при запросе файла state.xml, поэтому мне нужно иметь возможность работать с обоими.


person daven3t    schedule 11.05.2012    source источник
comment
Найдите/прочитайте несколько статей о том, как задавать вопросы. Ваш вопрос должен быть максимально конкретным. Вы должны предоставить как можно больше информации о проблеме.   -  person Maxim    schedule 11.05.2012
comment
Если вы передадите 192.168.1.92/state.xml в свой браузер, и он вернет вам xml, поместите точку останова в первой строке в разделе try и узнайте, что вызывает исключение, или опубликуйте свой LogCat здесь.   -  person Maxim    schedule 12.05.2012
comment
Браузер отлично возвращает страницу xml. iOS также подключается и загружается нормально, а WebViews также отображают XML. В коде возникает исключение ввода-вывода, когда я открываю InputStream или, в данном случае, когда я делаю client.execute(httpGet); Мой logcat просто возвращает System.out.println(I/O Exception); даже при включенном строгом режиме. Есть ли способ получить более подробный отчет об ошибке?   -  person daven3t    schedule 12.05.2012
comment
Сложно сказать почему, попробую воспроизвести в своей среде   -  person Maxim    schedule 14.05.2012


Ответы (2)


Посмотрите документацию, как правильно настроить соединение, вкратце у вас будет что-то вроде этого:

HttpGet httpGet = new HttpGet(mServerUrl);
DefaultHttpClient client = new DefaultHttpClient();
HttpResponse response = client.execute(httpGet);

if(response == null) return;

HttpEntity httpEntity = response.getEntity();
InputStream inStream  = null;
StringBuilder sb      = null;
if (httpEntity == null) return;

try {
    inStream = httpEntity.getContent();
    BufferedReader reader = new BufferedReader(new InputStreamReader(inStream, "UTF-8"));
    sb = new StringBuilder();
String line = null;

while((line = reader.readLine()) != null) {
    sb.append(line + "\n");
}

inStream.close();
} catch (Exception ex) {
}
String xmlString = sb.toString();
person Maxim    schedule 11.05.2012

Мне пришлось открыть свой собственный сокет, создать запрос HTTP Get, а затем удалить заголовки HTTP для серверов, у которых есть заголовки.

        public String getData(){
        String returnData = "";
        String requestmsg = "GET /state.xml HTTP/1.0\r\n";
        requestmsg += "Connection: close\r\n";
        if(cpPassword != null)
            requestmsg += "Authorization: Basic " + Base64.encodeBytes(("admin:" + cpPassword).getBytes()) + "\r\n";
        requestmsg += "\r\n";

        int intPort = 80;
        DataOutputStream dos = null;
        BufferedReader dis = null;
        Socket socket = null;
        try {
            socket = new Socket(address, intPort);
            String data = "";
            socket.setSoTimeout(3000); //timeout after 2 seconds
            dos = new DataOutputStream(socket.getOutputStream());
            dis = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            dos.write(requestmsg.getBytes());

            StringBuilder sb = new StringBuilder();

            while ((data = dis.readLine()) != null) {
                sb.append(data);
            }
            returnData = sb.toString();
            if(returnData.length() == 0)
                return "";
            int xmlIndex = returnData.indexOf( "<?xml" );
            returnData = returnData.substring(xmlIndex);
            return returnData;
        } catch (IOException e) {
            Log.e("ClientActivity", "C: Error Getting Data From Socket", e);
            returnData = "";
        }finally{
            try{
                if(socket!=null)
                    socket.close();
            }catch(IOException e){
                Log.e("ClientActivity", "C: Error Closing Socket", e);
            }
        }
        return returnData;
    }
person daven3t    schedule 29.06.2012