【问题标题】:HttpUrlConnection: how to get the XML response into a String?HttpUrlConnection:如何将 XML 响应转换为字符串?
【发布时间】:2012-10-09 17:18:35
【问题描述】:

我正在使用HttpURLConnection 发布到 REST API。我仍然没有成功发布任何东西,所以我试图取回应该来自 API 的 XML 响应。

这是我整理的代码段,它给我带来了问题:

// 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();

编译器对此行不满意(建议的修复是“将流类型更改为阅读器”):

BufferedReader br = new BufferedReader(stream);

有人对我如何正确执行此操作有任何建议吗? 任何帮助表示赞赏。

完整代码在这里:

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();
        }
    }
}

【问题讨论】:

    标签: java rest gwt


    【解决方案1】:

    我有两个观察结果。

    1. connection.disconnect(); 移到最后,即在br.close(); 行之后完成阅读。

    2. 按照以下顺序:

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

    希望有效!

    【讨论】:

      【解决方案2】:

      缓冲阅读器不直接接受输入流,它只接受阅读器对象。 将输入流包装在输入流阅读器中并将其传递给缓冲阅读器。

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

      【讨论】:

        【解决方案3】:

        - 看看这个方法,它来自我的工作项目。

        - 我以xml 的形式发送请求接收 xml 中的数据并将其转换为字符串。

        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();
            }
        

        【讨论】:

          猜你喜欢
          • 2020-06-20
          • 2012-06-21
          • 1970-01-01
          • 1970-01-01
          • 2016-09-18
          • 2011-01-10
          • 2015-05-08
          • 1970-01-01
          • 2017-01-17
          相关资源
          最近更新 更多