+: bash script con llamados a la api usando curl

This commit is contained in:
devfzn 2023-03-31 02:36:20 -03:00
parent 74220d57c8
commit cb4fa03a92
Signed by: devfzn
GPG Key ID: E070ECF4A754FDB1
2 changed files with 134 additions and 16 deletions

View File

@ -7,7 +7,7 @@
- Python (>=3.10) - Python (>=3.10)
- Django - Django
Optional: <details><summary markdown="span">Opcionales</summary>
- PyYAML, uritemplate: Schema generation support. - PyYAML, uritemplate: Schema generation support.
- Markdown: Markdown support for the browsable API. - Markdown: Markdown support for the browsable API.
@ -15,25 +15,19 @@ Optional:
- django-filter: Filtering support. - django-filter: Filtering support.
- django-guardian: Object level permissions support. - django-guardian: Object level permissions support.
**En entorno virtual** </details></br>
```py
pip install djangorestframework
```
### Instalacion ### Instalacion
Instalar [requerimientos](./requirements.txt) **en entorno virtual**
```py ```py
pip install django-extensions djangorestframework djangorestframework-jsonapi \ pip install -r requirements.txt
inflection python-dotenv sqlparse
``` ```
Django utiliza SQLite3 por defecto para simplificar el desarrolo, en este proyecto Django utiliza SQLite3 por defecto para simplificar el desarrolo, en este proyecto
se utliza MariaDB, pero es opcional. se utliza MariaDB, pero es opcional. Si no requiere sacarlo de
[requirements.txt](./requirements.txt) o desinstalarlo `pip uninstall mysqlclient`
```py
pip install mysqlclient
```
## Inicio del proyecto ## Inicio del proyecto
@ -77,6 +71,7 @@ ALLOWED_HOSTS = os.environ.get("DJANGO_ALLOWED_HOSTS").split(" ")
``` ```
Añadir aplicaciones Añadir aplicaciones
```py ```py
INSTALLED_APPS = [ INSTALLED_APPS = [
'django.contrib.admin', 'django.contrib.admin',
@ -90,7 +85,6 @@ INSTALLED_APPS = [
'rest_framework', # <--- 'rest_framework', # <---
'core', # <--- 'core', # <---
] ]
``` ```
Añadir variables del framework REST al final del arhivo. Añadir variables del framework REST al final del arhivo.
@ -225,6 +219,7 @@ Crear las migraciones y migrar.
./manage.py makemigrations ./manage.py makemigrations
./manage.py migrate ./manage.py migrate
``` ```
Finalmente, crear **super usuario**. Finalmente, crear **super usuario**.
```py ```py
@ -248,6 +243,8 @@ http post http://127.0.0.1:8000/contact/ name="DevFzn" message="prueba" \
email="devfzn@mail.com" email="devfzn@mail.com"
``` ```
<details><summary markdown="span">httpie output</summary>
```http ```http
HTTP/1.1 200 OK HTTP/1.1 200 OK
Allow: POST, OPTIONS Allow: POST, OPTIONS
@ -274,7 +271,9 @@ X-Frame-Options: DENY
} }
``` ```
Se puede utilizar la shell de Django para chequear la nueva entrada en Contacto </details>
Se puede utilizar la shell de Django para chequear la nueva entrada en Contact
`./manage.py shell` `./manage.py shell`
@ -305,6 +304,8 @@ Utilizando las clases `APIClient` que proporciona un cliente incorporado y
Correr test `./manage.py test` Correr test `./manage.py test`
<details><summary markdown="span">tests output</summary>
```py ```py
Found 8 test(s). Found 8 test(s).
Creating test database for alias 'default'... Creating test database for alias 'default'...
@ -317,6 +318,8 @@ OK
Destroying test database for alias 'default'... Destroying test database for alias 'default'...
``` ```
</details>
## Ecommerce endpoint ## Ecommerce endpoint
Este se compone de 2 endpoints, **items** y **order**. La primera se encarga Este se compone de 2 endpoints, **items** y **order**. La primera se encarga
@ -449,6 +452,8 @@ http post http://127.0.0.1:8000/api-token-auth/ username=<tu-usuario> \
password=<tu-password> password=<tu-password>
``` ```
<details><summary markdown="span">httpie output</summary>
```http ```http
HTTP/1.1 200 OK HTTP/1.1 200 OK
Allow: POST, OPTIONS Allow: POST, OPTIONS
@ -466,6 +471,8 @@ X-Frame-Options: DENY
} }
``` ```
</details>
### Ecommerce Model ### Ecommerce Model
Esta app hace uso obligatorio del token de autentificación. Solo usuarios Esta app hace uso obligatorio del token de autentificación. Solo usuarios
@ -522,6 +529,8 @@ Creación de [test](./backend/ecommerce/tests.py) unitarios para la aplicación.
Correr tests `./manage.py test`. Correr tests `./manage.py test`.
<details><summary markdown="span">tests output</summary>
```py ```py
Found 18 test(s). Found 18 test(s).
Creating test database for alias 'default'... Creating test database for alias 'default'...
@ -534,9 +543,15 @@ OK
Destroying test database for alias 'default'... Destroying test database for alias 'default'...
``` ```
</details>
</br>
[Bash script](./api_calls.sh) con llamadas a la API utilizando curl
---- ----
### Jerarquia de directorios <details><summary markdown="span">Jerarquía de directorios</summary>
```txt ```txt
📂️ . 📂️ .
@ -576,7 +591,10 @@ Destroying test database for alias 'default'...
│ ├── .env │ ├── .env
│ └── manage.py │ └── manage.py
├── .gitignore ├── .gitignore
├── api_calls.sh
├── env.template ├── env.template
├── README.md ├── README.md
└── requirements.txt └── requirements.txt
``` ```
</details>

100
api_calls.sh Executable file
View File

@ -0,0 +1,100 @@
#!/usr/bin/env bash
#
# API Calls using curl and httpie
API_URL='http://127.0.0.1:8000'
USER="$(read -p 'Username: ' && echo ${REPLY})"
printf 'Password: '
PASS="$(read -s ; echo ${REPLY})"
TOKEN=''
while :; do
printf '\nLlamadas a API en %s\n' "${API_URL}"
read -p 'URL ok? (Y/n/q)'
case "${REPLY}" in
[yY]|[sS]|[Ss][Ii]|[Yy][Ee][Ss]|'')
break
;;
[Nn]|[Nn][Oo])
API_URL="$(read -p 'URL: ' && echo ${REPLY})"
echo
;;
[Qq])
exit 0
;;
*)
printf '\nOpción inválida [%s]\n' "${REPLY}"
;;
esac
done
TOKEN="$(curl -sX POST -F "username=${USER}" -F "password=${PASS}" \
"${API_URL}/api-token-auth/" | jq -r .'[]')"
ITEM0_ID="$(curl -sX GET -H "Authorization: Token ${TOKEN}" "${API_URL}/item/" |
jq -r '.data[-1].id')"
ODER0_ID="$(curl -sX GET -H "Authorization: Token ${TOKEN}" "${API_URL}/order/" |
jq -r '.data[-1].id')"
separator(){
echo && printf '┄%.0s' {1..90} && echo
}
api_get_token(){
separator && printf '%s\n' "${1}"
printf 'curl -X POST -F "username=%s" -F "password=%s" "%s/api-token-auth/"\n' \
"${USER}" "${PASS//*/XXXX}"
curl -sX POST -F "username=${USER}" -F "password=${PASS}" \
"${API_URL}/api-token-auth/" | jq
}
api_item_call(){
separator
printf '%s\n' "${1}"
printf 'curl -X GET -H "Authorization: Token %s"\n\t\t\b"%s/%s"\n' "${TOKEN}" \
"${API_URL}" "${2}"
curl -sX GET -H "Authorization: Token ${TOKEN}" "${API_URL}/${2}" | jq
}
api_order_call(){
separator
printf '%s\n' "${1}"
printf 'curl -X POST -H "Content-Type: application/json" \ \n'
printf ' -H "Authorization: Token %s" \ \n' "${TOKEN}"
printf ' -d "{"item": "%s", "quantity": "%s"} \ \n' "${3}" "${4}"
printf ' %s/order/\n' "${API_URL}"
curl -sX POST -H 'Content-Type: application/json' \
-H "Authorization: Token ${TOKEN}" \
-d "{\"item\": \"${ITEM0_ID}\", \"quantity\": \"${4}\"}" \
"${API_URL}/${2}" | jq
}
api_getorder_call(){
separator
printf '%s\n' "${1}"
printf 'curl -X GET -H "Authorization: Token %s"\n %s/%s' \
"${TOKEN}" "${API_URL}" "${2}"
curl -sX GET -H "Authorization: Token ${TOKEN}" "${API_URL}/${2}" | jq
}
api_contact_call(){
separator
printf '%s\n' "${1}"
printf 'curl -X POST -H "Content-type: application/json" \ \n'
printf ' -d "{"name": "%s", "message": "%s", "email":"%s"}"\n' \
"${2}" "${3}" "${4}"
printf ' %s/contact/\n' "${API_URL}"
curl -sX POST -H "Content-type: application/json" \
-d "{\"name\": \"${2}\", \"message\": \"${3}\", \"email\":\"${4}\"}" \
"${API_URL}/contact/" | jq
}
api_get_token "1) Devuelve el token"
api_item_call "2) Devuelve todos los items" "item/"
api_item_call "3) Devuelve el primer item" "item/${ITEM0_ID}/"
api_order_call "4) Realiza un pedido" "order/" "${ITEM0_ID}" 1
api_getorder_call "5) Devuelve todas las ordenes" "order/"
api_getorder_call "6) Devuelve la primera orden" "order/${ODER0_ID}/"
api_contact_call "7) Crea un contacto" "DevFzn" "test contacto" "devfzn@mail.com"
exit 0