¿Debería una API devolver NULL para un parámetro int? + Cómo manejar

En este momento, nuestra API devuelve NULL para cualquier parámetro int que no tenga valor.

Por ejemplo, en nuestro usuario api uno de nuestros parameters se ve así:

 { ... "user_id":NULL ... } 

Entiendo que esto no puede ser 0 ya que podría ser una respuesta válida, pero tener un puntero NULL está causando todo tipo de problemas porque int s no puede ser pointers NULL .

Mi idea era que estos valores deberían [dictionary objectForKey:@"user_id"] == nil por completo, entonces devolverían valores nil (en el objective c, p. Ej. [dictionary objectForKey:@"user_id"] == nil ) lo que parece más apropiado y no está buscando un valor nulo puntero (que parece incorrecto, hay una diferencia entre un int y un puntero).

De lo contrario, un trabajo sería convertirlo en un object NSNumber que requiere un puntero y, por lo tanto, puede ser NULL . Entonces puedo hacer algo como:

 NSNumber *userID = [dictionary objectForKey:@"user_id"]; if(userID != [NSNull null]){ // its not null } 

Pero para mí esto se siente fundamentalmente incorrecto, y la documentation NSNumber dice cosas como:

Tenga en count que los objects de número no necesariamente conservan el tipo con el que se crean.

Esto también me hace sentir sucio.

(Por otra parte, estoy inicializando NSDecimalNumber con cadenas … así que no sé por qué esto me molestaría …).

Si se espera que su "API" devuelva un int , entonces nunca debería devolver NULL. Como ya dijiste, podrías usar NSNumber , en ese caso podrías devolver NULL. Cuando se habla de int , NSNumber no vendrá con pérdida de datos, solo en casos como numbers irracionales, el tipo diferente sería importante.

Entonces, en resumen, si desea devolver NULL / nil en algunos casos, debe usar un tipo de object, NO int . Si te sientes mejor con el uso de int , entonces la única forma sería utilizar valores especiales "no válidos" como -1 o -INT_MAX para que el usuario sepa que el valor no es válido. O podría lanzar una exception si esa es una opción, o simplemente agregar otro método para verificar si se puede dar una respuesta válida.

Si la API no tiene un usuario y user_id es el único valor devuelto, por qué no devuelve un código de estado 404 con nada en el cuerpo. Luego solo busca el código de estado. Tiene sentido, 404 == recurso no existe. Aproveche REST y use sus códigos de estado, no devuelva resources falsos con 200 códigos de estado.

Sin embargo, si user_id es solo parte de un recurso más grande que se devuelve (como una relación con otro recurso), entonces NULL está perfectamente justificado si no se establece user_id para el recurso devuelto.

¿Qué hay de hacer una key de estado con el resultado exitoso de la llamada API? Eso es lo que siempre hago al crear respuestas API. Podría ser un boolean que indica si funcionó o no, o un número integer que indica qué error ocurrió si no tuvo éxito. De esta forma, ni siquiera necesitaría tocar el id_usuario en este ejemplo si falla la API.

 NSNumber *status= [dictionary objectForKey:@"status"]; if(status > 0){ //succeed } else { //use status to indicate which error occunetworking }