Es importante recordar que el método PUT hace un reemplazo, no modificaciones puntuales. Por ello la información que enviemos a través de la petición debe ser completa.
<?php
$allowedResourceTypes =['books','authors','genres'];$resourceType = $_GET['resource_type'];if(!in_array($resourceType, $allowedResourceTypes)){ die;}// Defino los recursos$books =[1=>['titulo'=>'Lo que el viento se llevo','id_autor'=>2,'id_genero'=>2,],2=>['titulo'=>'La Iliada','id_autor'=>1,'id_genero'=>1,],3=>['titulo'=>'La Odisea','id_autor'=>1,'id_genero'=>1,],];// Se indica al cliente que lo que recibirá es un jsonheader('Content-Type: application/json');// Levantamos el id del recurso buscado$resourceId =array_key_exists('resource_id', $_GET)? $_GET['resource_id']:'';// Generamos la respuesta asumiendo que el pedido es correcto y devilvemos en formafo jsonswitch(strtoupper($_SERVER['REQUEST_METHOD'])){case'GET':// en caso de que no pidan ningun recursoif(empty( $resourceId )){ echo json_encode( $books );}else{// si llegan a pedir un recurso en especificoif(array_key_exists( $resourceId, $books)){ echo json_encode( $books[ $resourceId ]);}}break;case'POST': $json =file_get_contents('php://input');// transformamos el json recibido a un nuevo elemento del arreglo $books[]=json_decode($json,true);// emitimos hacia la salida la ultima clave del arreglo de los libros// echo array_keys( $books )[count($books) -1]; echo json_encode($books);break;case'PUT'://validamos que el recurso buscado existaif(!empty($resourceId)&&array_key_exists($resourceId, $books)){// Tomamos la entrada cruda $json =file_get_contents('php://input');// transformamos el json recibido a un nuevo elemento del arreglo $books[$resourceId]=json_decode($json,true);// Retornamos la coleccion modificada en formato json echo json_encode($books);}break;case'DELETE':break;}// Inicio el servidor en la terminal 1, aqui le asignamos el puerto 8000// php -S localhost:8000 server.php// Terminal 2 ejecutar // curl http://localhost:8000 -v// curl http://localhost:8000/\?resource_type\=books// curl http://localhost:8000/\?resource_type\=books | jq// ver la comunicacion a través de los encabezados:// $ curl http://localhost:8000/\?resource_type\=books -v > /dev/null// consulta//$curl "http://localhost:8000?resource_type=books&resource_id=1"// Método POST//curl -X 'POST' http://localhost:8000/books -d '{"titulo":"Nuevo Libro","id_autor":1,"id_genero":2}'// Método Put - el recurso 1 será reemplazado por el libro que estoy creando// $ curl -X 'PUT' http://localhost:8000/books/1 -d '{"titulo": "Nuevo Libro", "id_autor": 1, "id_genero": 2}'?>
Gracias por el aporte.
PATCH
HTTP PUT method only allows a complete replacement of a document. A PATCH request on the other hand, is used to make changes to part of the resource at a location. That is, it PATCHES the resource — changing its properties. It is used to make minor updates to resources and it's not required to be idempotent.
Buen aporte
GET
El método GET solicita una representación de un recurso específico. Las peticiones que usan el método GET sólo deben recuperar datos.
HEAD
El método HEAD pide una respuesta idéntica a la de una petición GET, pero sin el cuerpo de la respuesta.
POST
El método POST se utiliza para enviar una entidad a un recurso en específico, causando a menudo un cambio en el estado o efectos secundarios en el servidor.
PUT
El modo PUT reemplaza todas las representaciones actuales del recurso de destino con la carga útil de la petición.
DELETE
El método DELETE borra un recurso en específico.
CONNECT
El método CONNECT establece un túnel hacia el servidor identificado por el recurso.
OPTIONS
El método OPTIONS es utilizado para describir las opciones de comunicación para el recurso de destino.
TRACE
El método TRACE realiza una prueba de bucle de retorno de mensaje a lo largo de la ruta al recurso de destino.
PATCH
El método PATCH es utilizado para aplicar modificaciones parciales a un recurso.
Gracias por los comandos Mr.Perez.
Vale, PUT hace un reemplazo COMPLETO del recurso, si queremos hacer modificaciones puntuales debemos usar el método PATCH (Recomiendo investigarlo)
Apuntes:
La modificación de datos correspondería a un update en un CRUD, y tiene partes similares a las de GET y POST.
Nota: Para los que usan IIS, deben dirigirse a la herramienta de “asignaciones de controlador”, hacer doble click en el controlador de PHP (para el caso que tengan instalados mas de 2 interpretes, seleccionen el que les aparezca en el phpinfo), dirigirse a la opción de restricciones de solicitudes, luego en la pestaña de los versos, seleccionar “todos los verbos”. IIS por defecto nos presenta problemas con los verbos PUT y DELETE.
Gracias!
Mi version en Python basándome en el código de demás usuarios de clases previas:
# Importsfrom flask importFlask, jsonify, make_response
from flask_restful importResource,Api, abort, request
# Create app and api
app =Flask(__name__)api =Api(app)# Data base
BOOKS={'1':{'isbn':'744586','title':'Cien años de soledad','description':'Lorem insup lol.','autor':'Gabriel Garcia Marquez'},'2':{'isbn':'7894546','title':'De animales a dioses','description':'Lorem insup lol.','autor':'Yuval Noah Harari'}}# Aborts the request and returns an error
def abort_if_book_doesnt_exits(book_id):if book_id not inBOOKS:abort(404, message='El libro con id {} no existe'.format(book_id))# Returns the whole book list
classBookList(Resource): def get(self):returnjsonify({'data':BOOKS}) # Returnsas json in data variables
# Metodo para agregar nuevo libro
def post(self): # Getting the request as json format
json = request.get_json(force=True) # Index to post the newbook index =len(BOOKS)+1 # Putting the newbookin the database
BOOKS.update({'{}'.format(index): json }) # Returining the ID to the user
return'Libro agregado correctamente con ID: '+str(index)# Returns an especific id book
classBook(Resource): def get(self, book_id):abort_if_book_doesnt_exits(book_id)returnmake_response(jsonify(BOOKS[book_id]),200) # Returns a response as json with some info code
def put(self, book_id): # Getting the request as json format
json = request.get_json(force=True) # If the id donesn't exist, then quit
abort_if_book_doesnt_exits(book_id) # Replace the information of the book
BOOKS.update({'{}'.format(book_id): json}) # Return the whole collection
returnjsonify(BOOKS)classAuthors(Resource): pass
classGeneres(Resource): pass
# Add resources asREST arquitecture
api.add_resource(BookList,'/books')api.add_resource(Book,'/books/<book_id>') #<> means it's a variable
api.add_resource(Authors,'/authors')api.add_resource(Generes,'/generes')if __name__ =='__main__': app.run(debug=True)
El método PUT hace reemplazos, la información se debe de enviar completa.
Petición:
$ curl -X 'PUT' http://localhost:8000/books/1 -d '{"titulo": "Nuevo Libro", "id_autor": 1, "id_genero": 2}'
El metodo PUT reemplaza toda la información completa del recurso, pero existe también el metodo PATCH que puede reemplazar datos específicos, como por ejemplo solo el nombre, o solo el autor
GET para obtener un recurso del servidor del servidor
POST para actualizar un recurso del servidor
PUT para crear un recurso del servidor
DELETE para eliminar un recurso del servidor
te quedo cruzado post y put
Upps cierto.
POST para crear un recurso del servidor
PUT para actualizar un recurso del servidor
¿Por qué existe PATCH en REST?
La razón de tener ambos métodos es que, en algunos casos, quieres evitar sobrecargar la comunicación enviando datos innecesarios. PATCH es más ligero porque solo envías los datos que cambian, lo que puede ser muy eficiente en aplicaciones con grandes recursos o estructuras de datos. Esto también minimiza el riesgo de sobrescribir campos no deseados.
¿Y si quiero hacer alguna modificación puntual? ¿Hay algún método que me permita hacerlo?
Hola Gonza. Para modificar atributos especificos de una entidad se utiliza el método PATCH.)
Saludos, alguien tiene una idea si en vez de un array se guarde en una base de datos ejemplo mysql en php? el encabezado y el detalle ejemplo si fuera un tipo factura.
¿Podrías elaborar mas sobre tu pregunta? no es muy clara aún.
Saludos, imagina que tengo un array encabezado de factura con datos de cliente, fecha, numero de factura, monto total, etc y otra con el detalle de los productos de esa factura relacionado con una clave foranea. Quisiera guardar esa transacción completa en una base de datos cada array en su tabla correspondiente.
Pesimo curso, le netflix
Por qué crees que es un pésimo curso? Cuéntanos
Creo que este no es un curso para principiantes.
Es un curso para alguien que haya hecho el backend de servidores web.
Para quien se haya estrellado leyendo parametros, pasando informacion, haciendo querys en bases de datos, codificando en json.
Si uno no tiene esos prerequisitos es facil perderse.
Las clases son cortas pero llenas de contenido. Me ha tocado repetir algunas varias veces.
Fragmento de código en javascript con los ejemplos que pase en las clases anteriores:
app.put('/books/:id',(req, res)=>{const paramId = req.params.id// Verifica si se ha puesto un id y que este existaif(paramId && books[paramId]){const book = books[paramId];// Modificar solo los datos que se hayan enviado book.title= req.body.title|| book.title; book.id_author= req.body.id_author|| book.id_author; book.id_genre= req.body.id_genre|| book.id_genre;// Esta sintaxis dice: // "Es igual al dato enviado (req.body.title), // Y si está vacío (||) dejar el valor por defecto (book.title)"// Guardar el libro modificado books[paramId]= book;// Envia un ok, el libro modificado y la colección de libros res.send({status:'ok', book, books })}else{// En caso de no encontrar, devuelve error res.json({status:'Failed',error:'missing or invalid param: id'});}})
De esta forma podemos enviar solo el dato que queremos modificar, o enviar los 3 datos.
Fijate que pongo /books/2, ya que NodeJS nos permite esta función de forma nativa. Recibiendo /books/:id como req.params.id
Se ve mucho más complejo que PHP, pero en realidad lo he hecho complejo para hacer una validación simple, y no pueda alterar la estructura que ya teníamos.
aqui les dejo el codigo en python y con flask
Con un poco de lectura en el codigo, se comprende mejor.
curl -i -XPUT-H"Content-Type: application/json"-d "{""titulo"":""EL LOBO DE WALL STREET"",""id_autor"":5,""id_genero"":6}"http://localhost/api_rest/route.php/books/1
Para los que no le esta funcionando el comando de curl en windows, yo uso la terminal de laragon.
Si les sigue marcando errores o mas bien no les muestra nada les dire como consejo que empiecen a debuggear, es una excelente practica para entender lo que se esta haciendo
Todo bien pero en mi caso debo iniciar el servidor para que lo cambios sean efectuados