Android, envío de XML a través de HTTP POST (SOAP)
Me gustaría invocar un servicio web a través de Android. Necesito POST algunos XML a una URL vía HTTP. Encontré esto cortado para enviar un POSTE, pero no sé incluir / agregar los datos XML sí mismo.
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 } }
Este es el mensaje POST completo que necesito imitar:
- Error de Android RecyclerView
- Cómo detener la tarea Asyn en onPreExecute?
- Android: Pie de página en un ListView
- Permisos de usuario de Android para acceder a Internet
- ¿Cómo puedo utilizar las operaciones lógicas en el enlace de datos de Android?
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>
- Andorid cordova phonegap config.xml prefijo sin conexión
- Mapas de Google en una pestaña de acciónbarsherlock
- El menú de opciones de Android no se muestra
- Disposición de Android con botones cuadrados
- Mi proyecto de Android ha duplicado las declaraciones entre Enum y string.xml
- Animación de agitación de botón de Android
- Android: ¿Crear ListView en XML?
- Almacenamiento de datos en línea ANDROID
- En primer lugar, puede crear una plantilla String para esta solicitud SOAP y sustituir los valores proporcionados por el usuario en tiempo de ejecución en esta plantilla para crear una solicitud válida.
- Envuelva esta cadena en StringEntity y defina su tipo de contenido como text / xml
- Establezca esta entidad en la solicitud SOAP.
Algo como:
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());
Aquí la alternativa para enviar msg de jabón.
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(); } } }
Espero eso ayude. Si alguien se pregunta el método allowAllSSL()
, google lo :).
Así que si utiliza:
httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
Todavía es descanso, pero si usas:
StringEntity se = new StringEntity(SOAPRequestXML,HTTP.UTF_8); httppost.setEntity(se);
¿Es jabón ???
Aquí está mi código para enviar HTML …. Usted puede ver los datos es el nombreValuePairs.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(); }
Tuve que enviar algo de XML a través de HTTP Post en Android también.
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);
¡Espero que funcione!
Ejemplo de envío de XML a WS a través de 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);
Aquí, los fragmentos de código de código, que estoy usando para publicar xml en SOAP servicios ya cambio obtener Inputstream de 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 }
Aquí xml: es la petición xml construida que se utiliza para llamar a los servicios.
Que te diviertas;
Otra forma de hacerlo es utilizando Apache Call . URL de api, URI de acción y cuerpo API deben ser proporcionados
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();
- Android Speech Recognition como un servicio en Android 4.1 y 4.2
- Android: el pie de página se desplaza cuando se usa en CoordinatorLayout