# ๐Ÿ—„ โฒ ๐Ÿ‘† ๐Ÿ’ช โœ ๐Ÿ› ๏ธ โฎ๏ธ *โžก ๐Ÿ› ๏ธ* ๐Ÿ‘ˆ ๐Ÿ’ช โฒ ๐Ÿ“จ *๐Ÿ”ข ๐Ÿ› ๏ธ* โœ ๐Ÿ‘ฑ ๐Ÿ™† (๐ŸŽฒ ๐ŸŽ ๐Ÿ‘ฉโ€๐Ÿ’ป ๐Ÿ‘ˆ ๐Ÿ”œ *โš™๏ธ* ๐Ÿ‘† ๐Ÿ› ๏ธ). ๐Ÿ› ๏ธ ๐Ÿ‘ˆ ๐Ÿ”จ ๐Ÿ•โ” ๐Ÿ‘† ๐Ÿ› ๏ธ ๐Ÿ“ฑ ๐Ÿค™ *๐Ÿ”ข ๐Ÿ› ๏ธ* ๐Ÿ“› "โฒ". โ†ฉ๏ธ ๐Ÿ–ฅ ๐Ÿ‘ˆ ๐Ÿ”ข ๐Ÿ‘ฉโ€๐Ÿ’ป โœ ๐Ÿ“จ ๐Ÿ“จ ๐Ÿ‘† ๐Ÿ› ๏ธ & โคด๏ธ ๐Ÿ‘† ๐Ÿ› ๏ธ *๐Ÿค™ ๐Ÿ”™*, ๐Ÿ“จ ๐Ÿ“จ *๐Ÿ”ข ๐Ÿ› ๏ธ* (๐Ÿ‘ˆ ๐ŸŽฒ โœ ๐ŸŽ ๐Ÿ‘ฉโ€๐Ÿ’ป). ๐Ÿ‘‰ ๐Ÿ’ผ, ๐Ÿ‘† ๐Ÿ’ช ๐Ÿ’š ๐Ÿ“„ โ” ๐Ÿ‘ˆ ๐Ÿ”ข ๐Ÿ› ๏ธ *๐Ÿ”œ* ๐Ÿ‘€ ๐Ÿ’–. โšซ๏ธโ” *โžก ๐Ÿ› ๏ธ* โšซ๏ธ ๐Ÿ”œ โœ”๏ธ, โšซ๏ธโ” ๐Ÿ’ช โšซ๏ธ ๐Ÿ”œ โŒ›, โšซ๏ธโ” ๐Ÿ“จ โšซ๏ธ ๐Ÿ”œ ๐Ÿ“จ, โ™’๏ธ. ## ๐Ÿ“ฑ โฎ๏ธ โฒ โžก๏ธ ๐Ÿ‘€ ๐ŸŒ ๐Ÿ‘‰ โฎ๏ธ ๐Ÿ–ผ. ๐ŸŒˆ ๐Ÿ‘† ๐Ÿ› ๏ธ ๐Ÿ“ฑ ๐Ÿ‘ˆ โœ” ๐Ÿ— ๐Ÿงพ. ๐Ÿ‘‰ ๐Ÿงพ ๐Ÿ”œ โœ”๏ธ `id`, `title` (๐Ÿ“ฆ), `customer`, & `total`. ๐Ÿ‘ฉโ€๐Ÿ’ป ๐Ÿ‘† ๐Ÿ› ๏ธ (๐Ÿ”ข ๐Ÿ‘ฉโ€๐Ÿ’ป) ๐Ÿ”œ โœ ๐Ÿงพ ๐Ÿ‘† ๐Ÿ› ๏ธ โฎ๏ธ ๐Ÿค ๐Ÿ“จ. โคด๏ธ ๐Ÿ‘† ๐Ÿ› ๏ธ ๐Ÿ”œ (โžก๏ธ ๐ŸŒˆ): * ๐Ÿ“จ ๐Ÿงพ ๐Ÿ•ด ๐Ÿ”ข ๐Ÿ‘ฉโ€๐Ÿ’ป. * ๐Ÿ“ˆ ๐Ÿ’ธ. * ๐Ÿ“จ ๐Ÿ“จ ๐Ÿ”™ ๐Ÿ› ๏ธ ๐Ÿ‘ฉโ€๐Ÿ’ป (๐Ÿ”ข ๐Ÿ‘ฉโ€๐Ÿ’ป). * ๐Ÿ‘‰ ๐Ÿ”œ ๐Ÿ”จ ๐Ÿ“จ ๐Ÿค ๐Ÿ“จ (โšช๏ธโžก๏ธ *๐Ÿ‘† ๐Ÿ› ๏ธ*) *๐Ÿ”ข ๐Ÿ› ๏ธ* ๐Ÿšš ๐Ÿ‘ˆ ๐Ÿ”ข ๐Ÿ‘ฉโ€๐Ÿ’ป (๐Ÿ‘‰ "โฒ"). ## ๐Ÿ˜ **FastAPI** ๐Ÿ“ฑ โžก๏ธ ๐Ÿฅ‡ ๐Ÿ‘€ โ” ๐Ÿ˜ ๐Ÿ› ๏ธ ๐Ÿ“ฑ ๐Ÿ”œ ๐Ÿ‘€ ๐Ÿ’– โญ โŽ โฒ. โšซ๏ธ ๐Ÿ”œ โœ”๏ธ *โžก ๐Ÿ› ๏ธ* ๐Ÿ‘ˆ ๐Ÿ”œ ๐Ÿ“จ `Invoice` ๐Ÿ’ช, & ๐Ÿ”ข ๐Ÿ”ข `callback_url` ๐Ÿ‘ˆ ๐Ÿ”œ ๐Ÿ”Œ ๐Ÿ“› โฒ. ๐Ÿ‘‰ ๐Ÿ• ๐Ÿ“ถ ๐Ÿ˜, ๐ŸŒ… ๐Ÿ“Ÿ ๐ŸŽฒ โช ๐Ÿ˜ฐ ๐Ÿ‘†: {* ../../docs_src/openapi_callbacks/tutorial001.py hl[9:13,36:53] *} /// tip `callback_url` ๐Ÿ”ข ๐Ÿ”ข โš™๏ธ Pydantic ๐Ÿ“› ๐Ÿ†Ž. /// ๐Ÿ•ด ๐Ÿ†• ๐Ÿ‘œ `callbacks=messages_callback_router.routes` โŒ *โžก ๐Ÿ› ๏ธ ๐Ÿ‘จโ€๐ŸŽจ*. ๐Ÿ‘ฅ ๐Ÿ”œ ๐Ÿ‘€ โšซ๏ธโ” ๐Ÿ‘ˆ โญ. ## ๐Ÿ”ฌ โฒ โ˜‘ โฒ ๐Ÿ“Ÿ ๐Ÿ”œ ๐Ÿช€ ๐Ÿ™‡ ๐Ÿ”› ๐Ÿ‘† ๐Ÿ‘ ๐Ÿ› ๏ธ ๐Ÿ“ฑ. & โšซ๏ธ ๐Ÿ”œ ๐ŸŽฒ ๐Ÿช€ ๐Ÿ“š โšช๏ธโžก๏ธ 1๏ธโƒฃ ๐Ÿ“ฑ โญ. โšซ๏ธ ๐Ÿ’ช 1๏ธโƒฃ โš–๏ธ 2๏ธโƒฃ โธ ๐Ÿ“Ÿ, ๐Ÿ’–: ```Python callback_url = "https://example.com/api/v1/invoices/events/" httpx.post(callback_url, json={"description": "Invoice paid", "paid": True}) ``` โœ‹๏ธ ๐ŸŽฒ ๐Ÿ† โš  ๐Ÿ• โฒ โš’ ๐Ÿ’ญ ๐Ÿ‘ˆ ๐Ÿ‘† ๐Ÿ› ๏ธ ๐Ÿ‘ฉโ€๐Ÿ’ป (๐Ÿ”ข ๐Ÿ‘ฉโ€๐Ÿ’ป) ๐Ÿ› ๏ธ *๐Ÿ”ข ๐Ÿ› ๏ธ* โ˜‘, ๐Ÿ›„ ๐Ÿ’ฝ ๐Ÿ‘ˆ *๐Ÿ‘† ๐Ÿ› ๏ธ* ๐Ÿ”œ ๐Ÿ“จ ๐Ÿ“จ ๐Ÿ’ช โฒ, โ™’๏ธ. , โšซ๏ธโ” ๐Ÿ‘ฅ ๐Ÿ”œ โญ ๐Ÿšฎ ๐Ÿ“Ÿ ๐Ÿ“„ โ” ๐Ÿ‘ˆ *๐Ÿ”ข ๐Ÿ› ๏ธ* ๐Ÿ”œ ๐Ÿ‘€ ๐Ÿ’– ๐Ÿ“จ โฒ โšช๏ธโžก๏ธ *๐Ÿ‘† ๐Ÿ› ๏ธ*. ๐Ÿ‘ˆ ๐Ÿงพ ๐Ÿ”œ ๐ŸŽฆ ๐Ÿ†™ ๐Ÿฆ ๐ŸŽš `/docs` ๐Ÿ‘† ๐Ÿ› ๏ธ, & โšซ๏ธ ๐Ÿ”œ โžก๏ธ ๐Ÿ”ข ๐Ÿ‘ฉโ€๐Ÿ’ป ๐Ÿ’ญ โ” ๐Ÿ— *๐Ÿ”ข ๐Ÿ› ๏ธ*. ๐Ÿ‘‰ ๐Ÿ–ผ ๐Ÿšซ ๐Ÿ› ๏ธ โฒ โšซ๏ธ (๐Ÿ‘ˆ ๐Ÿ’ช โธ ๐Ÿ“Ÿ), ๐Ÿ•ด ๐Ÿงพ ๐Ÿ•. /// tip โ˜‘ โฒ ๐Ÿ‡บ๐Ÿ‡ธ๐Ÿ” ๐Ÿ“จ. ๐Ÿ•โ” ๐Ÿ› ๏ธ โฒ ๐Ÿ‘†, ๐Ÿ‘† ๐Ÿ’ช โš™๏ธ ๐Ÿ•ณ ๐Ÿ’– ๐Ÿ‡ธ๐Ÿ‡ฒ โš–๏ธ ๐Ÿ“จ. /// ## โœ โฒ ๐Ÿงพ ๐Ÿ“Ÿ ๐Ÿ‘‰ ๐Ÿ“Ÿ ๐Ÿ† ๐Ÿšซ ๐Ÿ› ๏ธ ๐Ÿ‘† ๐Ÿ“ฑ, ๐Ÿ‘ฅ ๐Ÿ•ด ๐Ÿ’ช โšซ๏ธ *๐Ÿ“„* โ” ๐Ÿ‘ˆ *๐Ÿ”ข ๐Ÿ› ๏ธ* ๐Ÿ”œ ๐Ÿ‘€ ๐Ÿ’–. โœ‹๏ธ, ๐Ÿ‘† โช ๐Ÿ’ญ โ” ๐Ÿ’ช โœ ๐Ÿง ๐Ÿงพ ๐Ÿ› ๏ธ โฎ๏ธ **FastAPI**. ๐Ÿ‘ฅ ๐Ÿ”œ โš™๏ธ ๐Ÿ‘ˆ ๐ŸŽ ๐Ÿ’ก ๐Ÿ“„ โ” *๐Ÿ”ข ๐Ÿ› ๏ธ* ๐Ÿ”œ ๐Ÿ‘€ ๐Ÿ’–... ๐Ÿ— *โžก ๐Ÿ› ๏ธ(โ“‚)* ๐Ÿ‘ˆ ๐Ÿ”ข ๐Ÿ› ๏ธ ๐Ÿ”œ ๐Ÿ› ๏ธ (๐Ÿ• ๐Ÿ‘† ๐Ÿ› ๏ธ ๐Ÿ”œ ๐Ÿค™). /// tip ๐Ÿ•โ” โœ ๐Ÿ“Ÿ ๐Ÿ“„ โฒ, โšซ๏ธ ๐Ÿ’ช โš  ๐ŸŒˆ ๐Ÿ‘ˆ ๐Ÿ‘† ๐Ÿ‘ˆ *๐Ÿ”ข ๐Ÿ‘ฉโ€๐Ÿ’ป*. & ๐Ÿ‘ˆ ๐Ÿ‘† โณ ๐Ÿ› ๏ธ *๐Ÿ”ข ๐Ÿ› ๏ธ*, ๐Ÿšซ *๐Ÿ‘† ๐Ÿ› ๏ธ*. ๐Ÿ• ๐Ÿ› ๏ธ ๐Ÿ‘‰ โ˜ ๐ŸŽ‘ ( *๐Ÿ”ข ๐Ÿ‘ฉโ€๐Ÿ’ป*) ๐Ÿ’ช โ„น ๐Ÿ‘† ๐Ÿ’ญ ๐Ÿ’– โšซ๏ธ ๐ŸŒ… โญ ๐ŸŒโ” ๐Ÿšฎ ๐Ÿ”ข, Pydantic ๐Ÿท ๐Ÿ’ช, ๐Ÿ“จ, โ™’๏ธ. ๐Ÿ‘ˆ *๐Ÿ”ข ๐Ÿ› ๏ธ*. /// ### โœ โฒ `APIRouter` ๐Ÿฅ‡ โœ ๐Ÿ†• `APIRouter` ๐Ÿ‘ˆ ๐Ÿ”œ ๐Ÿ”Œ 1๏ธโƒฃ โš–๏ธ ๐ŸŒ… โฒ. {* ../../docs_src/openapi_callbacks/tutorial001.py hl[3,25] *} ### โœ โฒ *โžก ๐Ÿ› ๏ธ* โœ โฒ *โžก ๐Ÿ› ๏ธ* โš™๏ธ ๐ŸŽ `APIRouter` ๐Ÿ‘† โœ ๐Ÿ”›. โšซ๏ธ ๐Ÿ”œ ๐Ÿ‘€ ๐Ÿ’– ๐Ÿ˜ FastAPI *โžก ๐Ÿ› ๏ธ*: * โšซ๏ธ ๐Ÿ”œ ๐ŸŽฒ โœ”๏ธ ๐Ÿ“„ ๐Ÿ’ช โšซ๏ธ ๐Ÿ”œ ๐Ÿ“จ, โœ… `body: InvoiceEvent`. * & โšซ๏ธ ๐Ÿ’ช โœ”๏ธ ๐Ÿ“„ ๐Ÿ“จ โšซ๏ธ ๐Ÿ”œ ๐Ÿ“จ, โœ… `response_model=InvoiceEventReceived`. {* ../../docs_src/openapi_callbacks/tutorial001.py hl[16:18,21:22,28:32] *} ๐Ÿ“ค 2๏ธโƒฃ ๐Ÿ‘‘ ๐Ÿ”บ โšช๏ธโžก๏ธ ๐Ÿ˜ *โžก ๐Ÿ› ๏ธ*: * โšซ๏ธ ๐Ÿšซ ๐Ÿ’ช โœ”๏ธ ๐Ÿ™† โ˜‘ ๐Ÿ“Ÿ, โ†ฉ๏ธ ๐Ÿ‘† ๐Ÿ“ฑ ๐Ÿ”œ ๐Ÿ™… ๐Ÿค™ ๐Ÿ‘‰ ๐Ÿ“Ÿ. โšซ๏ธ ๐Ÿ•ด โš™๏ธ ๐Ÿ“„ *๐Ÿ”ข ๐Ÿ› ๏ธ*. , ๐Ÿ”ข ๐Ÿ’ช โœ”๏ธ `pass`. * *โžก* ๐Ÿ’ช ๐Ÿ”Œ ๐Ÿ—„ 3๏ธโƒฃ ๐Ÿงฌ (๐Ÿ‘€ ๐ŸŒ– ๐Ÿ”›) ๐ŸŒโ” โšซ๏ธ ๐Ÿ’ช โš™๏ธ ๐Ÿ”ข โฎ๏ธ ๐Ÿ”ข & ๐Ÿ• โฎ๏ธ ๐Ÿ“จ ๐Ÿ“จ *๐Ÿ‘† ๐Ÿ› ๏ธ*. ### โฒ โžก ๐Ÿงฌ โฒ *โžก* ๐Ÿ’ช โœ”๏ธ ๐Ÿ—„ 3๏ธโƒฃ ๐Ÿงฌ ๐Ÿ‘ˆ ๐Ÿ’ช ๐Ÿ”Œ ๐Ÿ• โฎ๏ธ ๐Ÿ“จ ๐Ÿ“จ *๐Ÿ‘† ๐Ÿ› ๏ธ*. ๐Ÿ‘‰ ๐Ÿ’ผ, โšซ๏ธ `str`: ```Python "{$callback_url}/invoices/{$request.body.id}" ``` , ๐Ÿšฅ ๐Ÿ‘† ๐Ÿ› ๏ธ ๐Ÿ‘ฉโ€๐Ÿ’ป (๐Ÿ”ข ๐Ÿ‘ฉโ€๐Ÿ’ป) ๐Ÿ“จ ๐Ÿ“จ *๐Ÿ‘† ๐Ÿ› ๏ธ* : ``` https://yourapi.com/invoices/?callback_url=https://www.external.org/events ``` โฎ๏ธ ๐ŸŽป ๐Ÿ’ช: ```JSON { "id": "2expen51ve", "customer": "Mr. Richie Rich", "total": "9999" } ``` โคด๏ธ *๐Ÿ‘† ๐Ÿ› ๏ธ* ๐Ÿ”œ ๐Ÿ› ๏ธ ๐Ÿงพ, & โ˜ โช, ๐Ÿ“จ โฒ ๐Ÿ“จ `callback_url` ( *๐Ÿ”ข ๐Ÿ› ๏ธ*): ``` https://www.external.org/events/invoices/2expen51ve ``` โฎ๏ธ ๐ŸŽป ๐Ÿ’ช โš— ๐Ÿ•ณ ๐Ÿ’–: ```JSON { "description": "Payment celebration", "paid": true } ``` & โšซ๏ธ ๐Ÿ”œ โŒ› ๐Ÿ“จ โšช๏ธโžก๏ธ ๐Ÿ‘ˆ *๐Ÿ”ข ๐Ÿ› ๏ธ* โฎ๏ธ ๐ŸŽป ๐Ÿ’ช ๐Ÿ’–: ```JSON { "ok": true } ``` /// tip ๐Ÿ‘€ โ” โฒ ๐Ÿ“› โš™๏ธ ๐Ÿ”Œ ๐Ÿ“› ๐Ÿ“จ ๐Ÿ”ข ๐Ÿ”ข `callback_url` (`https://www.external.org/events`) & ๐Ÿงพ `id` โšช๏ธโžก๏ธ ๐Ÿ”˜ ๐ŸŽป ๐Ÿ’ช (`2expen51ve`). /// ### ๐Ÿšฎ โฒ ๐Ÿ“ป ๐Ÿ‘‰ โ˜ ๐Ÿ‘† โœ”๏ธ *โฒ โžก ๐Ÿ› ๏ธ(โ“‚)* ๐Ÿ’ช (1๏ธโƒฃ(โ“‚) ๐Ÿ‘ˆ *๐Ÿ”ข ๐Ÿ‘ฉโ€๐Ÿ’ป* ๐Ÿ”œ ๐Ÿ› ๏ธ *๐Ÿ”ข ๐Ÿ› ๏ธ*) โฒ ๐Ÿ“ป ๐Ÿ‘† โœ ๐Ÿ”›. ๐Ÿ”œ โš™๏ธ ๐Ÿ”ข `callbacks` *๐Ÿ‘† ๐Ÿ› ๏ธ โžก ๐Ÿ› ๏ธ ๐Ÿ‘จโ€๐ŸŽจ* ๐Ÿšถโ€โ™€๏ธ ๐Ÿ”ข `.routes` (๐Ÿ‘ˆ ๐Ÿค™ `list` ๐Ÿ›ฃ/*โžก ๐Ÿ› ๏ธ*) โšช๏ธโžก๏ธ ๐Ÿ‘ˆ โฒ ๐Ÿ“ป: {* ../../docs_src/openapi_callbacks/tutorial001.py hl[35] *} /// tip ๐Ÿ‘€ ๐Ÿ‘ˆ ๐Ÿ‘† ๐Ÿšซ ๐Ÿšถโ€โ™€๏ธ ๐Ÿ“ป โšซ๏ธ (`invoices_callback_router`) `callback=`, โœ‹๏ธ ๐Ÿ”ข `.routes`, `invoices_callback_router.routes`. /// ### โœ… ๐Ÿฉบ ๐Ÿ”œ ๐Ÿ‘† ๐Ÿ’ช โ–ถ๏ธ ๐Ÿ‘† ๐Ÿ“ฑ โฎ๏ธ Uvicorn & ๐Ÿšถ http://127.0.0.1:8000/docs. ๐Ÿ‘† ๐Ÿ”œ ๐Ÿ‘€ ๐Ÿ‘† ๐Ÿฉบ โœ… "โฒ" ๐Ÿ“„ ๐Ÿ‘† *โžก ๐Ÿ› ๏ธ* ๐Ÿ‘ˆ ๐ŸŽฆ โ” *๐Ÿ”ข ๐Ÿ› ๏ธ* ๐Ÿ”œ ๐Ÿ‘€ ๐Ÿ’–: