2010-04-29 14 views
11

Come posso inviare una richiesta XML a un URL utilizzando HTTP POST e recuperare la risposta?invio di richiesta XML in java

Aggiornamento Spiacente, la mia domanda non era chiara, immagino. Voglio sapere come inviare una richiesta XML a un URL utilizzando HttpClient o URLConnection e ottenere la risposta come parametro POST e visualizzarla in una pagina Web.

+0

con che cosa? httpclient, URLConnection? A cosa - una pagina web, un servizio web? La tua domanda non è chiara. – Bozho

+0

scusa .. sia httpclient o URLConnection .. ho bisogno di visualizzare la risposta in una pagina web .. – shil

+0

aggiornare la domanda con questi dettagli. e dare ancora qualcosa - qual è la pagina di destinazione e come si aspetta l'xml. Come tipico parametro post? – Bozho

risposta

6

Questo esempio inviare un file XML, che dipende da 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(); 
     } 
    } 
} 
16

Ecco un esempio di come farlo con 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

cosa succede se spero di ottenerlo da request.getInputStream, piuttosto che ottenerlo da xml, cosa dovrei fare nel clent? – Jaskey

+0

Il mio xml sta diventando codificato su% 3c. Puoi per favore dirmi come prevenire questo. – prashant

3

Attenzione questo il codice ha più di 5 anni. Ho fatto qualche modfying per questo post e non l'ho mai testato. Speriamo che aiuti.

Messaggio XML (dati) a un server e downlod il 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; 

    } 

Da qualche altra parte .....

int respCode = uploadToServer(someXmlData); 



if (respCode == 200) { 

    String respData = downloadFromServer(); 

} 
6

Usa InputStreamEntity. Ho usato httpclient 4.2.1.

Ad esempio:

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