2012-07-09 26 views
8

He hecho varias apis en djangorestframework. Esto podría probar tanto con la forma html de la API como con curl en la línea de comandos.carga la imagen al campo de imagen con djangorestframework usando json y prueba esto con CURL

Ahora tengo una API para un modelo con uno de los campos y un campo de imagen.

No puedo entender qué comando curl usar. Utilizando la sintaxis he usado antes de las acciones POST fot en formato JSON, sería:

curl -X POST -S -H 'Content-Type: application/json' -u "username:password" --data-binary '{"otherfields":"something", "photo":"/home/michel/test.jpg"}' 127.0.0.1:8000/api/v1/ 

pero en este caso la foto no se guardará y se deja en blanco (la foto es un campo opcional)

agregando -T /home/michel/test.jpg Aparece un mensaje de error que dice 127.0.0.1:800/api/v1/test.jpg no existe como una url.

En la forma html de prueba de djangorestframework, todo funciona bien.

El uso de la opción -F, se dice que sólo puedo hacer 1 solicitud a la vez ... que también eliminó el tipo de datos a partir de datos binario

¿Puede alguien ayudarme cómo hacer este post rizo tanto con el imagen y los otros datos en json en 1 comando.

Respuesta

11

Después de un largo rompecabezas, esto parece hacer el truco:

  • poner todos los argumentos JSON en distintos -F argumentos
  • utilice únicamente la cabecera Accept (no Content-Type)
  • y especificar el tipo de imagen
  • Utilice @ para indicar el archivo local para cargar

    curl -X POST -S \ 
        -H 'Accept: application/json' \ 
        -u "username:password" \ 
        -F "otherfields=something" \ 
        -F "[email protected]/home/michel/test.jpg;type=image/jpg" \ 
        http://127.0.0.1:8000/api/v1/ 
    

Por cierto, sé que todo esto está en el sitio de la documentación de rizo, pero acaba de perder un ejemplo de todas esas cosas juntas, ya que hay una gran cantidad de opciones para probar.

+1

¿Qué estoy haciendo mal? '$ curl -X POST -S -H" Accept-Language: en-es "-H 'Aceptar: application/json' \ -F" name = Avatar "\ -F" username = avatar "\ -F "contraseña = A1234567" \ -F "[email protected]" \ -F "token = 748e14e32ce165d06365d3c9a00cee3f" \ -F "avatar = @/home/moreno/Pictures/avatar004.jpg; type = image/jpg "127.0.0.1: 8000/api/v1/users/register /' response 400 '{" username ": [" Este campo es obligatorio. "]," password ": [" Este campo es obligatorio. "]" name ": [" Este campo es obligatorio. "]," avatar ": [" No se envió ningún archivo. "]," email ": [" Este campo es obligatorio ".]}' – Moreno

+0

falta uno de los destinatarios campos. Necesita usar -u delante del nombre de usuario, no -F (a menos que también sea un campo en la API, que necesita usar ambos) –

+0

@ michel-iamit gracias. Decidí enviar las imágenes como un campo base64, por ejemplo: 'curl -H" Autorización: JWT ey ... 5U "-d" name = Nombre de usuario y nombre de usuario = usuario & email = [email protected] & contraseña = A1234567 "--data-urlencode ' avatar = '"$ (base64 ~/Pictures/avatar004.jpg)"' '--data-urlencode' image = '"$ (base64 ~/Pictures/avatar001.jpg)"' '--data-urlencode' picture = '"$ (base64 ~/Pictures/577383.jpg)"' 'http: // localhost: 8000/api/v1 // register/' – Moreno

Cuestiones relacionadas