Feda /dev/ - No Javascript allowed

Normas
spoiler
Personas non gratas
Memes feda dev




Kaledros
#55620Wei-Yu:

qué ocurre ahí normalmente?

Que cualquier deserializador te pondría myNumber a null en cuanto mapeara el JSON a objeto de dominio en el segundo y tercer caso (algunos directamente ni te lo mapearían si el campo es nullable y tendrías un objeto con un campo de menos). En el primero tendría un valor, que es lo esperado, pero puede ser peligroso darle un valor default si lo que quieres es expresar que myNumber no existe.

Luego, si tratas myNumber sin testear qué pasa cuando viene a null y te proteges de ello, que es lo que le pasa al del post, pues igual deberías volver a clase porque no has aprendido una mierda.

1 respuesta
MTX_Anubis

#55620 que cada uno va a tratar la ausencia de campos como le de la gana aunque no es lo mismo enviar un campo a NULL que no enviarlo. Por ejemplo, cuando quieres actualizar algo, si no lo envías lo normal es que ese campo no lo quieres actualizar y si, por defecto, lo que no envías toma valor de NULL pues ya no lo sabes

desu

#55620 Si es un POST que recibe el server, el 3 caso es incorrecto, hay algún error de modelado.

Un cliente nunca manda un null.

#55621Kaledros:

Que cualquier deserializador te pondría myNumber a null en cuanto mapeara el JSON a objeto de dominio en el segundo y tercer caso

Si un deserializador te pone myNumber a null en el segundo caso está mal. Deberías tener un custom deserializer que te ponga el valor por defecto, 0.

Pero vamos, habría que ver el problema concreto que están tratando de resolver. Lo que está claro es que el cliente mandando un null hay un error de diseño en la API.

1 2 respuestas
Runig666

#55623 Un cliente manda un " " que dependiendo de como lo gestiones es hasta peor...

Lo que está claro es que el cliente mandando un null hay un error de diseño en la API.

Un cliente mandando un null o un " ", es de primero de putada que puede pasar. Se la API que sea, y sea el cliente que sea.

1 1 respuesta
desu

#55624 Como siempre digo hay que distinguir dos niveles, el de network y aplicacion.

Si a ti te llega un payload, conjunto de paquetes TCP, que se serializa a un json válido en este caso, se asume que la transmisión por TCP por network ha sido correcto. Por tanto, la llamada cliente => (...) => servidor ha sido un éxito.

Ahora, si network ha sido un éxito, estamos a nivel de aplicación, y aquí es un contrato de la API entre el cliente y el servidor que decide el modelado del json. Es decir deciden los humanos y se ponen de acuerdo en su significado. En cualquier caso, mandar nulls de cliente a servidor es un sin sentido. Incluso en casos complejos donde haya campos que se puedan activar y desactivar y además tomar valores, como un configMap, si el cliente lo quiere desactivar tendria sentido mandar un {} o tener un campo bool enabled/disabled.

Si un cliente manda una payload " " y esto no es un valid json para tu server puedes devolver un 400, y obligar al cliente que como minimo te mande un {}. Y si te refieres al caso de myNumber, una string vacia obviamente sería una bad request.

1 respuesta
pantocreitor

Si no quieres que te llegue null y asumes que el puto cliente es imbecil pues le devuelves un bad request y a tomar por culo.
O me mandas las cosas bien o te las metes por culo GGEZ

2
Runig666

#55625

En cualquier caso, mandar nulls de cliente a servidor es un sin sentido. Incluso en casos complejos donde haya campos que se puedan activar y desactivar y además tomar valores, como un configMap, si el cliente lo quiere desactivar tendria sentido mandar un {} o tener un campo bool enabled/disabled.

Mandar un null puede tener sentido, el problema es que de normal no se puede mandar un null en muchas librerías, así que se manda " ", es más, Laravel tiene un middleware por defeccto que transforma eso en null. Si le mandas un json vacio, el asume que es un json vacio...si le mandas " ", el asume que es un null.

Yo por ejemplo lo uso para "vaciar" selects. Si no me mandas un campo asumo que lo dejas como esta, si me lo mandas vacio asumo que quieres dejar dicho campo vacio. Como obviamente no puedo mandar null en un select, pues se manda el valor " "

1 respuesta
desu
#55627Runig666:

Mandar un null tiene bastante sentido

Si quieres mandar "myNumber = null", no mandas nada. Y el servidor sabe que "myNumber = null" al serializar. Segun la operacion HTTP esto tindra un significado logico u otro dentro del servidor, por ejemplo, poner un valor por defecto o borrar el campo.

1 respuesta
Runig666

#55628 MyNumber = null no es lo mismo a que MyNumber no este.

Como te he dicho, en mi gestor yo asumo que si me mandas un campo en null...es que lo quieres dejar en blanco, y si dicho campo no esta, quieres dejarlo como estuviera

Y el servidor sabe que "myNumber = null"

El servidor sabe que ese campo no esta. Que tu luego por detrás quieras asumir que su no existencia significa que vale null es otra cosa.

1 respuesta
desu
#55629Runig666:

Como te he dicho, en mi gestor yo asumo que si me mandas un campo en null...es que lo quieres dejar en blanco, y si dicho campo no está, quieres dejarlo como estuviera

Estás asumiendo y partiendo de la base de que tu tienes un mínimo de idea de lo que haces, y ya te digo yo que no tienes ni puta idea de lo que estás haciendo, así que saca libreta y boli y toma nota de la clase gratis que te estoy dando.

Estas para empezar confundiendo los POST con los PUT, POST crear recurso, PUT actualizar recurso.

Estábamos hablando de POST. Si el campo myNumber no está asumes el valor por defecto o que no existe, y eso a nivel de cliente no le importa como se representa.

Y si hablamos de PUT como estas mezclando tu, fpero que chocheas y no te enteras, si el campo myNumber no está, pues sí, puedes asumir que no lo vas a tocar y no hace falta mandarlo.

1 respuesta
Runig666

#55630 Es decir, tu plan es que triplique el codigo en vez de hacer un codigo que funcione para absolutamente todos los casos de uso?

Si en una misma petición tengo para crear y editar objectos me invento otra palabra? Hago 2 peticiones una PUT y otra POST?

1 respuesta
desu
#55631Runig666:

Es decir, tu plan es que triplique el codigo en vez de hacer un codigo que funcione para absolutamente todos los casos de uso?

Se llama protocolo HTTP y tienes unas normas y reglas.

De hecho en el PUT la idea es que debes mandar todo tal cual y solo cambiar lo que quieras, para mandar solo el campo que quieres cambiar usas el método PATCH. Si nos vamos a poner estrictos ahora, que parece que se te atragantan las API básicas.

Si tienes:

{
  "Name": "John",
  "Age": 35
}

Haces un /PUT

{
  "Name": "Fpero",
  "Age": 35
}

O haces un /PATCH

{
  "Name": "Fpero",
}

Estas normas existen para poder garantizar ciertos invariantes a traves del stack.

#55631Runig666:

Si en una misma petición tengo para crear y editar objectos me invento otra palabra? Hago 2 peticiones una Put y otra Post? Me invento una 3º palabra?

Si necesitas ayuda en como modelar una API me puedes pagar una consultoría y te echo un cable.

1 respuesta
Runig666

#55632

Se llama protocolo HTTP y tienes unas normas y reglas.

Si, que tu mismo has decidido inventarte.

Estas para empezar confundiendo los POST con los PUT, POST crear recurso, PUT actualizar recurso.

The PUT method requests that the enclosed entity be stored under the supplied Request-URI. If the Request-URI refers to an already existing resource, the enclosed entity SHOULD be considered as a modified version of the one residing on the origin server. If the Request-URI does not point to an existing resource, and that URI is capable of being defined as a new resource by the requesting user agent, the origin server can create the resource with that URI

Vamos, que PUT sirve también para crear recursos.

Estas seguro de que quieres entrar en estandares y demas paja de la informatica? Porque se que en la practica no tienes de donde sacar, pero ya como también te falle leer, va a ser divertido...

1 respuesta
desu

#55633 Que no entiendes?

No tengo ningún problema en hablar de standard, me lo conozco bien, he implementado cosas que faltaban en Gin y gateways de golang... Además de pruebas con http3 a mano.

Si ahora te vas a poner finuras porque has hecho el ridículo y vas a sacar de contexto mi tono informal mejor ahorratelo.

1 respuesta
Runig666

#55634 Que porque dices cobrar un sueldo cuando lo minimo que se le puede pedir a uno de carrera es saberse su estandar.

Si ahora te vas a poner finuras porque has hecho el ridículo y vas a sacar de contexto mi tono informal mejor ahorratelo.

Eres tu el que ha empezado con finuras para luego tu mismo no saberte tu estandar.

1 respuesta
desu

#55635 El PUT para crear recursos es un caso de uso aislado que para funcionar debes generar un ID distribuido. Porque sino tiene el ID, no es idempotente, entiendes?

1 respuesta
Runig666

#55636 Vaya...ahora es caso de uso aislado. Ha durado poco.

1 respuesta
desu

#55637 Explicanos como usas el PUT. Para que pueda seguir riéndome de ti.

Dime como haces que ese put sea idempotente y mantenga todas las propiedades para crear y actualizar recursos.

Te he dado la solución arriba, porque sé que no la sabes y tu código es una puta porquería de fpero, solo hay que leerte.

1 respuesta
Kaledros
#55623desu:

Si un deserializador te pone myNumber a null en el segundo caso está mal. Deberías tener un custom deserializer que te ponga el valor por defecto, 0.

Depende de la lógica de negocio y del contrato de la API.

Si estableces en tu contrato que puedes no recibir un valor en el JSON y eso significa que el valor es null en tu objeto, no recibirlo implica que el deserializer, al no encontrarlo, mapea a null el atributo y a correr. Luego tú en tu servicio ya te apañarás para manejar ese null. Podrías incluso crear un DTO sin ese atributo, pero me parece más peligroso incluso que un null.

En cambio, si la lógica de negocio acepta 0 como valor posible para myNumber no puedes ponerle un 0 por defecto con el deserializer si el valor no viene en el JSON porque te estaría falseando datos.

Lo ideal es no recibir el campo y mapearlo a null. Menos problemas.

2 respuestas
Runig666

#55638 En verdad? Para absolutamente nada. Porque como ya te he dicho tengo una sola llamada POST para guardar tanto multiples objectos como uno solo, tanto si dichos objectos son nuevos como si son ediciones.

Eres tu el que ha empezado con estandares y diciendome que lo duplique todo en 2 llamadas.

1 respuesta
Dr_Manhattan

En flarum usamos get para actualizar y crear a parte de obtener

1 1 respuesta
Runig666

#55641 GET no acepta cuerpo, así que chungillo. Pero vamos, Flarum es muy de usar POST para todo tambien. Pero cuando quieras puedo explicarte lo poco que se de Flarum, que no es mucho debido a la documentación nula que tienen los perros y que te obliga a mirar los plugins hechos por ellos para entender donde coño estan las cosas.

desu

#55640 Yo no te he dicho que dupliques nada, yo te he dicho que no tienes ni idea de lo que haces y te lo he explicado.

#55639 No, está mal. No existe caso de uso en el mundo real donde lo que dices tenga sentido. El único motivo para tener un null en cualquier API es tener algo opcional, es decir, que se puede activar/desactivar o estar presente o no. Eso lo puedes representar con 2 campos, tener un enabled/disabled, o tener un objeto map "nullable".

Es tan fácil como tener un {} de metadatos y además es algo que en el futuro se puede expandir y modificar sin romper la API.

Tener el el enabled/disabled o el map de metadatos la diferencia esta que con el enabled/disabled tienes la ultima configuracion guardada, y con el map lo pierdes. Por tanto el user debe de re-crearlo.

2 respuestas
Kaledros

#55643 Ya, me he liado y he corregido.

1 respuesta
desu

#55644 No te preocupes, yo no me lio.

He diseñado APIs que superan las 250k req por segundo.

Y de todos los colores.

1
Runig666

#55643

yo te he dicho que no tienes ni idea de lo que haces y te lo he explicado.

Es decir, posición de Middle Management de manual, tu libro te dice que esta mal, pero la solución ya otro XD.

Lo dicho, que según tu, la idea buena, correcta y perfecta...es dividir los objectos nuevos de las ediciones para que sea una llamada PUT por un lado y PATCH/POST por otro.

1 respuesta
GaN2

Algunos comentarios

desu
#55646Runig666:

Lo dicho, que según tu, la idea buena, correcta y perfecta...es dividir los objectos nuevos de las ediciones para que sea una llamada PUT por un lado y PATCH/POST por otro.

No has entendido nada.

Veo que eres muy junior en esto, pregúntale mañana a algún senior de tu equipo que te eche un cable.

2 1 respuesta
Runig666

#55648 Es exactamente lo que has explicado.

Si tienes:
{
"Name": "John",
"Age": 35
}

Haces un /PUT
{
"Name": "Fpero",
"Age": 35
}

O haces un /PATCH
{
"Name": "Fpero",
}

Aquí te falta la opción que te estoy preguntando que es cuando quiero crear un objecto y editar otro al mismo tiempo.

Así que te vuelvo a preguntar como buena gente de carrera. Entonces uso POST/PUT/PATCH o hago 2 llamadas para seguir el estandar? Porque con tu tutorial, es lo unico que me das a entender

1 respuesta
eXtreM3

#55639 en qué mundo vas a querer recibir un null?

Si te mandan el campo con el valor, lo aplicas al crear el objeto de dominio.
Si no te lo mandan, aplicas lo que corresponda (0 si es 0, null si permites nullables... lo que sea)

Si te lo mandan a null lo mandas a tomar por culo y devuelves un 422.

Edit: vale has editado.

1 respuesta