2010-04-29 62 views
11

如何使用HTTP POST將XML請求發佈到URL並檢索響應?在java中發佈XML請求

更新對不起,我的問題不清楚,我猜。我想知道如何使用HttpClientURLConnection向URL發佈XML請求,並將響應作爲POST參數獲取並顯示在網頁中。

+0

使用的是什麼? httpclient,URLConnection?什麼 - 一個網頁,一個Web服務?你的問題不清楚。 – Bozho 2010-04-29 08:39:04

+0

對不起..無論是httpclient或URLConnection ..我需要在網頁中顯示響應.. – shil 2010-04-29 08:43:49

+0

更新與這些細節的問題。並給予更多 - 目標網頁是什麼,它是如何期待XML。作爲典型的發佈參數? – Bozho 2010-04-29 08:46:37

回答

6

這個例子發佈一個XML文件,它依賴於雅加達的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(); 
     } 
    } 
} 
16

下面是一個例子,如何用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`. 
+0

如果我希望從request.getInputStream中獲得它,而不是從xml中獲取它,那麼我該如何在clent中做些什麼? – Jaskey 2014-07-22 06:06:38

+0

我的xml正在編碼爲%3c。你能告訴我如何防止這種情況嗎? – prashant 2016-12-15 13:54:33

3

警告這個代碼是5歲以上。我爲這篇文章做了一些修改,從未測試過。 希望它有幫助。

郵政XML(數據)到服務器並downlod的RESP:

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


     returnString = sb.toString(); 



     return returnString; 

    } 

別的地方.....

int respCode = uploadToServer(someXmlData); 



if (respCode == 200) { 

    String respData = downloadFromServer(); 

} 
6

使用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);