web-dev-qa-db-fra.com

Android, envoi de XML via HTTP POST (SAVON)

Je voudrais appeler un service Web via Android. J'ai besoin de POST un peu de XML vers une URL via HTTP ... J'ai trouvé ceci coupé pour l'envoi d'un POST, mais je ne sais pas comment inclure/ajouter les données XML.

public void postData() {
         // Create a new HttpClient and Post Header  
         HttpClient httpclient = new DefaultHttpClient();  
         HttpPost httppost = new HttpPost("http://10.10.4.35:53011/");

         try {  
             // Add your data  
             List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(2);  
             nameValuePairs.add(new BasicNameValuePair("Content-Type", "application/soap+xml"));               
             httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs)); 
                 // Where/how to add the XML data?


             // Execute HTTP Post Request  
             HttpResponse response = httpclient.execute(httppost);  

         } catch (ClientProtocolException e) {  
             // TODO Auto-generated catch block  
         } catch (IOException e) {  
             // TODO Auto-generated catch block  
         }  
     }

Voici le message complet POST que je dois imiter:

POST /a8103e90-f1e3-11dd-bfdb-8b1fcff1a110 HTTP/1.1
Host: 10.10.4.35:53011
Content-Type: application/soap+xml
Content-Length: 602

<?xml version='1.0' encoding='UTF-8' ?>
<s12:Envelope xmlns:s12="http://www.w3.org/2003/05/soap-envelope" xmlns:wsa="http://schemas.xmlsoap.org/ws/2004/08/addressing">
  <s12:Header>
    <wsa:MessageID>urn:uuid:fc061d40-3d63-11df-bfba-62764ccc0e48</wsa:MessageID>
    <wsa:Action>http://schemas.xmlsoap.org/ws/2004/09/transfer/Get</wsa:Action>
    <wsa:To>urn:uuid:a8103e90-f1e3-11dd-bfdb-8b1fcff1a110</wsa:To>
    <wsa:ReplyTo>
      <wsa:Address>http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous</wsa:Address>
    </wsa:ReplyTo>
  </s12:Header>
  <s12:Body />
</s12:Envelope>
46
JustFogMaxi
  1. Tout d'abord, vous pouvez créer un modèle de chaîne pour cette demande SOAP et remplacer les valeurs fournies par l'utilisateur au moment de l'exécution dans ce modèle pour créer une demande valide.
  2. Envelopper cette chaîne dans un StringEntity et définir son type de contenu en tant que text/xml
  3. Définissez cette entité dans la demande SOAP. 

Quelque chose comme:

HttpPost httppost = new HttpPost(SERVICE_EPR);          
StringEntity se = new StringEntity(SOAPRequestXML,HTTP.UTF_8);

se.setContentType("text/xml");  
httppost.setHeader("Content-Type","application/soap+xml;charset=UTF-8");
httppost.setEntity(se);  

HttpClient httpclient = new DefaultHttpClient();
BasicHttpResponse httpResponse = 
    (BasicHttpResponse) httpclient.execute(httppost);

response.put("HTTPStatus",httpResponse.getStatusLine().toString());
47
Samuh

voici l'alternative pour envoyer du savon msg.

public String setSoapMsg(String targetURL, String urlParameters){

        URL url;
        HttpURLConnection connection = null;  
        try {
          //Create connection
          url = new URL(targetURL);

         // for not trusted site (https)
         // _FakeX509TrustManager.allowAllSSL();
         // System.setProperty("javax.net.debug","all");

          connection = (HttpURLConnection)url.openConnection();
          connection.setRequestMethod("POST");


          connection.setRequestProperty("SOAPAction", "**** SOAP ACTION VALUE HERE ****");

          connection.setUseCaches (false);
          connection.setDoInput(true);
          connection.setDoOutput(true);


          //Send request
          DataOutputStream wr = new DataOutputStream (
                       connection.getOutputStream ());
          wr.writeBytes (urlParameters);
          wr.flush ();
          wr.close ();

          //Get Response    
          InputStream is ;
          Log.i("response", "code="+connection.getResponseCode());
          if(connection.getResponseCode()<=400){
              is=connection.getInputStream();
          }else{
              /* error from server */
              is = connection.getErrorStream();
        } 
         // is= connection.getInputStream();
          BufferedReader rd = new BufferedReader(new InputStreamReader(is));
          String line;
          StringBuffer response = new StringBuffer(); 
          while((line = rd.readLine()) != null) {
            response.append(line);
            response.append('\r');
          }
          rd.close();
          Log.i("response", ""+response.toString());
          return response.toString();

        } catch (Exception e) {

         Log.e("error https", "", e);
          return null;

        } finally {

          if(connection != null) {
            connection.disconnect(); 
          }
        }
      }

j'espère que ça aide. si quelqu'un demande la méthode allowAllSSL(), google it :).

7
HelmiB

Donc si vous utilisez:

httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));

C'est encore du repos, mais si vous utilisez:

StringEntity se = new StringEntity(SOAPRequestXML,HTTP.UTF_8);
httppost.setEntity(se);  

C'est du savon ???

5
Maxrunner

Exemple d'envoi XML vers WS via http POST.

DefaultHttpClient httpclient = new DefaultHttpClient();
        HttpPost httppost = new HttpPost("http://foo/service1.asmx/GetUID");     

        //XML example to send via Web Service.
        StringBuilder sb = new StringBuilder();
        sb.append("<myXML><Parametro><name>IdApp</name><value>1234567890</value></Parameter>");
        sb.append("<Parameter><name>UID1</name><value>abc12421</value></Parameter>");
                sb.append("</myXML>");

        httppost.addHeader("Accept", "text/xml");
        httppost.addHeader("Content-Type", "application/x-www-form-urlencoded");

        List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(1); 
        nameValuePairs.add(new BasicNameValuePair("myxml", sb.toString());//WS Parameter and    Value           
        httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
        HttpResponse response = httpclient.execute(httppost);
2
Elenasys

Voici mon code pour l'envoi de HTML .... Vous pouvez voir que les données sont le nomValuePairs.add (...)

        HttpClient httpclient = new DefaultHttpClient();
        // Your URL
        HttpPost httppost = new HttpPost("http://192.71.100.21:8000");

        try {
            List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(2);
            // Your DATA
            nameValuePairs.add(new BasicNameValuePair("id", "12345"));
            nameValuePairs.add(new BasicNameValuePair("stringdata","AndDev is Cool!"));

            httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));

            HttpResponse response;
            response = httpclient.execute(httppost);
        } catch (ClientProtocolException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
2
PLG

ici, les extraits de code de code que j'utilise pour publier du code XML dans les services SOAP et obtenir en retour Inputstream à partir du Web.

 private InputStream call(String soapAction, String xml) throws IOException {

    byte[] requestData = xml.getBytes("UTF-8");
    URL url = new URL(URL);

    connection = (HttpURLConnection) url.openConnection();
    connection.setRequestProperty("Accept-Charset", "UTF-8");
    // connection.setRequestProperty("Accept-Encoding","gzip,deflate");
    connection.setRequestProperty("Content-Type", "text/xml; UTF-8");
    connection.setRequestProperty("SOAPAction", soapAction);
    connection.setRequestProperty("User-Agent", "Android");
    connection.setRequestProperty("Host",
            "base_urlforwebservices like - xyz.net");
    // connection
    // .setRequestProperty("Content-Length", "" + requestData.length);
    connection.setRequestMethod("POST");
    connection.setDoOutput(true);
    connection.setDoInput(true);

    os = connection.getOutputStream();
    os.write(requestData, 0, requestData.length);
    os.flush();
    os.close();
    is = connection.getInputStream();
    return is; // inputStream
}

Ici xml: est la requête XML construite utilisée pour appeler des services.

S'amuser;

1
Anand Tiwari

J'ai aussi dû envoyer du XML via HTTP Post sur Android. 

String xml = "xml-block";
StringEntity se = new StringEntity(xml,"UTF-8");
se.setContentType("application/atom+xml");
HttpPost postRequest = new HttpPost("http://some.url");
postRequest.setEntity(se);

Esperons que ça marche!

1
Nushio

Avec OkHTTP, il est simple de 

String soap_string = "soap string";

public static final MediaType SOAP_MEDIA_TYPE = MediaType.parse("application/xml");
final OkHttpClient client = new OkHttpClient();
RequestBody body = RequestBody.create(SOAP_MEDIA_TYPE, soap_string);

final Request request = new Request.Builder()
       .url("Your URL")
       .post(body)
       .addHeader("Content-Type", "application/xml")
       .addHeader("Authorization", "Your Token")
       .addHeader("cache-control", "no-cache")
       .build();

client.newCall(request).enqueue(new Callback() {
    @Override
    public void onFailure(Call call, IOException e) {
          String mMessage = e.getMessage().toString();
          Log.w("failure Response", mMessage);
    }

    @Override
    public void onResponse(Call call, Response response) throws IOException {

         String mMessage = response.body().string();

          //code = response.code();
          getResponse(mMessage, response);
    }
});

Lisez le tutoriel complet ici - https://www.studytutorial.in/Android-sending-xml-or-soap-rest-api-request-using-okhttp-tutorial

0
yoAlex5

Une autre façon de le faire est d'utiliser Apache Call . L'API, l'URI d'action et le corps de l'API doivent être fournis.

InputStream input = new ByteArrayInputStream(apiBody.getBytes());
Service service = new Service();
Call call = (Call) service.createCall();
SOAPEnvelope soapEnvelope = new SOAPEnvelope(input);

call.setTargetEndpointAddress(new URL(apiUrl));
call.setUseSOAPAction(true);
if(StringUtils.isNotEmpty(actionURI)){
 call.setSOAPActionURI(actionURI);
}

soapEnvelope = call.invoke(soapEnvelope);
return soapEnvelope.toString();
0
Ankur Choudhary