HttpUrlConnection: how to get the XML response into a String?

那年仲夏 提交于 2019-12-22 10:32:07

问题


I am using HttpURLConnection to post to a REST API. I still have not successfully posted anything, so I'm trying to get back the XML response that should be coming from the API.

Here is the segment of the code that I've put together that is giving me the issues:

// Process response - need to get XML response back.
InputStream stream = connection.getInputStream();
connection.disconnect();

BufferedReader br = new BufferedReader(stream);
String result;
String line;
while ((line = br.readLine()) != null) {
    System.out.println(line);
    result += line;
}
br.close();

The compiler is not happy with this line (the suggested fix is "Change type of stream to reader"):

BufferedReader br = new BufferedReader(stream);

Does anyone have any suggestions as to how I might do this properly? Any help appreciated.

Complete code here:

package com.gwt.HelpDeskTest.server;

import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLConnection;

import com.google.gwt.user.server.rpc.RemoteServiceServlet;
import com.gwt.HelpDeskTest.client.HelpDeskTestService;
import com.gwt.HelpDeskTest.shared.HelpDeskTestException;

@SuppressWarnings("serial")
public class HelpDeskTestImpl extends RemoteServiceServlet implements HelpDeskTestService {

    @Override
    public String postToRemoteServer(String serviceUrl) throws HelpDeskTestException {
        try {
            final String serverPath= "http://helpdesk.rmi.org/sdpapi/request/";     
            final String serverParameters = "OPERATION_NAME=ADD_REQUEST&TECHNICIAN_KEY=D4ADD3A3-9CD4-4307-932B-29E96BCFA5B6&INPUT_DATA=%3C?xml%20version=%25221.0%2522%20encoding=%2522utf-8%2522?%3E%3COperation%3E%3CDetails%3E%3Crequester%3EBetsy%20Leach%3C/requester%3E%3Csubject%3ETest%3C/subject%3E%3Cdescription%3ETesting%20curl%20input%20again%3C/description%3E%3C/Details%3E%3C/Operation%3E"; // Put parameters here for testing.

            // trying HttpURLConnection instead of a plain URLConnection

            URL url = new URL(serverPath); 
            HttpURLConnection connection = (HttpURLConnection) url.openConnection();           
            connection.setDoOutput(true);
            connection.setDoInput(true);
            connection.setInstanceFollowRedirects(false); 
            connection.setRequestMethod("POST"); 
            connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); 
            connection.setRequestProperty("charset", "utf-8");
            connection.setRequestProperty("Content-Length", "" + Integer.toString(serverParameters.getBytes().length));
            connection.setUseCaches (false);

            DataOutputStream wr = new DataOutputStream(connection.getOutputStream());
            wr.writeBytes(serverParameters);
            wr.flush();
            wr.close();

            // Process response - need to get XML response back.
            InputStream stream = connection.getInputStream();
            connection.disconnect();

            // Put output stream into a String
            BufferedReader br = new BufferedReader(stream);
            String result;
            String line;
            while ((line = br.readLine()) != null) {
                System.out.println(line);
                result += line;
            }
            br.close();

            System.out.println(result);
            return result;
        } 
        catch (final Exception e) {
            System.out.println(e.getMessage());
            throw new HelpDeskTestException();
        }
    }
}

回答1:


I have two observations.

  1. Move connection.disconnect(); towards the end, where you are done with reading i.e. after the br.close(); line.

  2. Follow Below sequence:

    InputStream stream = connection.getInputStream();
    InputStreamReader isReader = new InputStreamReader(stream ); 
    
    //put output stream into a string
    BufferedReader br = new BufferedReader(isReader );
    

Hope that works!




回答2:


Buffered reader does not accept input stream directly, it accepts only reader objects. Wrap the input stream in input stream reader and pass it to buffered reader.

BufferedReader br = new BufferedReader(new InputStreamReader(stream));




回答3:


- See this method, its from my working project.

- I sent the request in form of xml and receive the data in xml and convert it into String.

public String postData(String url, String xmlQuery) {



        final String urlStr = url;
        final String xmlStr = xmlQuery;
        final StringBuilder sb  = new StringBuilder();


        Thread t1 = new Thread(new Runnable() {

            public void run() {

                HttpClient httpclient = DefaultHttpClient();

                HttpPost httppost = new HttpPost(urlStr);


                try {

                    List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(
                            1);
                    nameValuePairs.add(new BasicNameValuePair("xml", xmlStr));

                    httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));

                    HttpResponse response = httpclient.execute(httppost);

                    Log.d("Vivek", response.toString());

                    HttpEntity entity = response.getEntity();
                    InputStream i = entity.getContent();

                    Log.d("Vivek", i.toString());
                    InputStreamReader isr = new InputStreamReader(i);

                    BufferedReader br = new BufferedReader(isr);

                    String s = null;


                    while ((s = br.readLine()) != null) {

                        Log.d("YumZing", s);
                        sb.append(s);
                    }


                    Log.d("Check Now",sb+"");




                } catch (ClientProtocolException e) {

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

        });

        t1.start();
        try {
            t1.join();
        } catch (InterruptedException e) {

            e.printStackTrace();
        }


        System.out.println("Getting from Post Data Method "+sb.toString());

        return sb.toString();
    }


来源:https://stackoverflow.com/questions/12805107/httpurlconnection-how-to-get-the-xml-response-into-a-string

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!