openapi: 3.0.0
paths:
/tracking/{parcelId}/subscribe:
parameters:
- name: parcelId
in: path
required: true
description: The parcel identifier
schema:
$ref: '#/components/schemas/parcelId'
post:
summary: Subscribe to notifications about given parcel
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
url:
type: string
format: uri
token:
type: string
required:
- url
- token
responses:
202:
description: 'Successfully subscribed to notifications about given parcel'
content:
text/plain:
examples:
ok:
value: 'ok'
callbacks:
notification:
'{$request.body#/url}?token={$request.body#/token}':
post:
summary: 'Receive single notification about a parcel'
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/notification'
responses:
200:
description: 'Notification successfully processed'
content:
text/plain:
examples:
ok:
value: 'ok'
components:
schemas:
parcelId:
type: string
pattern: '^[0-9]{16}$'
notification:
type: object
properties:
parcelId:
$ref: "#/components/schemas/parcelId"
status:
type: string
enum:
- pick-up
- in-transit
- delivered
required:
- parcelId
- status

好吧,等一下,內(nèi)容相當多。讓我描述一下重要的幾行。

1.我們將POST在端點執(zhí)行請求/tracking/{parcelId}/subscribe,以便訂閱有關 所標識的包裹的通知parcelId

注意: $ref: '#/components/schemas/parcelId'這是一個技巧,使我們能夠重用parcelId模式定義(在文檔末尾的組件部分中定義)

2.請求主體部分定義預期的輸入負載:

注意: token 可能是隨機生成的數(shù)據(jù)(我們需要將其存儲在我們這邊)。它也可能是公鑰(那么我們只需要驗證它是否與我們的秘密私鑰匹配)。

requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
url:
type: string
format: uri
token:
type: string
required:
- url
- token

3.接下來,responses部分定義單個202響應。202表示“接受”以供進一步處理。

最重要的部分: 。在我們的例子中,keywordcallbacks下的鍵是它們的名稱。然后是標題 – 。此路徑是運行時表達式。路徑表示將從請求正文中提取并構建通知接收 URL。callbacksnotification'{$request.body#/url}?token={$request.body#/token}'urltoken

客戶端服務的 OpenAPI 規(guī)范

client.oas3.yaml

openapi: 3.0.0
paths:
/notify:
post:
summary: 'Receive notification about a parcel'
security:
- TokenSecurity: []
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/notification'
responses:
'200':
description: 'Notification successfully processed'
content:
text/plain:
examples:
ok:
value: 'ok'
components:
securitySchemes:
TokenSecurty:
type: apiKey
name: token
in: query
schemas:
parcelId:
type: string
pattern: '^[0-9]{16}$'
notification:
type: object
properties:
parcelId:
$ref: "#/components/schemas/parcelId"
status:
type: string
enum:
- pick-up
- in-transit
- delivered
required:
- parcelId
- status

我們的 API 規(guī)范定義了一個處理通知接收的端點。就這么簡單!

讓我們模擬

我們已經(jīng)定義了物流服務 API 和我們的 API 的規(guī)范。現(xiàn)在是時候啟動prism實例并查看一些操作了。

下面的命令將為港口prism的物流公司運行實例4010

prism mock -p 4010 logistics.oas3.yaml

現(xiàn)在請打開新的控制臺并運行以下命令:

prism mock -p 4011 client.oas3.yaml

準備好?

curl -v -H'Content-type: application/json' -d'{ "url": "http://localhost:4011/notify", "token": "dontpeek" }' http://127.0.0.1:4010/tracking/7352110771638879/subscribe

以下是物流服務的輸出:

[CLI] …  awaiting  Starting Prism
[HTTP SERVER] info Server listening at http://127.0.0.1:4010
[CLI] info POST http://127.0.0.1:4010/tracking/7352110771638879/subscribe
[HTTP SERVER] post /tracking/7352110771638879/subscribe info Request received
[NEGOTIATOR] info Request contains an accept header: */*
[VALIDATOR] success The request passed the validation rules. Looking for the best response
[NEGOTIATOR] success Found a compatible content for */*
[NEGOTIATOR] success Responding with the requested status code 202
[CALLBACK] info notification: Making request to http://localhost:4011/notify?token=dontpeek...
[CALLBACK] info notification: Request finished

以及客戶端服務控制臺相應的輸出:

[CLI] …  awaiting  Starting Prism
[HTTP SERVER] info Server listening at http://127.0.0.1:4011
[CLI] info POST http://127.0.0.1:4011/notify
[HTTP SERVER] post /notify info Request received
[NEGOTIATOR] info Request contains an accept header: */*
[VALIDATOR] success The request passed the validation rules. Looking for the best response
[NEGOTIATOR] success Found a compatible content for */*
[NEGOTIATOR] success Responding with the requested status code 200

哇哦!發(fā)生什么事了?

  1. 請求POST已提出http://127.0.0.1:4010/tracking/7352110771638879/subscribe
  2. Prism 回復202表示訂閱已被接受。
  3. 請求體包含回調(diào)URL和token
  4. 回調(diào)定義包含有關如何構造 WebHook URL 的配方,這將導致http://localhost:4011/notify?token=dontpeek
  5. 發(fā)生 Parcel 事件,觸發(fā)通知請求
  6. /notifyPrism使用模擬有效負載向我們的端點執(zhí)行請求
  7. 客戶端控制臺顯示已收到通知

對于那些喜歡圖表的人來說,這里有一個序列圖。它展示了訂閱回調(diào)和接收三個通知的過程。

序列圖

恭喜,您剛剛模擬了兩個服務并強制它們相互通信。本教程到此結(jié)束!

那很好,但是我為什么需要 Prism?

測試回調(diào)可能會變得很復雜。你可能需要編寫一些小工具來模擬調(diào)用者服務。或者用curl “手動”調(diào)用它。或者強制服務調(diào)用你的 API 并相信它確實會這樣做。

聽起來還挺簡單的?現(xiàn)在想象一下你的 API 會隨著時間而改變。你需要維護該工具,但你丟失了curl命令,而且沒有關于如何快速測試 API 的文檔。哦,多么熟悉啊!

但是,等一下,您有一個始終保持最新的 OpenAPI 規(guī)范(因為您的老板告訴您這樣做),并且 Prism 可以將其變成 API 任何部分的功能齊全的模仿。現(xiàn)在您既不需要秘密命令,也不需要非文檔化的工具。

原文鏈接:Mocking?Callbacks?with?OpenAPI?and?Prism

熱門推薦
一個賬號試用1000+ API
助力AI無縫鏈接物理世界 · 無需多次注冊
3000+提示詞助力AI大模型
和專業(yè)工程師共享工作效率翻倍的秘密
返回頂部
上一篇
如何使用 Postman API 發(fā)起請求
下一篇
gRPC 與 REST:API 開發(fā)方法的對比分析
国内精品久久久久影院日本,日本中文字幕视频,99久久精品99999久久,又粗又大又黄又硬又爽毛片
91看片淫黄大片一级在线观看| 亚洲精品第1页| 337p亚洲精品色噜噜| 最近中文字幕一区二区三区| 久久99精品国产麻豆婷婷| 日韩一区国产二区欧美三区| 免费观看在线色综合| 欧美成人猛片aaaaaaa| 美女网站色91| 国产亚洲一本大道中文在线| 国产成人a级片| 亚洲欧美日韩国产综合在线| 欧美性猛交xxxx黑人交| 日韩av网站免费在线| 久久久99久久精品欧美| 成人91在线观看| 亚洲成av人片一区二区| 欧美成人精品福利| 波多野洁衣一区| 亚洲国产精品欧美一二99| 91精品在线免费| 国产a精品视频| 亚洲高清免费在线| 久久综合成人精品亚洲另类欧美| va亚洲va日韩不卡在线观看| 亚洲一区自拍偷拍| 久久噜噜亚洲综合| 在线免费观看视频一区| 久久国产成人午夜av影院| 中文字幕成人在线观看| 欧美一区2区视频在线观看| 91丝袜呻吟高潮美腿白嫩在线观看| 国产乱国产乱300精品| 欧美色网一区二区| 亚洲欧洲精品一区二区三区 | 夜夜嗨av一区二区三区四季av| 欧美日韩一级二级三级| 国产精品自拍三区| 久久精品99国产精品| 亚洲在线观看免费| 亚洲特级片在线| 久久久精品日韩欧美| 91精品国产91久久综合桃花| 欧美日本一区二区三区| 欧美在线综合视频| 91黄色激情网站| 91麻豆精东视频| 91丨九色丨蝌蚪富婆spa| 国产成人综合在线| 久久99久国产精品黄毛片色诱| 日日噜噜夜夜狠狠视频欧美人| 一区二区三区蜜桃| 亚洲在线视频一区| 亚洲国产美女搞黄色| 亚洲va韩国va欧美va精品| 亚洲激情男女视频| 亚洲欧美日韩在线| 亚洲色欲色欲www在线观看| 中文字幕一区二区三区在线播放| 欧美体内she精高潮| 麻豆国产欧美一区二区三区| 欧美日韩日日夜夜| 国产精品久久午夜夜伦鲁鲁| 一区二区三区精品| 国产精品看片你懂得| 欧美老人xxxx18| 日韩一区二区影院| 日韩美女在线视频| 精品国产髙清在线看国产毛片| 久久综合999| 日本一区二区成人在线| 亚洲人成网站色在线观看| 亚洲综合视频网| 蜜臀av一区二区在线免费观看 | 日韩欧美一级特黄在线播放| 精品国产青草久久久久福利| √…a在线天堂一区| 天堂精品中文字幕在线| 国产盗摄一区二区| 欧美日韩亚州综合| 国产欧美日韩一区二区三区在线观看| 中文字幕日本不卡| 精品在线播放午夜| 亚洲国产精品久久人人爱蜜臀| 国产日韩欧美精品综合| 欧美性受极品xxxx喷水| 欧美少妇bbb| 欧美亚日韩国产aⅴ精品中极品| 91福利国产成人精品照片| 日本午夜一本久久久综合| 麻豆国产欧美一区二区三区| 视频在线在亚洲| 26uuu久久天堂性欧美| 午夜av一区二区| 欧美国产欧美综合| 不卡的av电影| 精品少妇一区二区三区在线播放 | 99久久精品免费看| 2020日本不卡一区二区视频| 亚洲福利一区二区三区| 99免费精品在线观看| 久久久久久电影| 免费观看在线色综合| 欧美老女人第四色| 亚洲一区二区中文在线| 一本久道久久综合中文字幕| 欧美激情一区在线观看| 国产99久久精品| 久久精品人人做人人爽97| 老司机一区二区| 精品国产乱码久久久久久蜜臀| 男男gaygay亚洲| 日韩欧美一级精品久久| 久久99精品国产.久久久久久| 成人精品视频一区二区三区 | 国产伦精品一区二区三区免费| 又紧又大又爽精品一区二区| 欧美精品一区在线观看| 欧美日韩国产综合久久| 欧美四级电影在线观看| 91久久精品网| 欧美日韩国产一二三| 欧美日韩精品电影| 精品婷婷伊人一区三区三| 欧美肥胖老妇做爰| 成人18视频在线播放| 欧美激情一区二区在线| 在线观看亚洲一区| 91精品在线免费观看| 久久精品国产秦先生| 欧美人伦禁忌dvd放荡欲情| 成人网页在线观看| 欧美视频中文一区二区三区在线观看 | 五月综合激情日本mⅴ| 欧美剧情片在线观看| 激情另类小说区图片区视频区| 亚洲精品一区二区三区蜜桃下载 | 婷婷中文字幕一区三区| 久久色在线视频| 色婷婷av一区二区三区软件 | 亚洲少妇最新在线视频| 欧美一区二区三区视频免费| 国产成人午夜片在线观看高清观看| 中文字幕精品综合| 欧美日韩夫妻久久| 99久久精品情趣| 日韩不卡手机在线v区| 国产精品看片你懂得| 日韩欧美成人午夜| 欧美探花视频资源| 国产成人免费xxxxxxxx| 免费成人在线观看视频| 国产精品久久久久久户外露出| 欧美成人精品高清在线播放| 欧美日韩精品福利| 色婷婷久久久久swag精品| 国产成人在线影院| 免费在线观看精品| 亚洲成人激情社区| 亚洲欧美经典视频| 国产精品久久久久久久久免费相片| 51精品秘密在线观看| 欧美日韩精品欧美日韩精品一 | 蜜桃视频一区二区三区在线观看| 亚洲欧美日韩国产手机在线| 国产亚洲女人久久久久毛片| 日韩精品中文字幕在线一区| 91精品国产综合久久久蜜臀图片| 日本韩国一区二区三区视频| 91美女片黄在线观看91美女| 成人一区二区三区中文字幕| 国产精品99久久久久久久vr| 极品美女销魂一区二区三区免费| 日本中文字幕一区二区视频| 日日夜夜免费精品| 日韩中文字幕av电影| 日韩二区在线观看| 美女一区二区三区在线观看| 麻豆91小视频| 精品一区二区在线视频| 精品无码三级在线观看视频| 久久99久久久久久久久久久| 精一区二区三区| 国产丶欧美丶日本不卡视频| 97久久超碰国产精品| 欧美性受xxxx黑人xyx| 欧美一级片在线看| 日本一区二区三区免费乱视频| 亚洲视频香蕉人妖| 亚洲福利国产精品| 国产一区久久久| 欧洲av一区二区嗯嗯嗯啊| 欧美一区二区视频观看视频| 久久日一线二线三线suv| 国产女主播一区| 亚洲视频免费观看| 日本在线不卡视频| 91麻豆产精品久久久久久| 在线不卡一区二区| 亚洲欧洲精品一区二区精品久久久|