├── requirements.txt ├── introducao-ao-consumo-de-APIs-RESTful.pdf ├── README.md ├── formatters.py ├── requester.py ├── menu.py └── .gitignore /requirements.txt: -------------------------------------------------------------------------------- 1 | certifi==2019.3.9 2 | chardet==3.0.4 3 | idna==2.8 4 | requests==2.21.0 5 | urllib3==1.24.1 6 | -------------------------------------------------------------------------------- /introducao-ao-consumo-de-APIs-RESTful.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rvmoura96/introducao-consumo-apis/HEAD/introducao-ao-consumo-de-APIs-RESTful.pdf -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Introducao ao consumo APIs RESTful com Python. 2 | 3 | Repositório contendo Slides e código desenvolvido na talk sobre introdução ao consumo de APIs RESTful. 4 | 5 | ## Alguns pontos abordados nesta talk 6 | - Consumo de APIs através do módulo requests 7 | - Criação de Interfaces Abstratas através do módulo ABC. 8 | - Alguns conceitos do principio SOLID. 9 | - Orientação a Objetos. 10 | 11 | ## Pontos a serem considerados na implementação 12 | - Tratamento de exceções. 13 | - Testes unitários. 14 | 15 | ## Executando este projeto 16 | - No terminal do diretório deste repositório, digite para a instalação das dependências do projeto: 17 | ``` 18 | pip install -r requirements.txt 19 | ``` 20 | - Após a instalação das dependências, o módulo principal é o módulo chamado menu.py, para executa-lo basta: 21 | ``` 22 | python3 menu.py 23 | ``` 24 | -------------------------------------------------------------------------------- /formatters.py: -------------------------------------------------------------------------------- 1 | from abc import ABC, abstractmethod 2 | 3 | 4 | class AbstractFormatter(ABC): 5 | """Abstract class to extends to specific inputs.""" 6 | 7 | @abstractmethod 8 | def format_response(self, json: dict) -> None: 9 | """Abstract format response.""" 10 | pass 11 | 12 | 13 | class SpaceXFormatter(AbstractFormatter): 14 | """Extension from AbstractFormatter to format SpaceX responses.""" 15 | 16 | def format_response(self, json: dict) -> str: 17 | """Format SpaceX dicts from responses.""" 18 | response = ( 19 | f'Número do voo: {json.get("flight_number")}\n' 20 | f'Missão: {json.get("mission_name")}\n' 21 | f'Ano de Lançemento: {json.get("launch_year")}\n' 22 | f'Data de lançamento: {json.get("launch_date_utc")}\n' 23 | ) 24 | 25 | return response 26 | -------------------------------------------------------------------------------- /requester.py: -------------------------------------------------------------------------------- 1 | from abc import ABC, abstractmethod 2 | from typing import Union 3 | 4 | import requests 5 | 6 | 7 | class AbstractRequester(ABC): 8 | """Abstract class to extends to specific requests types.""" 9 | 10 | def __init__(self, url: str): 11 | """Instances attributes for the abstract requesters.""" 12 | self.url = url 13 | 14 | @abstractmethod 15 | def get_request(self) -> None: 16 | """Abstract method for a get request.""" 17 | pass 18 | 19 | 20 | class RequesterToSpaceX(AbstractRequester): 21 | """Extension from AbstractRequester, specially used to SpaceX API.""" 22 | 23 | def get_request(self) -> Union[dict, list]: 24 | """Request to instance URL and return the content as a json.""" 25 | request = requests.get(self.url) 26 | response = request.json() 27 | return response 28 | -------------------------------------------------------------------------------- /menu.py: -------------------------------------------------------------------------------- 1 | from requester import RequesterToSpaceX 2 | from formatters import SpaceXFormatter 3 | 4 | 5 | def main(): 6 | while True: 7 | urls = { 8 | 1: 'https://api.spacexdata.com/v3/launches/next', 9 | 2: 'https://api.spacexdata.com/v3/launches/latest', 10 | 3: 'https://api.spacexdata.com/v3/launches/upcoming', 11 | 4: 'https://api.spacexdata.com/v3/launches/past' 12 | } 13 | 14 | formatter = SpaceXFormatter() 15 | 16 | for k, v in urls.items(): 17 | print(f'[{k}] - {v.split("/")[-1]}') 18 | 19 | option = int(input('Informe a opção de consulta: ')) 20 | requester = RequesterToSpaceX(urls.get(option)) 21 | request = requester.get_request() 22 | 23 | if option > 2: 24 | # It should iterate, because the response for upcoming and past 25 | # launches return a list of dicts. 26 | for item in request: 27 | print(formatter.format_response(item)) 28 | else: 29 | print(formatter.format_response(request)) 30 | 31 | 32 | if __name__ == '__main__': 33 | main() 34 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | reated by https://www.gitignore.io/api/python 2 | # Edit at https://www.gitignore.io/?templates=python 3 | 4 | ### Python ### 5 | # Byte-compiled / optimized / DLL files 6 | __pycache__/ 7 | *.py[cod] 8 | *$py.class 9 | 10 | # C extensions 11 | *.so 12 | 13 | # Distribution / packaging 14 | .Python 15 | build/ 16 | develop-eggs/ 17 | dist/ 18 | downloads/ 19 | eggs/ 20 | .eggs/ 21 | lib/ 22 | lib64/ 23 | parts/ 24 | sdist/ 25 | var/ 26 | wheels/ 27 | pip-wheel-metadata/ 28 | share/python-wheels/ 29 | *.egg-info/ 30 | .installed.cfg 31 | *.egg 32 | MANIFEST 33 | 34 | # PyInstaller 35 | # Usually these files are written by a python script from a template 36 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 37 | *.manifest 38 | *.spec 39 | 40 | # Installer logs 41 | pip-log.txt 42 | pip-delete-this-directory.txt 43 | 44 | # Unit test / coverage reports 45 | htmlcov/ 46 | .tox/ 47 | .nox/ 48 | .coverage 49 | .coverage.* 50 | .cache 51 | nosetests.xml 52 | coverage.xml 53 | *.cover 54 | .hypothesis/ 55 | .pytest_cache/ 56 | 57 | # Translations 58 | *.mo 59 | *.pot 60 | 61 | # Django stuff: 62 | *.log 63 | local_settings.py 64 | db.sqlite3 65 | 66 | # Flask stuff: 67 | instance/ 68 | .webassets-cache 69 | 70 | # Scrapy stuff: 71 | .scrapy 72 | 73 | # Sphinx documentation 74 | docs/_build/ 75 | 76 | # PyBuilder 77 | target/ 78 | 79 | # Jupyter Notebook 80 | .ipynb_checkpoints 81 | 82 | # IPython 83 | profile_default/ 84 | ipython_config.py 85 | 86 | # pyenv 87 | .python-version 88 | 89 | # celery beat schedule file 90 | celerybeat-schedule 91 | 92 | # SageMath parsed files 93 | *.sage.py 94 | 95 | # Environments 96 | .env 97 | .venv 98 | env/ 99 | venv/ 100 | ENV/ 101 | env.bak/ 102 | venv.bak/ 103 | 104 | # Spyder project settings 105 | .spyderproject 106 | .spyproject 107 | 108 | # Rope project settings 109 | .ropeproject 110 | 111 | # mkdocs documentation 112 | /site 113 | 114 | # mypy 115 | .mypy_cache/ 116 | .dmypy.json 117 | dmypy.json 118 | 119 | # Pyre type checker 120 | .pyre/ 121 | 122 | ### Python Patch ### 123 | .venv/ 124 | 125 | # End of https://www.gitignore.io/api/python 126 | 127 | --------------------------------------------------------------------------------