HTTP Status Codes
1×× Informational
100 Continue
101 Switching Protocols
102 Processing
2×× Success
200 OK
201 Created
202 Accepted
203 Non-authoritative Information
204 No Content
205 Reset Content
206 Partial Content
207 Multi-Status
208 Already Reported
226 IM Used
3×× Redirection
300 Multiple Choices
301 Moved Permanently
302 Found
303 See Other
304 Not Modified
305 Use Proxy
307 Temporary Redirect
308 Permanent Redirect
4×× Client Error
400 Bad Request
401 Unauthorized
402 Payment Required
403 Forbidden
404 Not Found
405 Method Not Allowed
406 Not Acceptable
407 Proxy Authentication Required
408 Request Timeout
409 Conflict
410 Gone
411 Length Required
412 Precondition Failed
413 Payload Too Large
414 Request-URI Too Long
415 Unsupported Media Type
416 Requested Range Not Satisfiable
417 Expectation Failed
418 I’m a teapot
421 Misdirected Request
422 Unprocessable Entity
423 Locked
424 Failed Dependency
426 Upgrade Required
428 Precondition Required
429 Too Many Requests
431 Request Header Fields Too Large
444 Connection Closed Without Response
451 Unavailable For Legal Reasons
499 Client Closed Request
5×× Server Error
500 Internal Server Error
501 Not Implemented
502 Bad Gateway
503 Service Unavailable
504 Gateway Timeout
505 HTTP Version Not Supported
506 Variant Also Negotiates
507 Insufficient Storage
508 Loop Detected
510 Not Extended
511 Network Authentication Required
599 Network Connect Timeout Error
Consumir webservices bajo Https con Java
Si queremos consumir un WS que corre bajo https podemos realizar lo siguiente:
Paso 1/ Descargar los certificados del servicio
El Keysotre o JKS (Java Key Store) es un repositorio de certificados de seguridad, certificados de autorización o certificados de clave pública, utilizados por ejemplo en el cifrado SSL. Usualmente el JDK contiene un almacén de claves de certificados de autorización (CA) en la ruta jre/lib/security/cacerts. Así mismo el JDK provee una herramienta llamada keytool para manipular el keystore.
Para importar un certificado a nuestro keystore, lo primero que debemos hacer es descargar dicho certificado desde la dirección url del wsdl. Para ello ponemos esa url en un navegador. Al cargar la página podremos comprobar que junto a la barra de direccion saldrá un candado o algo similar (depende del navegador). Al hace click sobre él se nos abrirá un formulario donde se puede ver toda la información referente a los certificados que se usan. Dese esa pantalla se deben exportar (dependiendo del navegador será más o menos complejo encontrar el botón de exportar/copiar en archivo/…).
Se debe exportar en formato X.509 codificado base 64 (.CER)
Paso 2/ Importar el certificado digital a nuestro keystore
Se deben importar los certificados descargados a nuestro almacen de claves. Hay herramientas desde las que se puede hacer de forma bastante cómodo como es Keystore Explorer. Pero sino siempre puedes usar keytool:
keytool -import -keystore "C:\Archivos de programa\Java\jre1.6.0_05\lib\security\cacerts" -file c:\certificadodescargado.cer -storepass changeit
Paso 3/ Utilización
Ahora al ejecutar nuestra aplicación java al intentar conectar con ese ws localizará los certificados y dejará realizar la conexión. Se le puede indicar donde esta nuestro almacen de certificados así:
System.setProperty("javax.net.ssl.keyStore", "C:\Program Files (x86)\Java\jdk1.6.0_23\jre\lib\security\cacerts"); System.setProperty("javax.net.ssl.keyStorePassword", "changeit"); System.setProperty("javax.net.ssl.trustStore", "C:\Program Files (x86)\Java\jdk1.6.0_23\jre\lib\security\cacerts"); System.setProperty("javax.net.ssl.trustStorePassword", "changeit");
Usar Apache CXF para montar servicios en java
En primer lugar comentar unos conceptos básicos… tenemos dos tipos de servicios web: SOAP y REST.
– SOAP consiste en el intercambio de mensajes envueltos en un XML. El cliente envía un mensaje XML en formato SOAP, dicho mensaje es recibido por el servidor, que desencapsula dicho mensaje en el formato correspondiente (SOAP es multilenguaje, acepta varios lenguajes, entre ellos Java), que recibe los datos, procesa una respuesta y la devuelve.
En Java existe la implementación JAX WS.
– Rest es una implementación posterior. No sólo utiliza un tipo de mensaje HTTP para el intercambio de mensajes, si no que permite más mensajes. Con Rest puedes tener un cliente que envíe mensajes HTTP de tipo GET, PUT, POST y DELETE. Cada mensaje enviará los datos correspondientes asociados hacia el servidor, que, recibirá la petición, la entenderá, y delegará en el método correspondiente. GET sirve para recuperar un dato desde el cliente al servidor, PUT para insertar un dato, POST para enviar información para modificar y DELETE para eliminar información del servidor.
En Java existe la implementación JAX RS.
Una forma muy sencilla de montar nuestros servicios en java es utilizar Apache CXF que se adapta tanto a Jax WS como a Jax RS. Además, se integra muy bien con Spring.
En la documentación hay numerosos ejemplos: Documentación oficial
A continuación un par de ejemplos muy sencillos:
package es.com.disastercode; import javax.jws.WebService; @WebService public interface EjemploService{ String getTipoCoche(String matricula); }
Archivo de implementación JAX WS. Para exponer un servicio y publicarlo en un contendor de aplicaciones que soporte JAX-WS. Automáticamente el contenedor se encargará de generar el contrato (WSDL).
package es.com.disastercode; import javax.jws.WebService; @WebService(endpointInterface = "es.com.disastercode.EjemploService") public class EjemploServiceWSImpl implements EjemploService { public String getTipoCoche(String matricula) { return "Seat Ibiza"; } }
Archivo de implementación JAX-RS. Permite realizar lo mismo que antes pero exponiendolo como recursos REST.
package es.com.disastercode; import javax.jws.WebService; import javax.ws.rs.GET; import javax.ws.rs.Path; import javax.ws.rs.PathParam; import javax.ws.rs.Produces; @WebService(endpointInterface = "es.com.disastercode.EjemploService") @Produces("application/json") public class EjemploServiceRSImpl implements EjemploService { @GET @Path("/{matricula}") public String getTipoCoche(@PathParam("matricula")String matricula) { return "Seat Ibiza"; } }
Ahora sólo nos faltaría configurar los servicios en Spring. Para ello:
1/ añadir al web.xml:
< context-param> < param-name>contextConfigLocation< /param-name> < param-value>WEB-INF/appCtx.xml< /param-value> < /context-param> < listener> < listener-class> org.springframework.web.context.ContextLoaderListener < /listener-class> < /listener> < servlet> < servlet-name>CXFServlet < servlet-class> org.apache.cxf.transport.servlet.CXFServlet < /servlet-class> < load-on-startup>1 < /servlet> < servlet-mapping>CXFServlet /* < /servlet-mapping>
2/ añadir la configuración de JAX WS a spring.
< beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:jaxws="http://cxf.apache.org/jaxws" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd"> < import resource="classpath:META-INF/cxf/cxf.xml" /> < import resource="classpath:META-INF/cxf/cxf-servlet.xml" /> < import resource="classpath:META-INF/cxf/cxf-extension-soap.xml" /> < bean id="ejemploServiceController" class="es.com.disastercode.EjemploServiceWSImpl"> < /bean> < jaxws:endpoint id="ejemploService" implementor="#ejemploServiceController" address="/ws/exps"> < jaxws:dataBinding>< /bean> < /jaxws:dataBinding> < /jaxws:endpoint> < /beans>
3/ añadir la configuración de JAX RS a spring.
< beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:jaxrs="http://cxf.apache.org/jaxrs" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd http://cxf.apache.org/jaxrs http://cxf.apache.org/schemas/jaxrs.xsd"> < import resource="classpath:META-INF/cxf/cxf.xml" /> < import resource="classpath:META-INF/cxf/cxf-servlet.xml" /> < import resource="classpath*:META-INF/cxf/cxf-extension-*.xml" /> < bean id="ejemploServiceRestController" class="es.com.disastercode.EjemploServiceRSImpl"> < /bean> < jaxrs:server id="ejemploServiceRest" address="/rest"> < jaxrs:serviceBeans> < ref bean="ejemploServiceRestController" /> < /jaxrs:serviceBeans> < jaxrs:providers> < ref bean="jsonProvider"/> < /jaxrs:providers> < jaxrs:features> < /jaxrs:features> < /jaxrs:server> < bean id="jsonProvider" class="org.codehaus.jackson.jaxrs.JacksonJsonProvider"/> < /beans>
Advanced REST client
El Advanced Rest Client es una extensión de Chrome. Su función es permitir lanzar peticiones a servicios web o APIs RestFul. Se puede hacer cualquier tipo de petición: GET, POST, PUT, DELETE…. Permitiendo pasar parámetros a las peticiones y muestra el resultado devuelto por el servicio que queremos probar.
Lo puedes descargar aguí.
Captura de la pantalla principal:
Como usar la API de Twiter (parte 2)
A continuación, se muestra un ejemplo de como usar la API de Twiter con PHP.
En primer lugar comentar que se va a utilizar la librería TwitterAPIExchange. Esta librería contiene las funciones necesarias para conectar la API con los credenciales del usuario y realizar de una manera sencilla las operaciones deseadas.
Variable settings con los tokens a usar:
$settings = array( 'oauth_access_token' => "", 'oauth_access_token_secret' => "", 'consumer_key' => "", 'consumer_secret' => "" );
Ejemplo 1: Listar los ids de los amigos que tiene el usuario robertopf81
//DOC: https://dev.twitter.com/docs/api/1.1/get/friends/ids function listIdsFriends($usuario, $settings){ ini_set('display_errors', 1); require_once('TwitterAPIExchange.php'); $url = 'https://api.twitter.com/1.1/friends/ids.json'; $getfield = '?cursor=-1&screen_name='.$usuario.'&count=5000'; $requestMethod = 'GET'; $twitter = new TwitterAPIExchange($settings); $json = $twitter->setGetfield($getfield)->buildOauth($url, $requestMethod)->performRequest(); return $json; } //ahora la utilizariamos así: $friends = listIdsFriends("robertopf81", $settings); $jsonFriends = json_decode($friends); $num_friends = count($jsonFriends->ids); for($i=0; $i<$num_friends; $i++){ $user = $jsonFriends->ids[$i]; echo "Friend ". ($i+1) . ": " . $user . "
"; }
Ejemplo 2: Seguir a un nuevo amigo llamado usuarioaseguir.
//DOC: https://dev.twitter.com/docs/api/1.1/post/friendships/create function follow($usuario, $settings){ ini_set('display_errors', 1); require_once('TwitterAPIExchange.php'); $url = 'https://api.twitter.com/1.1/friendships/create.json'; $requestMethod = 'POST'; $postfields = array( 'screen_name' => $usuario,'follow' => "true" ); $twitter = new TwitterAPIExchange($settings); return $twitter->buildOauth($url, $requestMethod)->setPostfields($postfields)->performRequest(); } //ahora la utilizariamos así: $respuesta = follow("usuarioaseguir", $settings); echo $respuesta; $json = json_decode($respuesta); echo ''; echo "Usuario: ".$json->name." (@".$json->screen_name.")"; echo "
"; echo "ID USER: ".$json->id_str; echo "
"; echo "Fecha Envio: ".$json->created_at;
Se han dejado en github estos ejemplos y alguno más: ver aquí.
Como usar la API de Twiter (parte 1)
Si tienes una cuenta de twiter y quieres realizarte una aplicación personalizada que utilice toda la información que hay en twiter (número de seguidores, amigos, tweets, etc), la gente de Twiter nos facilita una serie de llamadas rest que podemos utilizar para interactuar con ellos. Más información aquí.
En primer lugar decir que a día de hoy la versión de la API de twitter es la 1.1 (la 1.0 ya está deprecada). Esta versión 1.1 requiere usar autentificación OAUTH, de otra forma no podremos poner a funcionar la aplicación.
Por lo tanto para poder utilizar la api se deben seguir estos pasos:
1/ Crear una cuenta de desarrollador: esto se hace en https://dev.twitter.com/
2/ Una vez creada la cuenta de desarrollador ya podrás crear una nueva aplicación en la zona de «Mis Aplicaciones«.
3/ Tras crear la aplicación lo siguiente es crear los Tokens de acceso. (API keys y Access Tokens)
4/ Llegados a este punto ya podriamos utilizar la api. Existen ya un gran número de librerias que nos facilitaran el uso del api twiter para no tener que implementarlo de cero. Además, hay librerías para casi cualquier lenguaje posible. (Ver aquí)
Consumir un Web Service con Ajax
Cómo ejemplo utilizaré un servicio soap que tengo creado con NUSOAP. http://genparte.disastercode.com.es/ws/servicioWsdl.php?wsdl
Se hace una petición al método getCalendarFestive del ws. A este método se le debe pasar un parámetro de entrada strName.
Tras hacer la petición, si todo va bien se ejecutará el evento success donde rellenamos un array con la información obtenida.
var soapMessage = '< soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">'+ '< soap:Body>'+ '< getCalendarFestive xmlns="http://genparte.disastercode.com.es">'+ '< strName>.....< /strName>'+ '< /getCalendarFestive>'+ '< /soap:Body>'+ '< /soap:Envelope>'; $.ajax({ url: 'http://genparte.disastercode.com.es/ws/servicioWsdl.php?wsdl', type: "POST", dataType: "xml", contentType: "text/xml", data: soapMessage, success: function(data, status, req, xml, xmlHttpRequest, responseXML) { $(req.responseXML).find('return').each(function(){ if( $(this).find('type')){ var total = $(this).find("type").length; var days = new Array(); for(i= 0; i < total; i++) { var strType = $(this).find("type")[i].childNodes[0].nodeValue; var strDate = $(this).find("date")[i].childNodes[0].nodeValue; days[i] = strDate; } } }); }, error: function processError(data, status, req) { console.log(data); console.log(status); console.log(req); } });
Generador de partes de trabajo
Aplicación web que te genera los partes de horas mensuales en formato *.xls
DEMO: http://genparte.disastercode.com.es
GitHub: https://github.com/roberto-pf/GenParte
Tecnologías empleadas:
– Plugin Fullcalendar de Jquery para implementar el calendario.http://arshaw.com/fullcalendar/
– Nusoap, como servidor web para los días festivos.http://sourceforge.net/projects/nusoap/
– PHPExcel, como librería para generar la hoja de excel.http://phpexcel.codeplex.com/
– Diseño formularios:
Formly -> http://thrivingkings.com/read/Formly-The-form-glamorizer-for-jQuery
NiceForms -> http://www.emblematiq.com/lab/niceforms/
Consultar un Servicio Web en Android utilizando la librería KSOAP
Se va a utilizar para el ejemplo el servicio web implementado en la entrada anterior (Recordar que se creó un servicio web con wsdl en php utilizando la librería nusoap).
1 – Descargar la librería Ksoap aquí.
2 – Copiarla en la carpeta libs de tu proyecto Android. Añadirla al «Build path» y seleccionarla en “Order and Export”.
3 – Ahora ya se puede utilizar. Y esto sería un ejemplo de utilización:
private static final String SOAP_ACTION = "getNombre"; private static final String METHOD_NAME = "getNombre"; private static final String NAMESPACE = "http://disastercode.com.es/ws/nusoap"; private static final String URL = "http://disastercode.com.es/ws/servicioWsdl.php?wsdl"; private void pruebaWS(){ String res = ""; SoapObject soapclient = new SoapObject(NAMESPACE,METHOD_NAME); soapclient.addProperty("dni","99999999N"); SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11); envelope.setOutputSoapObject(soapclient); HttpTransportSE httpTransportSE = new HttpTransportSE(URL); try { httpTransportSE.call(SOAP_ACTION, envelope); res = envelope.getResponse().toString(); } catch (Exception e) { e.printStackTrace(); } //TODO en la variable res tienes el valor devuelto por el ws }
Crear un Web Service con WSDL en PHP utilizando NUSOAP
1 – Implementar el servicio web. Archivo servicioWsdl.php
require_once("lib/nusoap.php"); $ns="http://disastercode.com.es/ws/nusoap"; $server = new soap_server(); $server->configureWSDL('CalculadoraWSDL',$ns); $server->wsdl->schemaTargetNamespace=$ns; $server->register('getNombre',array('dni' => 'xsd:string'),array('return' => 'xsd:string'),$ns); function getNombre($aux){ if($aux == '99999999N') return new soapval('return','xsd:string','Manolito Gafotas'); return new soapval('return','xsd:string',''); } $server->service($HTTP_RAW_POST_DATA); ?>
Comprobar que el wsdl se crea correctamente: http://disastercode.com.es/ws/servicioWsdl.php?wsdl
2 – Implementar un cliente de prueba. Archivo clienteWsdl.php
require_once('lib/nusoap.php'); $wsdl="http://disastercode.com.es/ws/servicioWsdl.php?wsdl"; //$client=new soapclient($wsdl, 'wsdl'); //esto no funcionará si el servidor tiene habilitada la extensión SOAP para PHP $client=new nusoap_client($wsdl, 'wsdl'); $param=array( 'dni'=>'99999999N' ); echo "DNI: 99999999N; ".$client->call('getNombre', $param)."
"; $param=array( 'dni'=>'45654654P' ); echo "DNI: 45654654P; ".$client->call('getNombre', $param); ?>
Para probarlo: http://disastercode.com.es/ws/clienteWsdl.php
Categorias
- adobe (2)
- agile (1)
- Alfresco (1)
- Android (26)
- Angular (6)
- angularjs (10)
- apache (1)
- axis (2)
- Bases de datos (14)
- Bootstrap (1)
- C# (3)
- Cámara (1)
- chrome (3)
- Codeigniter (2)
- Control de Versiones (2)
- CSS (25)
- CVS (1)
- Django (9)
- Django Rest Framework (1)
- DNS (1)
- Docker (3)
- dominio (1)
- eclipse (5)
- Entity Framework (2)
- ETL (1)
- Firefox (6)
- flash (1)
- freecad (1)
- Git (12)
- GitHub (4)
- gpg (2)
- Groovy (1)
- Handlebars (1)
- hibernate (4)
- hosting (1)
- HTML (50)
- HTML 5 (26)
- Impresión 3D (9)
- Inkscape (1)
- IOS (2)
- ireports (3)
- Java (44)
- Javascript (55)
- JBoss (5)
- JPA (2)
- JQuery (20)
- Json (7)
- JSP (6)
- Keycloak (1)
- Lamp (1)
- LDAP (2)
- lean (1)
- linkedin (1)
- LINQ (1)
- linux (13)
- Livecycle (1)
- log (1)
- microcontroladores (1)
- MongoDB (4)
- MySQL (8)
- Node.js (5)
- OC4J (1)
- Openshift (2)
- Oracle (6)
- Patrones de Diseño (1)
- Photoshop (2)
- php (20)
- PostgreSQL (1)
- python (19)
- rabbitmq (1)
- Raspberry PI (13)
- Raspherry PI (5)
- React (6)
- seguridad (3)
- Selenium (3)
- Sencha Touch (1)
- Sin categoría (29)
- Spring (17)
- spring-boot (3)
- SQL (7)
- SQLServer (1)
- SSO (1)
- struts (2)
- SVN (1)
- Talend (1)
- Tomcat (6)
- unity (3)
- Visual Studio Code (2)
- vmware (5)
- Web Services (11)
- windows (18)
- wordpress (10)
- Xiaomi (1)
- xml (2)
Trabajos Realizados
- App Android – Autoka Fr
- App Android – Cartelera Cántabra
- App Android – Gramática y Vocabulario Ingles
- App Android – Hoja de Gastos
- App Android – Hotel Torre Cristina
- App Android – OcioEnjoy
- App Android – Visor CardBoard
- App Firefox – Managapp
- DiamanteBomba – DisasterCode
- Generador de Partes de Trabajo
- GitHub – Android Web Generator
- GitHub – Dynamic Angular Gallery
- GitHub – Dynamic React Gallery
- GitHub – Sotilizator
- GitHub – SpringAngularJS
- GitHub – Swiper Dynamic Angular Gallery
- HazParejas – DisasterCode
- RompeCabezas – DisasterCode
- Unity Game – English Couple
- Unity Game – Kill Wasp
- WordPress – El Buen Apicultor
- WordPress – El Cajón de los Retales
- WordPress – El Vestidito Azul
- WordPress – Feuchas
- WordPress – Fragua de Navajas Ponce
- WordPress – Humor a las Tres
- WordPress – Photo Places