[{"data":1,"prerenderedAt":1214},["ShallowReactive",2],{"navigation_docs":3,"-atividades-atv-14-apis-swagger":252,"-atividades-atv-14-apis-swagger-surround":1209},[4,96,189],{"title":5,"icon":6,"path":7,"stem":8,"children":9},"⚙️ Engenharia de Software","i-lucide-book-open","\u002Fengenharia-software","1.engenharia-software",[10,12,16,20,24,28,32,36,40,44,48,52,56,60,64,68,72,76,80,84,88,92],{"title":5,"path":7,"stem":11},"1.engenharia-software\u002Findex",{"title":13,"path":14,"stem":15},"📋 Plano de Ensino e Aplicações","\u002Fengenharia-software\u002Fengenharia-software-aplicacoes","1.engenharia-software\u002F01.engenharia-software-aplicacoes",{"title":17,"path":18,"stem":19},"Cap 01: Introdução e Natureza do Software","\u002Fengenharia-software\u002Fcap-01","1.engenharia-software\u002F02.cap-01",{"title":21,"path":22,"stem":23},"Cap 02: Modelos de Processo de Software","\u002Fengenharia-software\u002Fcap-02","1.engenharia-software\u002F03.cap-02",{"title":25,"path":26,"stem":27},"Cap 03: As Atividades do Processo","\u002Fengenharia-software\u002Fcap-03","1.engenharia-software\u002F04.cap-03",{"title":29,"path":30,"stem":31},"Cap 04: Metodologias Ágeis","\u002Fengenharia-software\u002Fcap-04","1.engenharia-software\u002F05.cap-04",{"title":33,"path":34,"stem":35},"Cap 05: Fundamentos de Requisitos","\u002Fengenharia-software\u002Fcap-05","1.engenharia-software\u002F06.cap-05",{"title":37,"path":38,"stem":39},"Cap 06: Elicitação e Levantamento","\u002Fengenharia-software\u002Fcap-06","1.engenharia-software\u002F07.cap-06",{"title":41,"path":42,"stem":43},"Cap 07: Especificação de Requisitos (ERS)","\u002Fengenharia-software\u002Fcap-07","1.engenharia-software\u002F08.cap-07",{"title":45,"path":46,"stem":47},"Cap 08: Validação e Gestão","\u002Fengenharia-software\u002Fcap-08","1.engenharia-software\u002F09.cap-08",{"title":49,"path":50,"stem":51},"Cap 09: Fundamentos da Modelagem","\u002Fengenharia-software\u002Fcap-09","1.engenharia-software\u002F10.cap-09",{"title":53,"path":54,"stem":55},"Cap 10: Diagrama de Casos de Uso (Conceitos)","\u002Fengenharia-software\u002Fcap-10","1.engenharia-software\u002F11.cap-10",{"title":57,"path":58,"stem":59},"Cap 11: Casos de Uso (Prática e Relações)","\u002Fengenharia-software\u002Fcap-11","1.engenharia-software\u002F12.cap-11",{"title":61,"path":62,"stem":63},"Cap 12: Diagrama de Classes (Conceitos)","\u002Fengenharia-software\u002Fcap-12","1.engenharia-software\u002F13.cap-12",{"title":65,"path":66,"stem":67},"Cap 13: Herança e Polimorfismo","\u002Fengenharia-software\u002Fcap-13","1.engenharia-software\u002F14.cap-13",{"title":69,"path":70,"stem":71},"Cap 14: Diagrama de Sequência","\u002Fengenharia-software\u002Fcap-14","1.engenharia-software\u002F15.cap-14",{"title":73,"path":74,"stem":75},"Cap 15: Diagramas Dinâmicos (Estados e Atividades)","\u002Fengenharia-software\u002Fcap-15","1.engenharia-software\u002F16.cap-15",{"title":77,"path":78,"stem":79},"Cap 16: Qualidade de Software (SQA)","\u002Fengenharia-software\u002Fcap-16","1.engenharia-software\u002F17.cap-16",{"title":81,"path":82,"stem":83},"Cap 17: Estratégias de Teste","\u002Fengenharia-software\u002Fcap-17","1.engenharia-software\u002F18.cap-17",{"title":85,"path":86,"stem":87},"Cap 18: Manutenção e Evolução","\u002Fengenharia-software\u002Fcap-18","1.engenharia-software\u002F19.cap-18",{"title":89,"path":90,"stem":91},"Cap 19: Gerência de Configuração (SCM)","\u002Fengenharia-software\u002Fcap-19","1.engenharia-software\u002F20.cap-19",{"title":93,"path":94,"stem":95},"Cap 20: Conclusão e Próximos Passos","\u002Fengenharia-software\u002Fcap-20","1.engenharia-software\u002F21.cap-20",{"title":97,"icon":98,"path":99,"stem":100,"children":101},"🛠️ Atividades","i-lucide-wrench","\u002Fatividades","2.atividades",[102,105,109,113,117,121,125,129,133,137,141,145,149,153,157,161,165,169,173,177,181,185],{"title":103,"path":99,"stem":104},"📋 Orientações Gerais","2.atividades\u002Findex",{"title":106,"path":107,"stem":108},"📅 Cronograma","\u002Fatividades\u002Fcronograma","2.atividades\u002F01.cronograma",{"title":110,"path":111,"stem":112},"✏️ Atividade 01: Escopo e Personas","\u002Fatividades\u002Fatv-01-escopo","2.atividades\u002F02.atv-01-escopo",{"title":114,"path":115,"stem":116},"⚙️ Atividade 02: Processos de Software","\u002Fatividades\u002Fatv-02-processos","2.atividades\u002F03.atv-02-processos",{"title":118,"path":119,"stem":120},"📋 Atividade 03: Engenharia de Requisitos","\u002Fatividades\u002Fatv-03-requisitos","2.atividades\u002F04.atv-03-requisitos",{"title":122,"path":123,"stem":124},"📝 Atividade 04: User Stories e Backlog","\u002Fatividades\u002Fatv-04-backlog","2.atividades\u002F05.atv-04-backlog",{"title":126,"path":127,"stem":128},"🎭 Atividade 05: Casos de Uso (UML)","\u002Fatividades\u002Fatv-05-casos-uso","2.atividades\u002F06.atv-05-casos-uso",{"title":130,"path":131,"stem":132},"🖼️ Atividade 06: Prototipagem e Wireframes","\u002Fatividades\u002Fatv-06-prototipagem","2.atividades\u002F07.atv-06-prototipagem",{"title":134,"path":135,"stem":136},"🏛️ Atividade 07: Diagrama de Classes (UML)","\u002Fatividades\u002Fatv-07-classes","2.atividades\u002F08.atv-07-classes",{"title":138,"path":139,"stem":140},"🔀 Atividade 08: Diagrama de Sequência (UML)","\u002Fatividades\u002Fatv-08-sequencia","2.atividades\u002F09.atv-08-sequencia",{"title":142,"path":143,"stem":144},"🧪 Atividade 09: Qualidade e Testes","\u002Fatividades\u002Fatv-09-testes","2.atividades\u002F10.atv-09-testes",{"title":146,"path":147,"stem":148},"🏁 Atividade 10: Projeto Integrador Final","\u002Fatividades\u002Fatv-10-projeto-final","2.atividades\u002F11.atv-10-projeto-final",{"title":150,"path":151,"stem":152},"📊 Atividade 11: Diagrama de Atividades (UML)","\u002Fatividades\u002Fatv-11-atividades","2.atividades\u002F12.atv-11-atividades",{"title":154,"path":155,"stem":156},"🔄 Atividade 12: Diagrama de Transição de Estados (UML)","\u002Fatividades\u002Fatv-12-estados","2.atividades\u002F13.atv-12-estados",{"title":158,"path":159,"stem":160},"🏗️ Atividade 13: Arquitetura de Software e Padrões","\u002Fatividades\u002Fatv-13-arquitetura","2.atividades\u002F14.atv-13-arquitetura",{"title":162,"path":163,"stem":164},"🌐 Atividade 14: Modelagem de APIs REST e Swagger","\u002Fatividades\u002Fatv-14-apis-swagger","2.atividades\u002F15.atv-14-apis-swagger",{"title":166,"path":167,"stem":168},"🌿 Atividade 15: GitFlow e Trabalho Colaborativo","\u002Fatividades\u002Fatv-15-gitflow-colaboracao","2.atividades\u002F16.atv-15-gitflow-colaboracao",{"title":170,"path":171,"stem":172},"🚀 Atividade 16: Pipelines de CI\u002FCD com GitHub Actions","\u002Fatividades\u002Fatv-16-pipelines-cicd","2.atividades\u002F17.atv-16-pipelines-cicd",{"title":174,"path":175,"stem":176},"🐳 Atividade 17: Containerização de Ambientes com Docker","\u002Fatividades\u002Fatv-17-conteineres-docker","2.atividades\u002F18.atv-17-conteineres-docker",{"title":178,"path":179,"stem":180},"🔒 Atividade 18: Segurança no Desenvolvimento e OWASP","\u002Fatividades\u002Fatv-18-seguranca-devsecops","2.atividades\u002F19.atv-18-seguranca-devsecops",{"title":182,"path":183,"stem":184},"📈 Atividade 19: Métricas de Software, Estimativas e DORA","\u002Fatividades\u002Fatv-19-metricas-estimativas","2.atividades\u002F20.atv-19-metricas-estimativas",{"title":186,"path":187,"stem":188},"🏆 Atividade 20: Projeto Final Avançado (Fase 2)","\u002Fatividades\u002Fatv-20-projeto-final-avancado","2.atividades\u002F21.atv-20-projeto-final-avancado",{"title":190,"icon":191,"path":192,"stem":193,"children":194},"🖼️ Galeria de Projetos Integradores","i-lucide-image","\u002Fprojetos-integradores","3.projetos-integradores",[195,197,207,216,225,234,243],{"title":190,"path":192,"stem":196},"3.projetos-integradores\u002Findex",{"title":198,"path":199,"stem":200,"children":201},"🅿️ Projeto 01: Gestão de Estacionamentos","\u002Fprojetos-integradores\u002Fpi-01-gestao-estacionamentos","3.projetos-integradores\u002F01.pi-01-gestao-estacionamentos\u002Findex",[202,203],{"title":198,"path":199,"stem":200},{"title":204,"path":205,"stem":206},"README","\u002Fprojetos-integradores\u002Fpi-01-gestao-estacionamentos\u002Freadme","3.projetos-integradores\u002F01.pi-01-gestao-estacionamentos\u002F2.readme",{"title":208,"path":209,"stem":210,"children":211},"🔐 Projeto 02: Gerador de Senhas","\u002Fprojetos-integradores\u002Fpi-02-gerador-senhas","3.projetos-integradores\u002F02.pi-02-gerador-senhas\u002Findex",[212,213],{"title":208,"path":209,"stem":210},{"title":204,"path":214,"stem":215},"\u002Fprojetos-integradores\u002Fpi-02-gerador-senhas\u002Freadme","3.projetos-integradores\u002F02.pi-02-gerador-senhas\u002F2.readme",{"title":217,"path":218,"stem":219,"children":220},"🍣 Projeto 03: Pedidos Restaurante","\u002Fprojetos-integradores\u002Fpi-03-pedidos-restaurante","3.projetos-integradores\u002F03.pi-03-pedidos-restaurante\u002Findex",[221,222],{"title":217,"path":218,"stem":219},{"title":204,"path":223,"stem":224},"\u002Fprojetos-integradores\u002Fpi-03-pedidos-restaurante\u002Freadme","3.projetos-integradores\u002F03.pi-03-pedidos-restaurante\u002F2.readme",{"title":226,"path":227,"stem":228,"children":229},"📱 Projeto 04: Empréstimos Dispositivos","\u002Fprojetos-integradores\u002Fpi-04-emprestimos-dispositivos","3.projetos-integradores\u002F04.pi-04-emprestimos-dispositivos\u002Findex",[230,231],{"title":226,"path":227,"stem":228},{"title":204,"path":232,"stem":233},"\u002Fprojetos-integradores\u002Fpi-04-emprestimos-dispositivos\u002Freadme","3.projetos-integradores\u002F04.pi-04-emprestimos-dispositivos\u002F2.readme",{"title":235,"path":236,"stem":237,"children":238},"📦 Projeto 05: Gestão de Estoque","\u002Fprojetos-integradores\u002Fpi-05-gestao-estoque","3.projetos-integradores\u002F05.pi-05-gestao-estoque\u002Findex",[239,240],{"title":235,"path":236,"stem":237},{"title":204,"path":241,"stem":242},"\u002Fprojetos-integradores\u002Fpi-05-gestao-estoque\u002Freadme","3.projetos-integradores\u002F05.pi-05-gestao-estoque\u002F2.readme",{"title":244,"path":245,"stem":246,"children":247},"🛵 Projeto 06: Aplicativo de Delivery","\u002Fprojetos-integradores\u002Fpi-06-delivery","3.projetos-integradores\u002F06.pi-06-delivery\u002Findex",[248,249],{"title":244,"path":245,"stem":246},{"title":204,"path":250,"stem":251},"\u002Fprojetos-integradores\u002Fpi-06-delivery\u002Freadme","3.projetos-integradores\u002F06.pi-06-delivery\u002F2.readme",{"id":253,"title":162,"body":254,"description":1203,"extension":1204,"links":1205,"meta":1206,"navigation":530,"path":163,"seo":1207,"stem":164,"__hash__":1208},"docs\u002F2.atividades\u002F15.atv-14-apis-swagger.md",{"type":255,"value":256,"toc":1182},"minimark",[257,260,265,269,304,306,310,317,325,346,348,352,359,364,468,473,477,479,483,486,490,591,595,691,695,958,960,964,970,996,1000,1003,1005,1009,1014,1030,1032,1036,1039,1058,1060,1064,1090,1092,1096,1178],[258,259],"hr",{},[261,262,264],"h2",{"id":263},"objetivo-da-aula","🎯 Objetivo da Aula",[266,267,268],"p",{},"Ao final desta atividade, você será capaz de:",[270,271,272,281,292,298],"ul",{},[273,274,275,276,280],"li",{},"Mapear recursos de sistemas no formato e boas práticas de ",[277,278,279],"strong",{},"APIs REST",".",[273,282,283,284,287,288,291],{},"Utilizar os ",[277,285,286],{},"Verbos HTTP"," (GET, POST, PUT, DELETE) e os ",[277,289,290],{},"Códigos de Retorno (Status Codes)"," corretos.",[273,293,294,295,280],{},"Escrever payloads estruturados em formato ",[277,296,297],{},"JSON (JavaScript Object Notation)",[273,299,300,301,280],{},"Interpretar e projetar documentações no padrão ",[277,302,303],{},"Swagger\u002FOpenAPI",[258,305],{},[261,307,309],{"id":308},"o-cenário-prático-seu-desafio","🏢 O Cenário Prático (Seu Desafio)",[266,311,312,313,316],{},"Na ",[277,314,315],{},"TecProExpress",", os motoristas que usam o aplicativo Android precisam enviar em tempo real a geolocalização do caminhão para o painel de controle do SAC. Além disso, o app precisa buscar a lista de entregas pendentes direto do servidor central. No entanto, os desenvolvedores Mobile e os programadores de Backend não combinaram o \"formato de dados\" e a comunicação travou!",[266,318,319,320,324],{},"O app móvel mandava ",[321,322,323],"code",{},"POST \u002Fapi\u002Fenviar_localizacao"," e o servidor dava erro de conexão porque esperava receber um formato diferente do JSON enviado pelo celular!",[326,327,328],"blockquote",{},[266,329,330,331,334,335,338,339,342,343,345],{},"\"Seu desafio como ",[277,332,333],{},"Designer de APIs"," é desenhar o contrato profissional de endpoints para a TecProExpress. Você criará a modelagem de recursos RESTful para ",[321,336,337],{},"\u002Fapi\u002Fentregas"," e ",[321,340,341],{},"\u002Fapi\u002Fmotoristas\u002Flocalizacao",", definindo os verbos corretos, os dados em formato JSON e gerando a especificação profissional baseada em ",[277,344,303],{},".\"",[258,347],{},[261,349,351],{"id":350},"fundamentos-a-teoria-traduzida","🧠 Fundamentos: A Teoria Traduzida",[266,353,354,355,358],{},"Uma API (Application Programming Interface) é uma porta que permite que sistemas diferentes conversem de forma organizada. ",[277,356,357],{},"REST"," é o estilo arquitetural padrão da web.",[360,361,363],"h3",{"id":362},"regras-de-ouro-do-design-rest","Regras de Ouro do Design REST:",[365,366,367,393,431],"ol",{},[273,368,369,372,373],{},[277,370,371],{},"Recursos são Substantivos no Plural:"," Evite verbos no endereço!\n",[270,374,375,385],{},[273,376,377,381,382],{},[378,379,380],"em",{},"Errado:"," ",[321,383,384],{},"POST \u002Fapi\u002FsalvarMotorista",[273,386,387,381,390],{},[378,388,389],{},"Certo:",[321,391,392],{},"POST \u002Fapi\u002Fmotoristas",[273,394,395,398],{},[277,396,397],{},"Use os Verbos HTTP Adequados:",[270,399,400,410,419,425],{},[273,401,402,405,406,409],{},[321,403,404],{},"GET",": Busca um ou vários registros (Ex: ",[321,407,408],{},"GET \u002Fapi\u002Fentregas",").",[273,411,412,415,416,409],{},[321,413,414],{},"POST",": Cria um novo registro (Ex: ",[321,417,418],{},"POST \u002Fapi\u002Fentregas",[273,420,421,424],{},[321,422,423],{},"PUT",": Atualiza o registro inteiro por completo.",[273,426,427,430],{},[321,428,429],{},"DELETE",": Exclui um registro da base de dados.",[273,432,433,436],{},[277,434,435],{},"Comunique-se por Status Codes:",[270,437,438,444,450,456,462],{},[273,439,440,443],{},[321,441,442],{},"200 OK",": Requisição de consulta ou alteração com sucesso.",[273,445,446,449],{},[321,447,448],{},"201 Created",": Novo registro criado com sucesso (retorno típico de POST).",[273,451,452,455],{},[321,453,454],{},"400 Bad Request",": Envio de dados incorretos ou campos faltantes.",[273,457,458,461],{},[321,459,460],{},"404 Not Found",": O registro ou endpoint consultado não existe.",[273,463,464,467],{},[321,465,466],{},"500 Internal Server Error",": Falha técnica no servidor (bug).",[469,470,472],"h4",{"id":471},"visualizando-a-comunicação-http","📊 Visualizando a Comunicação HTTP",[474,475],"mermaid",{"code":476},"sequenceDiagram\n    App Mobile->>Servidor API: POST \u002Fapi\u002Fentregas (Payload JSON)\n    Note over Servidor API: Processa no Spring Boot,\u003Cbr\u002F>Valida e Salva no Banco.\n    Servidor API-->>App Mobile: 201 Created { \"id\": 125, \"status\": \"PENDENTE\" }\n",[258,478],{},[261,480,482],{"id":481},"exemplo-guiado-especificação-swagger-e-spring-boot","📖 Exemplo Guiado: Especificação Swagger e Spring Boot",[266,484,485],{},"Abaixo, veja como expor e documentar um endpoint de criação de entrega.",[360,487,489],{"id":488},"️-código-java-17-no-spring-boot-o-controller-rest","🛠️ Código Java 17 no Spring Boot (O Controller REST):",[491,492,497],"pre",{"className":493,"code":494,"language":495,"meta":496,"style":496},"language-java shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","@RestController\n@RequestMapping(\"\u002Fapi\u002Fentregas\")\n@Tag(name = \"Entregas\", description = \"Gerenciamento de entregas da TecProExpress\")\npublic class DeliveryRestController {\n\n    @Autowired\n    private DeliveryService service;\n\n    @PostMapping\n    @Operation(summary = \"Criar nova entrega\", description = \"Cria uma entrega no banco de dados e aguarda motorista\")\n    public ResponseEntity\u003CDeliveryResponse> criarEntrega(@RequestBody DeliveryRequest request) {\n        DeliveryResponse response = service.criar(request);\n        return ResponseEntity.status(HttpStatus.CREATED).body(response);\n    }\n}\n","java","",[321,498,499,507,513,519,525,532,538,544,549,555,561,567,573,579,585],{"__ignoreMap":496},[500,501,504],"span",{"class":502,"line":503},"line",1,[500,505,506],{},"@RestController\n",[500,508,510],{"class":502,"line":509},2,[500,511,512],{},"@RequestMapping(\"\u002Fapi\u002Fentregas\")\n",[500,514,516],{"class":502,"line":515},3,[500,517,518],{},"@Tag(name = \"Entregas\", description = \"Gerenciamento de entregas da TecProExpress\")\n",[500,520,522],{"class":502,"line":521},4,[500,523,524],{},"public class DeliveryRestController {\n",[500,526,528],{"class":502,"line":527},5,[500,529,531],{"emptyLinePlaceholder":530},true,"\n",[500,533,535],{"class":502,"line":534},6,[500,536,537],{},"    @Autowired\n",[500,539,541],{"class":502,"line":540},7,[500,542,543],{},"    private DeliveryService service;\n",[500,545,547],{"class":502,"line":546},8,[500,548,531],{"emptyLinePlaceholder":530},[500,550,552],{"class":502,"line":551},9,[500,553,554],{},"    @PostMapping\n",[500,556,558],{"class":502,"line":557},10,[500,559,560],{},"    @Operation(summary = \"Criar nova entrega\", description = \"Cria uma entrega no banco de dados e aguarda motorista\")\n",[500,562,564],{"class":502,"line":563},11,[500,565,566],{},"    public ResponseEntity\u003CDeliveryResponse> criarEntrega(@RequestBody DeliveryRequest request) {\n",[500,568,570],{"class":502,"line":569},12,[500,571,572],{},"        DeliveryResponse response = service.criar(request);\n",[500,574,576],{"class":502,"line":575},13,[500,577,578],{},"        return ResponseEntity.status(HttpStatus.CREATED).body(response);\n",[500,580,582],{"class":502,"line":581},14,[500,583,584],{},"    }\n",[500,586,588],{"class":502,"line":587},15,[500,589,590],{},"}\n",[360,592,594],{"id":593},"o-contrato-json-enviado-pelo-app-mobile-payload","📄 O Contrato JSON enviado pelo App Mobile (Payload):",[491,596,600],{"className":597,"code":598,"language":599,"meta":496,"style":496},"language-json shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","{\n  \"clienteId\": 45,\n  \"enderecoDestino\": \"Av. Paulista, 1000 - São Paulo, SP\",\n  \"pesoCarga\": 12.5,\n  \"tipoNotificacao\": \"SMS\"\n}\n","json",[321,601,602,608,630,652,668,687],{"__ignoreMap":496},[500,603,604],{"class":502,"line":503},[500,605,607],{"class":606},"sMK4o","{\n",[500,609,610,613,617,620,623,627],{"class":502,"line":509},[500,611,612],{"class":606},"  \"",[500,614,616],{"class":615},"spNyl","clienteId",[500,618,619],{"class":606},"\"",[500,621,622],{"class":606},":",[500,624,626],{"class":625},"sbssI"," 45",[500,628,629],{"class":606},",\n",[500,631,632,634,637,639,641,644,648,650],{"class":502,"line":515},[500,633,612],{"class":606},[500,635,636],{"class":615},"enderecoDestino",[500,638,619],{"class":606},[500,640,622],{"class":606},[500,642,643],{"class":606}," \"",[500,645,647],{"class":646},"sfazB","Av. Paulista, 1000 - São Paulo, SP",[500,649,619],{"class":606},[500,651,629],{"class":606},[500,653,654,656,659,661,663,666],{"class":502,"line":521},[500,655,612],{"class":606},[500,657,658],{"class":615},"pesoCarga",[500,660,619],{"class":606},[500,662,622],{"class":606},[500,664,665],{"class":625}," 12.5",[500,667,629],{"class":606},[500,669,670,672,675,677,679,681,684],{"class":502,"line":527},[500,671,612],{"class":606},[500,673,674],{"class":615},"tipoNotificacao",[500,676,619],{"class":606},[500,678,622],{"class":606},[500,680,643],{"class":606},[500,682,683],{"class":646},"SMS",[500,685,686],{"class":606},"\"\n",[500,688,689],{"class":502,"line":534},[500,690,590],{"class":606},[360,692,694],{"id":693},"documentação-swagger-openapi-yaml-correspondente","📄 Documentação Swagger (OpenAPI YAML) correspondente:",[491,696,700],{"className":697,"code":698,"language":699,"meta":496,"style":496},"language-yaml shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","openapi: 3.0.3\ninfo:\n  title: API TecProExpress\n  version: 1.0.0\npaths:\n  \u002Fapi\u002Fentregas:\n    post:\n      summary: Criar nova entrega\n      tags:\n        - Entregas\n      requestBody:\n        required: true\n        content:\n          application\u002Fjson:\n            schema:\n              type: object\n              required:\n                - clienteId\n                - enderecoDestino\n              properties:\n                clienteId:\n                  type: integer\n                enderecoDestino:\n                  type: string\n                pesoCarga:\n                  type: number\n      responses:\n        '201':\n          description: Criado com sucesso\n","yaml",[321,701,702,713,721,731,741,748,755,762,772,779,787,794,805,812,819,826,837,845,854,862,870,878,889,897,907,915,925,933,947],{"__ignoreMap":496},[500,703,704,708,710],{"class":502,"line":503},[500,705,707],{"class":706},"swJcz","openapi",[500,709,622],{"class":606},[500,711,712],{"class":625}," 3.0.3\n",[500,714,715,718],{"class":502,"line":509},[500,716,717],{"class":706},"info",[500,719,720],{"class":606},":\n",[500,722,723,726,728],{"class":502,"line":515},[500,724,725],{"class":706},"  title",[500,727,622],{"class":606},[500,729,730],{"class":646}," API TecProExpress\n",[500,732,733,736,738],{"class":502,"line":521},[500,734,735],{"class":706},"  version",[500,737,622],{"class":606},[500,739,740],{"class":625}," 1.0.0\n",[500,742,743,746],{"class":502,"line":527},[500,744,745],{"class":706},"paths",[500,747,720],{"class":606},[500,749,750,753],{"class":502,"line":534},[500,751,752],{"class":706},"  \u002Fapi\u002Fentregas",[500,754,720],{"class":606},[500,756,757,760],{"class":502,"line":540},[500,758,759],{"class":706},"    post",[500,761,720],{"class":606},[500,763,764,767,769],{"class":502,"line":546},[500,765,766],{"class":706},"      summary",[500,768,622],{"class":606},[500,770,771],{"class":646}," Criar nova entrega\n",[500,773,774,777],{"class":502,"line":551},[500,775,776],{"class":706},"      tags",[500,778,720],{"class":606},[500,780,781,784],{"class":502,"line":557},[500,782,783],{"class":606},"        -",[500,785,786],{"class":646}," Entregas\n",[500,788,789,792],{"class":502,"line":563},[500,790,791],{"class":706},"      requestBody",[500,793,720],{"class":606},[500,795,796,799,801],{"class":502,"line":569},[500,797,798],{"class":706},"        required",[500,800,622],{"class":606},[500,802,804],{"class":803},"sfNiH"," true\n",[500,806,807,810],{"class":502,"line":575},[500,808,809],{"class":706},"        content",[500,811,720],{"class":606},[500,813,814,817],{"class":502,"line":581},[500,815,816],{"class":706},"          application\u002Fjson",[500,818,720],{"class":606},[500,820,821,824],{"class":502,"line":587},[500,822,823],{"class":706},"            schema",[500,825,720],{"class":606},[500,827,829,832,834],{"class":502,"line":828},16,[500,830,831],{"class":706},"              type",[500,833,622],{"class":606},[500,835,836],{"class":646}," object\n",[500,838,840,843],{"class":502,"line":839},17,[500,841,842],{"class":706},"              required",[500,844,720],{"class":606},[500,846,848,851],{"class":502,"line":847},18,[500,849,850],{"class":606},"                -",[500,852,853],{"class":646}," clienteId\n",[500,855,857,859],{"class":502,"line":856},19,[500,858,850],{"class":606},[500,860,861],{"class":646}," enderecoDestino\n",[500,863,865,868],{"class":502,"line":864},20,[500,866,867],{"class":706},"              properties",[500,869,720],{"class":606},[500,871,873,876],{"class":502,"line":872},21,[500,874,875],{"class":706},"                clienteId",[500,877,720],{"class":606},[500,879,881,884,886],{"class":502,"line":880},22,[500,882,883],{"class":706},"                  type",[500,885,622],{"class":606},[500,887,888],{"class":646}," integer\n",[500,890,892,895],{"class":502,"line":891},23,[500,893,894],{"class":706},"                enderecoDestino",[500,896,720],{"class":606},[500,898,900,902,904],{"class":502,"line":899},24,[500,901,883],{"class":706},[500,903,622],{"class":606},[500,905,906],{"class":646}," string\n",[500,908,910,913],{"class":502,"line":909},25,[500,911,912],{"class":706},"                pesoCarga",[500,914,720],{"class":606},[500,916,918,920,922],{"class":502,"line":917},26,[500,919,883],{"class":706},[500,921,622],{"class":606},[500,923,924],{"class":646}," number\n",[500,926,928,931],{"class":502,"line":927},27,[500,929,930],{"class":706},"      responses",[500,932,720],{"class":606},[500,934,936,939,942,945],{"class":502,"line":935},28,[500,937,938],{"class":606},"        '",[500,940,941],{"class":646},"201",[500,943,944],{"class":606},"'",[500,946,720],{"class":606},[500,948,950,953,955],{"class":502,"line":949},29,[500,951,952],{"class":706},"          description",[500,954,622],{"class":606},[500,956,957],{"class":646}," Criado com sucesso\n",[258,959],{},[261,961,963],{"id":962},"️-prática-obrigatória-1-tabela-de-endpoints-da-api","🛠️ Prática Obrigatória 1: Tabela de Endpoints da API",[266,965,966,969],{},[277,967,968],{},"Cenário:"," O projeto semestral da sua equipe.",[365,971,972,979],{},[273,973,974,975,978],{},"Mapeie ",[277,976,977],{},"3 endpoints críticos"," que o seu sistema precisará expor para um aplicativo celular ou sistema parceiro.",[273,980,981,982,985,986,985,989,338,992,995],{},"Organize-os em uma tabela contendo: ",[277,983,984],{},"Verbo HTTP",", ",[277,987,988],{},"Caminho (URL)",[277,990,991],{},"O que faz (Descrição)",[277,993,994],{},"Status Code de Sucesso"," (ex: 200, 201).",[360,997,999],{"id":998},"resultado-esperado-para-sua-referência","🏁 Resultado Esperado (Para sua Referência)",[266,1001,1002],{},"Uma tabela com o roteiro de comunicação REST detalhando as requisições principais de forma limpa e seguindo as boas práticas.",[258,1004],{},[261,1006,1008],{"id":1007},"️-prática-obrigatória-2-o-payload-json-e-contrato-swagger","🛠️ Prática Obrigatória 2: O Payload JSON e Contrato Swagger",[266,1010,1011,1013],{},[277,1012,968],{}," Detalhando os dados de tráfego.",[365,1015,1016,1023],{},[273,1017,1018,1019,1022],{},"Para o endpoint principal de inserção de dados da Prática 1 (Ex: criar agendamento, realizar venda), escreva o payload em formato ",[277,1020,1021],{},"JSON"," real que o cliente enviará.",[273,1024,1025,1026,1029],{},"Escreva a especificação profissional simplificada no padrão ",[277,1027,1028],{},"Swagger\u002FOpenAPI (formato YAML)"," que descreve esse endpoint e o corpo da requisição de forma estruturada.",[258,1031],{},[261,1033,1035],{"id":1034},"instruções-de-entrega-microsoft-teams","📤 Instruções de Entrega (Microsoft Teams)",[266,1037,1038],{},"Após validar o seu design de API:",[365,1040,1041,1052,1055],{},[273,1042,1043,1044,1047,1048,1051],{},"Salve o arquivo contendo a tabela de endpoints, o JSON e a especificação Swagger YAML com o nome ",[321,1045,1046],{},"Atividade_14.md"," na pasta ",[321,1049,1050],{},"es-atv-14-apis-swagger\u002F"," do seu repositório GitHub.",[273,1053,1054],{},"Certifique-se de fazer o commit e push para o repositório público.",[273,1056,1057],{},"Submeta o link do seu repositório no Microsoft Teams para avaliação do professor.",[258,1059],{},[261,1061,1063],{"id":1062},"checkpoint-de-lógica","💡 Checkpoint de Lógica",[1065,1066,1069,381,1072,1075,1076,1078,1079,1082,1083,1085,1086,1089],"callout",{"color":1067,"icon":1068},"primary","i-lucide-megaphone",[277,1070,1071],{},"Importante:",[277,1073,1074],{},"Reflexão Profissional:","\nPor que no design REST profissional, nunca usamos o verbo ",[277,1077,404],{}," para realizar a deleção de um dado (ex: ",[321,1080,1081],{},"GET \u002Fapi\u002Fentregas\u002Fexcluir?id=5",") em vez do correto ",[277,1084,429],{}," (ex: ",[321,1087,1088],{},"DELETE \u002Fapi\u002Fentregas\u002F5",")? (Resposta: Pela natureza idempotente e segura dos verbos HTTP. Navegadores e proxies de cache assumem que requisições GET são seguras e não causam efeitos colaterais. Se você usar GET para excluir, um robô de busca de indexação automática da internet ao varrer os links do seu sistema poderia, acidentalmente, apagar o banco de dados inteiro da empresa!). 🧠🛡️",[258,1091],{},[261,1093,1095],{"id":1094},"rubrica-formativa-de-avaliação","📊 Rubrica Formativa de Avaliação",[1097,1098,1100,1101,1100,1124],"table",{"style":1099},"width:100%; border-collapse: collapse; font-family: sans-serif; margin: 20px 0; border: 1px solid #ddd; box-shadow: 0 4px 8px rgba(0,0,0,0.1);","\n  ",[1102,1103,1104,1105,1100],"thead",{},"\n    ",[1106,1107,1109,1110,1109,1115,1109,1118,1109,1121,1104],"tr",{"style":1108},"background-color: #2c3e50; color: white;","\n      ",[1111,1112,1114],"th",{"style":1113},"padding: 12px; border: 1px solid #ddd; text-align: left;","Critério de Avaliação",[1111,1116,1117],{"style":1113},"Insuficiente (0% - 40%)",[1111,1119,1120],{"style":1113},"Regular (41% - 70%)",[1111,1122,1123],{"style":1113},"Excelente (71% - 100%)",[1125,1126,1104,1127,1104,1146,1104,1162,1100],"tbody",{},[1106,1128,1109,1130,1109,1137,1109,1140,1109,1143,1104],{"style":1129},"background-color: #f8f9fa;",[1131,1132,1134],"td",{"style":1133},"padding: 10px; border: 1px solid #ddd;",[277,1135,1136],{},"Design de Endpoints REST & Verbos HTTP",[1131,1138,1139],{"style":1133},"Usa verbos incorretos (ex: GET para exclusão) ou URLs fora do padrão RESTful.",[1131,1141,1142],{"style":1133},"Mapeia os 3 endpoints mas omite códigos de status de resposta (Status Codes).",[1131,1144,1145],{"style":1133},"Tabela de endpoints impecável com verbos HTTP semânticos (GET, POST, PUT, DELETE) e Status Codes corretos (200, 201, 204).",[1106,1147,1109,1148,1109,1153,1109,1156,1109,1159,1104],{},[1131,1149,1150],{"style":1133},[277,1151,1152],{},"Payload JSON & Especificação Swagger OpenAPI YAML",[1131,1154,1155],{"style":1133},"Erros na sintaxe JSON ou formato YAML desalinhado.",[1131,1157,1158],{"style":1133},"Escreve o JSON mas omite a especificação Swagger YAML.",[1131,1160,1161],{"style":1133},"Payload JSON de requisição perfeito e contrato OpenAPI 3.0 YAML completamente válido.",[1106,1163,1109,1164,1109,1169,1109,1172,1109,1175,1104],{"style":1129},[1131,1165,1166],{"style":1133},[277,1167,1168],{},"Entrega no GitHub",[1131,1170,1171],{"style":1133},"Entrega fora da pasta `es-atv-14-apis-swagger\u002F`.",[1131,1173,1174],{"style":1133},"Arquivo entregue mas com formatação YAML quebrada.",[1131,1176,1177],{"style":1133},"Submete `Atividade_14.md` com formatação limpa e blocos de código formatados no repositório.",[1179,1180,1181],"style",{},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sfNiH, html code.shiki .sfNiH{--shiki-light:#FF5370;--shiki-default:#FF9CAC;--shiki-dark:#FF9CAC}",{"title":496,"searchDepth":509,"depth":515,"links":1183},[1184,1185,1186,1191,1196,1199,1200,1201,1202],{"id":263,"depth":509,"text":264},{"id":308,"depth":509,"text":309},{"id":350,"depth":509,"text":351,"children":1187},[1188],{"id":362,"depth":515,"text":363,"children":1189},[1190],{"id":471,"depth":521,"text":472},{"id":481,"depth":509,"text":482,"children":1192},[1193,1194,1195],{"id":488,"depth":515,"text":489},{"id":593,"depth":515,"text":594},{"id":693,"depth":515,"text":694},{"id":962,"depth":509,"text":963,"children":1197},[1198],{"id":998,"depth":515,"text":999},{"id":1007,"depth":509,"text":1008},{"id":1034,"depth":509,"text":1035},{"id":1062,"depth":509,"text":1063},{"id":1094,"depth":509,"text":1095},"Bem-vindo a mais uma etapa prática de Engenharia de Software! Agora que você conhece as camadas internas do software, aprenderá como expor e conectar o seu sistema ao mundo externo. Hoje, vamos nos tornar arquitetos de comunicação móvel e web, projetando contratos de integração baseados em APIs RESTful, payloads de dados JSON e documentando tudo com o padrão profissional global Swagger (OpenAPI). 🛡️🧩","md",null,{},{"title":162,"description":1203},"I8YaIfWxWlS7a68KzsdZZnh0eYIHniofN-_H4w4oWkQ",[1210,1212],{"title":158,"path":159,"stem":160,"description":1211,"children":-1},"Bem-vindo a mais uma etapa do seu desenvolvimento técnico! Agora que você domina a modelagem de processos e dados, daremos o passo mais importante para quem quer se tornar um desenvolvedor sênior ou gestor técnico: projetar a arquitetura interna do software. Hoje, aprenderemos a organizar sistemas profissionais em camadas usando o padrão MVC (Model-View-Controller) corporativo com Java 17, Spring Boot 3.5.x, Thymeleaf e HTMX, além de aplicar o padrão de projeto criacional Factory. 🛡️🧩",{"title":166,"path":167,"stem":168,"description":1213,"children":-1},"Bem-vindo a mais uma etapa prática de Engenharia de Software! Até agora, você criou especificações e diagramas. Mas na vida real de desenvolvimento corporativo, as equipes trabalham juntas em uma base de código única. Como fazer para que 10 programadores editem o mesmo arquivo do Spring Boot ao mesmo tempo sem que um apague a alteração do outro? Hoje, aprenderemos a dominar o controle de versão profissional usando o Git e a metodologia estratégica GitFlow. 🛡️🧩",1788375145710]