【问题标题】:posting XML request in java在java中发布XML请求
【发布时间】:2010-04-29 08:36:49
【问题描述】:

如何使用 HTTP POST 将 XML 请求发布到 URL 并检索响应?

更新对不起,我猜我的问题不清楚。我想知道如何使用 HttpClientURLConnection 将 XML 请求发布到 URL,并将响应作为 POST 参数获取并显示在网页中。

【问题讨论】:

  • 用什么? httpclient,URL连接?什么 - 一个网页,一个网络服务?您的问题不清楚。
  • 对不起.. httpclient 或 URLConnection.. 我需要在网页中显示响应..
  • 用这些细节更新问题。并提供更多信息 - 目标页面是什么以及它如何期待 xml。作为典型的post参数?
  • 来吧 Java 人,不要太精英主义!如果您有一个接受 HTTP POST 的端点,则它是一个 http 帖子。问题很明确。

标签: java http


【解决方案1】:

这是一个如何使用java.net.URLConnection 的示例:

String url = "http://example.com";
String charset = "UTF-8";
String param1 = URLEncoder.encode("param1", charset);
String param2 = URLEncoder.encode("param2", charset);
String query = String.format("param1=%s&param2=%s", param1, param2);

URLConnection urlConnection = new URL(url).openConnection();
urlConnection.setUseCaches(false);
urlConnection.setDoOutput(true); // Triggers POST.
urlConnection.setRequestProperty("accept-charset", charset);
urlConnection.setRequestProperty("content-type", "application/x-www-form-urlencoded");

OutputStreamWriter writer = null;
try {
    writer = new OutputStreamWriter(urlConnection.getOutputStream(), charset);
    writer.write(query); // Write POST query string (if any needed).
} finally {
    if (writer != null) try { writer.close(); } catch (IOException logOrIgnore) {}
}

InputStream result = urlConnection.getInputStream();
// Now do your thing with the result.
// Write it into a String and put as request attribute
// or maybe to OutputStream of response as being a Servlet behind `jsp:include`.

【讨论】:

  • 如果我希望从request.getInputStream中获取,而不是从xml中获取,在clent中应该怎么做?
  • 我的 xml 被编码为 %3c 。你能告诉我如何防止这种情况发生吗?
【解决方案2】:

这个例子发布一个xml文件,它依赖于Jakarta HttpClient API (jakarta.apache.org)

import java.io.File;
import java.io.FileInputStream;

import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.methods.InputStreamRequestEntity;
import org.apache.commons.httpclient.methods.PostMethod;

/**
 * This is a sample application that demonstrates
 * how to use the Jakarta HttpClient API.
 *
 * This application sends an XML document
 * to a remote web server using HTTP POST
 *
 * @author Sean C. Sullivan
 * @author Ortwin Glück
 * @author Oleg Kalnichevski
 */
public class PostXML {

    /**
     *
     * Usage:
     * java PostXML http://mywebserver:80/ c:\foo.xml
     *
     * @param args command line arguments
     * Argument 0 is a URL to a web server
     * Argument 1 is a local filename
     *
     */
    public static void main(String[] args) throws Exception {

        if (args.length != 2) {
            System.out.println(
                "Usage: java -classpath <classpath> [-Dorg.apache.commons."+
                "logging.simplelog.defaultlog=<loglevel>]" +
                " PostXML <url> <filename>]");

            System.out.println("<classpath> - must contain the "+
                "commons-httpclient.jar and commons-logging.jar");

            System.out.println("<loglevel> - one of error, "+
                    "warn, info, debug, trace");

            System.out.println("<url> - the URL to post the file to");
            System.out.println("<filename> - file to post to the URL");
            System.out.println();
            System.exit(1);
        }

        // Get target URL
        String strURL = args[0];

        // Get file to be posted
        String strXMLFilename = args[1];
        File input = new File(strXMLFilename);

        // Prepare HTTP post
        PostMethod post = new PostMethod(strURL);

        // Request content will be retrieved directly
        // from the input stream
        // Per default, the request content needs to be buffered
        // in order to determine its length.
        // Request body buffering can be avoided when
        // content length is explicitly specified
        post.setRequestEntity(new InputStreamRequestEntity(
                new FileInputStream(input), input.length()));

        // Specify content type and encoding
        // If content encoding is not explicitly specified
        // ISO-8859-1 is assumed
        post.setRequestHeader(
                "Content-type", "text/xml; charset=ISO-8859-1");

        // Get HTTP client
        HttpClient httpclient = new HttpClient();

        // Execute request
        try {

            int result = httpclient.executeMethod(post);

            // Display status code
            System.out.println("Response status code: " + result);

            // Display response
            System.out.println("Response body: ");
            System.out.println(post.getResponseBodyAsString());

        } finally {
            // Release current connection to the connection pool 
            // once you are done
            post.releaseConnection();
        }
    }
}

【讨论】:

    【解决方案3】:

    使用InputStreamEntity。我使用 httpclient 4.2.1

    例如:

    HttpPost httppost = new HttpPost(url);
    InputStream inputStream=new ByteArrayInputStream(xmlString.getBytes());//init your own inputstream
    InputStreamEntity inputStreamEntity=new InputStreamEntity(inputStream,xmlString.getBytes());
    httppost.setEntity(inputStreamEntity);
    

    【讨论】:

      【解决方案4】:

      警告此代码已存在 5 年以上。我为这篇文章做了一些修改,但从未测试过。 希望对您有所帮助。

      将 XML(数据)发布到服务器并下载响应:

       public int uploadToServer(String data) throws Exception {
            OutputStream os;
            URL url = new URL("someUrl");
      
            HttpURLConnection httpConn= (HttpURLConnection) url.openConnection();
            os = httpConn.getOutputStream();
      
            BufferedWriter osw = new BufferedWriter(new OutputStreamWriter(os));
      
            osw.write(data);
            osw.flush();
            osw.close();
      
            return httpConn.getResponseCode();
       }
      
       public String downloadFromServer() throws MalformedURLException, IOException {
            String returnString = null;
            StringBuffer sb = null;
            BufferedInputStream in;
      
            //set up httpConn code not included same as previous
      
            in = new BufferedInputStream(httpConn.getInputStream());            
            int x = 0;
            sb = new StringBuffer();
      
            while ((x = in.read()) != -1) {
                 sb.append((char) x);
            }
      
            in.close();
            in = null;
      
            if (httpConn != null) {
                httpConn.disconnect();
            }
      
            return sb.toString();  
        }
      

      别处.....

      int respCode = uploadToServer(someXmlData);
      if (respCode == 200) {       
          String respData = downloadFromServer();
      }
      

      【讨论】:

        猜你喜欢
        • 2014-03-12
        • 1970-01-01
        • 1970-01-01
        • 2014-05-19
        • 2021-09-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-09-26
        相关资源
        最近更新 更多