JAVA – PHP – MySQL: V Insertar datos en MySQL desde JAVA con PHP

Buenas días a todos!, en este quinto tutorial de JAVA - PHP -MySQL vamos a ver como podemos comunicarnos insertar datos a una base de datos MySQL desde JAVA con PHP, en un principio el esquema que vamos a seguir es una arquitectura cliente-servidor, podéis ver un esquema en el siguiente gráfico:

[caption id="attachment_6525" align="aligncenter" width="600"]

Esquema JAVA - PHP - MySQL[/caption] Antes de empezar, vamos a repasar el índice de esta serie de tutoriales así como los objetivos que nos proponemos.

  1. JAVA – PHP – MySQL: I Introducción
  2. JAVA – PHP – MySQL: II Creación de una base de datos en MySQL
  3. JAVA – PHP – MySQL: III Crear una conexión con la base de datos en PHP
  4. JAVA – PHP – MySQL: IV Consultas Básicas e inserción de datos en PHP
  5. JAVA – PHP – MySQL: V Insertar datos en MySQL desde JAVA con PHP
  6. JAVA – PHP – MySQL: VI Obtener datos de MySQL en JAVA con PHP

Los objetivos que nos proponemos con esta serie de tutoriales son los siguientes:

MySQL

  • Aprender a crear una base de datos en MySQL.

PHP

  • Aprender a insertar datos en nuestra base de datos.
  • Aprender a mostrar datos de nuestra base de datos.
  • Consolidar los conocimientos aprendidos en la serie de tutoriales JSON.
  • Mostrar los datos introducidos en la base de datos en pantalla.

JAVA

  • Crear JSON a partir de los datos introducidos por el usuario.
  • Enviar JSON vía GET en JAVA.
  • Enviar JSON vía POST en JAVA.
  • Obtener un JSON generado en PHP.

Una vez que hemos repasado lo que pretendemos hacer vamos a comenzar este quinto tutorial de JAVA - PHP - MySQL. Para continuar un poco con la línea de los tutoriales vamos a suponer que hemos realizado los anteriores tutoriales satisfactoriamente. Hemos creado una base de datos donde almacenaremos los datos de usuario (Tutorial II). Seguidamente hemos creado una clase en PHP para administrar esta tabla en la base de datos (Tutorial IV).

Este tutorial consta de dos partes, la parte del cliente (Java) donde se generará un JSON (Ver serie de Tutoriales JSON)  y se enviará por POST a la parte del servidor (PHP), el cual consistirá en un archivo PHP que espera una llegada de datos por POST, procesará el contenido del JSON y lo almacenará en la base de datos.

Servidor

Teniendo en cuenta que en el tutorial anterior creamos una clase llamada usuariosClass.php con las siguientes funciones:

  • conectarBD
  • desconectarBD
  • getArraySQL
  • createUser
  • getAllInfo
  • getNombre
  • getApellidos
  • getEmail

Vamos a crear dos archivos en PHP que este a la escucha de datos, los archivos en cuestión serán listenPost.php y listenGet.php. El primero de ellos escuchará llamadas mediante método POST, mediante que el segundo escuchará las llamadas mediante el método GET.

A continuación se mostrará el código de ambos archivos comentados.

listenPost.php

<meta charset="utf-8"> <?php /** *Autor: Alejandro Esquiva Rodríguez (@alex_esquiva) *Desarrollado para Geeky Theory * *Este archivo estará a la escucha de llamadas procedentes del cliente JAVA */ //--Incluimos el archivo en usuarioClass.php require_once("usuarioClass.php"); //Comprobamos si hemos recibido alguna llamada por GET if(isset($_POST["json"])){ $json = $_POST["json"]; $json = urldecode($json); $json = str_replace("\\", "",$json); $jsonencode = json_decode($json); //--Creamos un objeto de la clase usuarioClass $userObject = new Usuarios(); //Insertamos un nuevo usuario en la base de datos $userObject->createUser($jsonencode[0]->nombre,$jsonencode[0]->apellidos,$jsonencode[0]->email); }

listenGet.php

<meta charset="utf-8"> <?php /** *Autor: Alejandro Esquiva Rodríguez (@alex_esquiva) *Desarrollado para Geeky Theory * *Este archivo estará a la escucha de llamadas procedentes del cliente JAVA */ //--Incluimos el archivo en usuarioClass.php require_once("usuarioClass.php"); //Comprobamos si hemos recibido alguna llamada por GET if(isset($_GET["json"])){ $json = $_GET["json"]; $json = urldecode($json); $json = str_replace("\\", "",$json); $jsonencode = json_decode($json); //--Creamos un objeto de la clase usuarioClass $userObject = new Usuarios(); //Insertamos un nuevo usuario en la base de datos $userObject->createUser($jsonencode[0]->nombre,$jsonencode[0]->apellidos,$jsonencode[0]->email); } En ambos casos comprobamos  que hemos recibido un parámetro llamado json con el contenido del JSON en texto plan, una vez que hemos recibido el JSON lo tenemos que decodificar y eliminar la barra "\". Decodificamos el JSON e insertamos un nuevo usuario en la base de datos.

Cliente

Una vez que hemos creado nuestro servidor en PHP para la escucha de datos, vamos a crear un nuevo programa en JAVA que envíe los datos  a nuestro servidor. En mi caso el servidor será local por lo que las llamadas deberán enviarse a localhost.

Vamos  a usar Netbeans como IDE JAVA. En primer lugar creamos una nueva aplicación Java llamada JavaPHPMySQL cuyo main contenga lo siguiente:

/* * To change this license header, choose License Headers in Project Properties. * To change this template file, choose Tools | Templates * and open the template in the editor. */ package javaphpmysql; import java.io.BufferedReader; import java.io.DataOutputStream; import java.io.InputStreamReader; import static java.lang.System.in; import java.net.HttpURLConnection; import java.net.URL; import java.net.URLEncoder; import java.util.Arrays; import java.util.LinkedList; import java.util.List; import org.json.simple.JSONObject; import org.json.simple.JSONValue; /** * * @author IdeaPad Z500 */ public class JavaPHPMySQL { /** * @param args the command line arguments */ private static final String USER_AGENT = "Mozilla/5.0"; private static final String SERVER_PATH = "http://localhost/"; static String nombre = "Alejandro"; static String apellidos = "Esquiva Rodríguez"; static String email = "alejandro@geekytheory.com"; public static void main(String[] args) { //Tenemos dos funciones, una para enviar por GET y otra para enviar por POST sendPost(); //sendGet(); } public static void sendPost(){ //Creamos un objeto JSON JSONObject jsonObj = new JSONObject(); //Añadimos el nombre, apellidos y email del usuario jsonObj.put("nombre",nombre); jsonObj.put("apellidos", apellidos); jsonObj.put("email", email); //Creamos una lista para almacenar el JSON List  l = new LinkedList(); l.addAll(Arrays.asList(jsonObj)); //Generamos el String JSON String jsonString = JSONValue.toJSONString(l); System.out.println("JSON GENERADO:"); System.out.println(jsonString); System.out.println(""); try { //Codificar el json a URL jsonString = URLEncoder.encode(jsonString, "UTF-8"); //Generar la URL String url = SERVER_PATH+"listenPost.php"; //Creamos un nuevo objeto URL con la url donde queremos enviar el JSON URL obj = new URL(url); //Creamos un objeto de conexión HttpURLConnection con = (HttpURLConnection) obj.openConnection(); //Añadimos la cabecera con.setRequestMethod("POST"); con.setRequestProperty("User-Agent", USER_AGENT); con.setRequestProperty("Accept-Language", "en-US,en;q=0.5"); //Creamos los parametros para enviar String urlParameters = "json="+jsonString; // Enviamos los datos por POST con.setDoOutput(true); DataOutputStream wr = new DataOutputStream(con.getOutputStream()); wr.writeBytes(urlParameters); wr.flush(); wr.close(); //Capturamos la respuesta del servidor int responseCode = con.getResponseCode(); System.out.println("\nSending 'POST' request to URL : " + url); System.out.println("Post parameters : " + urlParameters); System.out.println("Response Code : " + responseCode); BufferedReader in = new BufferedReader( new InputStreamReader(con.getInputStream())); String inputLine; StringBuffer response = new StringBuffer(); while ((inputLine = in.readLine()) != null) { response.append(inputLine); } //Mostramos la respuesta del servidor por consola System.out.println(response); //cerramos la conexión in.close(); } catch (Exception e) { e.printStackTrace(); } } public static void sendGet(){ //Creamos un objeto JSON JSONObject jsonObj = new JSONObject(); //Añadimos el nombre, apellidos y email del usuario jsonObj.put("nombre",nombre); jsonObj.put("apellidos", apellidos); jsonObj.put("email", email); //Creamos una lista para almacenar el JSON List  l = new LinkedList(); l.addAll(Arrays.asList(jsonObj)); //Generamos el String JSON String jsonString = JSONValue.toJSONString(l); System.out.println("JSON GENERADO:"); System.out.println(jsonString); System.out.println(""); try{ //Codificar el json a URL jsonString = URLEncoder.encode(jsonString, "UTF-8"); //Generar la URL String url = SERVER_PATH+"listenGet.php?json="+jsonString; URL obj = new URL(url); HttpURLConnection con = (HttpURLConnection) obj.openConnection(); // optional default is GET con.setRequestMethod("GET"); //add request header con.setRequestProperty("User-Agent", USER_AGENT); int responseCode = con.getResponseCode(); System.out.println("\nSending 'GET' request to URL : " + url); System.out.println("Response Code : " + responseCode); BufferedReader in = new BufferedReader( new InputStreamReader(con.getInputStream())); String inputLine; StringBuffer response = new StringBuffer(); while ((inputLine = in.readLine()) != null) { response.append(inputLine); } in.close(); //print result System.out.println(response.toString()); }catch (Exception e) { e.printStackTrace(); } } } Antes de comenzar a explicar el código por encima hay que indicar que para que este ejemplo funciones es necesario importar la librería json-simple-1.1.1.jar en nuestro proyecto. Esta librería nos permitirá gestionar objetos JSON. Observamos que la clase principal del cliente consta de dos métodos para enviar los datos encapsulados en un JSON, el método sendPost() y sendGet(). Es obvio que el metodo sendPost enviará un JSON encapsulado a nuestro servidor mediante POST y el método sendGet lo enviará mediante método GET. Podemos observar que ambos métodos son similares. en un principio generamos en texto plano un JSON con los datos del usuario que queramos, en el ejemplo he puesto mis propios datos. Una vez que tenemos el JSON en texto plano lo enviamos con ayuda de los objetos URL url y HttpURLConnection con. Así mismo obtenemos la respuesta del servidor y la mostramos por pantalla.

Por último, hay que tener en cuenta los siguientes puntos a la hora de realizar este tutorial:

  • Hay que indicar la url del servidor donde queremos enviar los datos en la constante SERVER_PATH.
  • Este tutorial se ha basado en el envio de JSON, pero no es extrictamente necesario encapsular los datos en un JSON, podemos enviar los datos en texto plano si queremos, enviar los datos en JSON nos va a ahorrar trabajo a la hora de que enviemos una gran cantidad de datos a almacenar.
  • El envío de datos por GET tiene la desventaja de la cantidad de caracteres que podemos enviar por este método, si enviamos muchos datos a la vez encapsulados en un JSON nos podría dar error de longitud.

PODÉIS DESCARGAR EL CÓDIGO EN EL SIGUIENTE REPOSITORIO DE GITHUB.

Y esto es todo, espero que os haya gustado este quinto tutorial de la serie JAVA - PHP - MYSQL, en el próximo y último tutorial de la serie vamos a hacer exactamente lo inverso de este tutorial, vamos a recibir y mostrar los datos en una aplicación de JAVA. Un saludo @alex_esquiva!