mockingbird - ΡΠ΅ΡΠ²ΠΈΡ ΡΠΌΡΠ»ΡΡΠΈΠΈ REST-ΡΠ΅ΡΠ²ΠΈΡΠΎΠ² ΠΈ ΡΠ΅ΡΠ²ΠΈΡΠΎΠ² Ρ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ°ΠΌΠΈ-ΠΎΡΠ΅ΡΠ΅Π΄ΡΠΌΠΈ
Π ΡΠΊΠΎΠ²ΠΎΠ΄ΡΡΠ²ΠΎ ΠΏΠΎ ΠΈΠ½ΡΡΠ°Π»Π»ΡΡΠΈΠΈ
Π ΡΠΊΠΎΠ²ΠΎΠ΄ΡΡΠ²ΠΎ ΠΏΠΎ Π½Π°ΡΡΡΠΎΠΉΠΊΠ΅
Π Π°Π±ΠΎΡΠ° Ρ ΠΎΡΠ΅ΡΠ΅Π΄ΡΠΌΠΈ
mockingbird ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅Ρ ΡΠ»Π΅Π΄ΡΡΡΠΈΠ΅ ΡΡΠ΅Π½Π°ΡΠΈΠΈ:
- ΠΏΡΠΎΠ³ΠΎΠ½ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΠΎΠ³ΠΎ ΠΊΠ΅ΠΉΡΠ° Ρ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΡΠΌ Π½Π°Π±ΠΎΡΠΎΠΌ ΡΠΎΠ±ΡΡΠΈΠΉ ΠΈ HTTP/GRPC ΠΎΡΠ²Π΅ΡΠΎΠ²
- ΠΏΠΎΡΡΠΎΡΠ½Π½Π°Ρ ΠΈΠΌΠΈΡΠ°ΡΠΈΡ happy-path Π΄Π»Ρ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠ΅Π½ΠΈΡ Π°Π²ΡΠΎΠ½ΠΎΠΌΠ½ΠΎΡΡΠΈ ΠΊΠΎΠ½ΡΡΡΠ°(ΠΎΠ²)
Π’ΠΈΠΏΡ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΉ:
- countdown - Π°Π²ΡΠΎΠ½ΠΎΠΌΠ½ΡΠ΅ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ Π΄Π»Ρ ΡΠ΅ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΠΎΠ³ΠΎ ΡΡΠ΅Π½Π°ΡΠΈΡ. ΠΠΌΠ΅ΡΡ Π½Π°ΠΈΠ²ΡΡΡΠΈΠΉ ΠΏΡΠΈΠΎΡΠΈΡΠ΅Ρ ΠΏΡΠΈ ΡΠ°Π·ΡΠ΅ΡΠ΅Π½ΠΈΠΈ Π½Π΅ΠΎΠ΄Π½ΠΎΠ·Π½Π°ΡΠ½ΠΎΡΡΠ΅ΠΉ. ΠΠ°ΠΆΠ΄ΡΠΉ ΠΌΠΎΠΊ ΡΡΠ°Π±Π°ΡΡΠ²Π°Π΅Ρ n ΡΠ°Π· (ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ Π·Π°Π΄Π°ΡΡΡΡ ΠΏΡΠΈ ΡΠΎΠ·Π΄Π°Π½ΠΈΠΈ). ΠΠ²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ ΡΠ΄Π°Π»ΡΡΡΡΡ Π² ΠΏΠΎΠ»Π½ΠΎΡΡ.
- ephemeral - ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ, Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ ΡΠ΄Π°Π»ΡΠ΅ΠΌΡΠ΅ Π² ΠΏΠΎΠ»Π½ΠΎΡΡ. ΠΡΠ»ΠΈ ΠΎΠ΄Π½ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎ Π²ΡΠ·ΡΠ²Π°ΡΡ ΠΌΠ΅ΡΠΎΠ΄/ΠΏΡΠΈΡ ΠΎΠ΄ΠΈΡ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅, Π΄Π»Ρ ΠΊΠΎΡΠΎΡΠΎΠ³ΠΎ ΠΏΠΎΠ΄Ρ ΠΎΠ΄ΠΈΡ countdown ΠΈ ephemeral ΠΌΠΎΠΊΠΈ - ΡΡΠ°Π±ΠΎΡΠ°Π΅Ρ countdown.
- persistent - ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ, ΠΏΡΠ΅Π΄Π½Π°Π·Π½Π°ΡΠ΅Π½Π°Ρ Π΄Π»Ρ ΠΏΠΎΡΡΠΎΡΠ½Π½ΠΎΠΉ ΡΠ°Π±ΠΎΡΡ. ΠΠΌΠ΅Π΅Ρ Π½Π°ΠΈΠΌΠ΅Π½ΡΡΠΈΠΉ ΠΏΡΠΈΠΎΡΠΈΡΠ΅Ρ
ΠΡΠΈΠΌΠ΅Ρ Π½Π΅Π±ΠΎΠ»ΡΡΠΎΠ³ΠΎ ΠΊΠ΅ΠΉΡΠ° (ΠΊΠΎΡΠΎΡΠΊΠ°Ρ Π·Π°ΡΠ²ΠΊΠ°) - Π² ΠΊΠΎΠ½ΡΠ΅ ΡΠΏΠ΅ΡΠΈΡΠΈΠΊΠ°ΡΠΈΠΈ
ΠΠ»Ρ ΡΠΏΠΎΡΡΠ΄ΠΎΡΠ΅Π½ΠΈΡ ΠΌΠΎΠΊΠΎΠ² Π² UI ΠΈ ΠΌΠΈΠ½ΠΈΠΌΠΈΠ·Π°ΡΠΈΠΈ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²Π° ΠΊΠΎΠ½ΡΠ»ΠΈΠΊΡΠ½ΡΡ ΡΠΈΡΡΠ°ΡΠΈΠΉ Π² mockingbird ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Ρ Ρ.Π½. ΡΠ΅ΡΠ²ΠΈΡΡ. ΠΠ°ΠΆΠ΄ΡΠΉ ΠΌΠΎΠΊ (ΠΊΠ°ΠΊ HTTP ΡΠ°ΠΊ ΠΈ ΡΡΠ΅Π½Π°ΡΠΈΠΉ) Π²ΡΠ΅Π³Π΄Π° ΠΏΡΠΈΠ½Π°Π΄Π»Π΅ΠΆΠΈΡ ΠΊ ΠΊΠ°ΠΊΠΎΠΌΡ-ΡΠΎ ΠΈΠ· ΡΠ΅ΡΠ²ΠΈΡΠΎΠΌ. Π‘Π΅ΡΠ²ΠΈΡΡ ΡΠΎΠ·Π΄Π°ΡΡΡΡ Π·Π°ΡΠ°Π½Π΅Π΅ ΠΈ Ρ ΡΠ°Π½ΡΡΡΡ Π² Π±Π°Π·Π΅. Π‘Π΅ΡΠ²ΠΈΡ ΠΈΠΌΠ΅Π΅Ρ suffix (ΡΠ²Π»ΡΡΡΠΈΠΉΡΡ ΠΏΠΎ ΡΠΎΠ²ΠΌΠ΅ΡΡΠΈΡΠ΅Π»ΡΡΡΠ²Ρ ΡΠ½ΠΈΠΊΠ°Π»ΡΠ½ΡΠΌ id ΡΠ΅ΡΠ²ΠΈΡΠ°) ΠΈ ΡΠ΅Π»ΠΎΠ²Π΅ΠΊΠΎΡΠΈΡΠ°Π΅ΠΌΡΠΉ name.
ΠΠ»Ρ Π΄ΠΎΡΡΠΈΠΆΠ΅Π½ΠΈΡ Π³ΠΈΠ±ΠΊΠΎΡΡΠΈ ΠΏΡΠΈ ΡΠΎΡ ΡΠ°Π½Π΅Π½ΠΈΠΈ ΠΎΡΠ½ΠΎΡΠΈΡΠ΅Π»ΡΠ½ΠΎΠΉ ΠΏΡΠΎΡΡΠΎΡΡ ΠΊΠΎΠ½ΡΠΈΠ³ΠΎΠ² Π² ΡΠ΅ΡΠ²ΠΈΡΠ΅ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½ JSON ΡΠ°Π±Π»ΠΎΠ½ΠΈΠ·Π°ΡΠΎΡ. ΠΠ»Ρ Π½Π°ΡΠ°Π»Π° ΠΏΡΠΎΡΡΠΎΠΉ ΠΏΡΠΈΠΌΠ΅Ρ:
Π¨Π°Π±Π»ΠΎΠ½:
{
"description": "${description}",
"topic": "${extras.topic}",
"comment": "${extras.comments.[0].text}",
"meta": {
"field1": "${extras.fields.[0]}"
}
}
ΠΠ½Π°ΡΠ΅Π½ΠΈΡ Π΄Π»Ρ ΠΏΠΎΠ΄ΡΡΠ°Π½ΠΎΠ²ΠΊΠΈ:
{
"description": "Some description",
"extras": {
"fields": ["f1", "f2"],
"topic": "Main topic",
"comments": [
{"text": "First nah!"}, {"text": "Okay"}
]
}
}
Π Π΅Π·ΡΠ»ΡΡΠ°Ρ:
{
"description": "Some description",
"topic": "Main topic",
"comment": "First nah!",
"meta": {
"field1": "f1"
}
}
Π Π΄Π°Π½Π½ΡΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅ΡΡΡ ΡΠ»Π΅Π΄ΡΡΡΠΈΠΉ ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡ:
${a.[0].b}
- ΠΏΠΎΠ΄ΡΡΠ°Π½ΠΎΠ²ΠΊΠ° Π·Π½Π°ΡΠ΅Π½ΠΈΡ (JSON)${/a/b/c}
- ΠΏΠΎΠ΄ΡΡΠ°Π½ΠΎΠ²ΠΊΠ° Π·Π½Π°ΡΠ΅Π½ΠΈΡ (XPath)
ΠΠΠΠΠΠΠΠ! ΠΠ ΠΠ‘ΠΠΠΠ¬ΠΠ£ΠΠ’Π ΠΠΠΠΠ‘ΠΠΠΠ‘Π« Π XPATH ΠΠ«Π ΠΠΠΠΠΠ―Π₯
Π¨Π°Π±Π»ΠΎΠ½:
<root>
<tag1>${/r/t1}</tag1>
<tag2 a2="${/r/t2/@a2}">${/r/t2}</tag2>
</root>
ΠΠ½Π°ΡΠ΅Π½ΠΈΡ Π΄Π»Ρ ΠΏΠΎΠ΄ΡΡΠ°Π½ΠΎΠ²ΠΊΠΈ:
<r>
<t1>test</t1>
<t2 a2="attr2">42</t2>
</r>
Π Π΅Π·ΡΠ»ΡΡΠ°Ρ:
<root>
<tag1>test</tag1>
<tag2 a2="attr2">42</tag2>
</root>
ΠΠ»Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠΈ ΡΠ»ΠΎΠΆΠ½ΡΡ ΡΡΠ΅Π½Π°ΡΠΈΠ΅Π² ΡΠ΅ΡΠ²ΠΈΡ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅Ρ ΡΠΎΡ ΡΠ°Π½Π΅Π½ΠΈΠ΅ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ»ΡΠ½ΡΡ ΡΠΎΡΡΠΎΡΠ½ΠΈΠΉ. Π‘ΠΎΡΡΠΎΡΠ½ΠΈΠ΅ - Π΄ΠΎΠΊΡΠΌΠ΅Π½Ρ Ρ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ»ΡΠ½ΠΎΠΉ ΡΡ Π΅ΠΌΠΎΠΉ, ΡΠ΅Ρ Π½ΠΈΡΠ΅ΡΠΊΠΈ ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅ - Π΄ΠΎΠΊΡΠΌΠ΅Π½Ρ Π² mongodb. ΠΠ°ΠΏΠΈΡΡ Π½ΠΎΠ²ΡΡ ΡΠΎΡΡΠΎΡΠ½ΠΈΠΉ ΠΌΠΎΠΆΠ΅Ρ ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡΡ:
- ΠΏΡΠΈ Π·Π°ΠΏΠΈΡΠΈ Π² state (ΡΠ΅ΠΊΡΠΈΡ persist) Ρ ΠΏΡΡΡΡΠΌ (ΠΈΠ»ΠΈ ΠΎΡΡΡΡΡΡΠ²ΡΡΡΠΈΠΌ) ΠΏΡΠ΅Π΄ΠΈΠΊΠ°ΡΠΎΠΌ (ΡΠ΅ΠΊΡΠΈΡ state)
State Π°ΠΊΠΊΡΠΌΡΠ»ΡΡΠΈΠ²Π½ΠΎ Π΄ΠΎΠΏΠΈΡΡΠ²Π°Π΅ΡΡΡ. Π Π°Π·ΡΠ΅ΡΠ΅Π½ΠΎ ΠΏΠ΅ΡΠ΅ΠΏΠΈΡΡΠ²Π°Π½ΠΈΠ΅ ΠΏΠΎΠ»Π΅ΠΉ.
ΠΠΎΠ»Ρ, ΠΏΠΎ ΠΊΠΎΡΠΎΡΡΠΌ Π±ΡΠ΄Π΅ΠΌ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΡΡΡ ΠΏΠΎΠΈΡΠΊ (ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΠ΅ Π² ΠΏΡΠ΅Π΄ΠΈΠΊΠ°ΡΠ°Ρ ) Π΄ΠΎΠ»ΠΆΠ½Ρ Π½Π°ΡΠΈΠ½Π°ΡΡΡΡ Ρ "_".
Π΄Π»Ρ ΡΠ°ΠΊΠΈΡ ΠΏΠΎΠ»Π΅ΠΉ Π±ΡΠ΄Π΅Ρ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ ΡΠΎΠ·Π΄Π°Π²Π°ΡΡΡΡ sparse ΠΈΠ½Π΄Π΅ΠΊΡ
ΠΡΠ΅ΡΠΈΠΊΡΡ:
seed
- Π·Π½Π°ΡΠ΅Π½ΠΈΡ ΠΈΠ· Π±Π»ΠΎΠΊΠ° seed (ΡΠ°Π½Π΄ΠΎΠΌΠΈΠ·ΠΈΡΡΠ΅ΠΌΡΠ΅ Π½Π° ΡΡΠ°ΡΡΠ΅ Π·Π°ΡΠ²ΠΊΠΈ)state
- ΡΠ΅ΠΊΡΡΠΈΠΉ statereq
- ΡΠ΅Π»ΠΎ Π·Π°ΠΏΡΠΎΡΠ° (ΡΠ΅ΠΆΠΈΠΌΡ json, jlens, xpath)message
- ΡΠ΅Π»ΠΎ ΡΠΎΠ±ΡΠ΅Π½ΠΈΡ (Π² ΡΡΠ΅Π½Π°ΡΠΈΡΡ )query
- query ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ (Π² Π·Π°Π³Π»ΡΡΠΊΠ°Ρ )pathParts
- Π·Π½Π°ΡΠ΅Π½ΠΈΡ, ΠΈΠ·Π²Π»Π΅ΠΊΠ°Π΅ΠΌΡΠ΅ ΠΈΠ· URL (Π² Π·Π°Π³Π»ΡΡΠΊΠ°Ρ ) ΡΠΌ.ΠΠΊΡΡΡΠ°ΡΠΈΡ Π΄Π°Π½Π½ΡΡ ΠΈΠ· URL
extracted
- ΠΈΠ·Π²Π»Π΅ΡΡΠ½Π½ΡΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΡheaders
- HTTP Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΈ
{
"a": "ΠΡΠΎΡΡΠΎ ΡΡΡΠΎΠΊΠ°", //Π ΠΏΠΎΠ»Π΅ "a" Π·Π°ΠΏΠΈΡΡΠ²Π°Π΅ΡΡΡ ΠΊΠΎΠ½ΡΡΠ°Π½ΡΠ° (ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ Π»ΡΠ±ΠΎΠ΅ JSON Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅)
"b": "${req.fieldB}", //Π ΠΏΠΎΠ»Π΅ "b" Π·Π°ΠΏΠΈΡΡΠ²Π°Π΅ΡΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΠΈΠ· ΠΏΠΎΠ»Ρ fieldB Π·Π°ΠΏΡΠΎΡΠ°
"c": "${state.c}", //Π ΠΏΠΎΠ»Π΅ "c" Π·Π°ΠΏΠΈΡΡΠ²Π°Π΅ΡΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΠΈΠ· ΠΏΠΎΠ»Ρ "c" ΡΠ΅ΠΊΡΡΠ΅Π³ΠΎ ΡΠΎΡΡΠΎΡΠ½ΠΈΡ
"d": "${req.fieldA}: ${state.a}" //Π ΠΏΠΎΠ»Π΅ d Π·Π°ΠΏΠΈΡΠ΅ΡΡΡ ΡΡΡΠΎΠΊΠ°, ΡΠΎΠ΄Π΅ΡΠΆΠ°ΡΠ°Ρ req.fieldA ΠΈ state.a
}
ΠΡΠ΅Π΄ΠΈΠΊΠ°ΡΡ Π΄Π»Ρ ΠΏΠΎΠΈΡΠΊΠ° state ΠΏΠ΅ΡΠ΅ΡΠΈΡΠ»ΡΡΡΡΡ Π² Π±Π»ΠΎΠΊΠ΅ state
. ΠΡΡΡΠΎΠΉ ΠΎΠ±ΡΠ΅ΠΊΡ ({}
) Π² ΠΏΠΎΠ»Π΅ state Π½Π΅Π΄ΠΎΠΏΡΡΡΠΈΠΌ.
ΠΠ»Ρ ΠΏΠΎΠΈΡΠΊΠ° state ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π΄Π°Π½Π½ΡΠ΅ Π·Π°ΠΏΡΠΎΡΠ° (Π±Π΅Π· ΠΏΡΠ΅ΡΠΈΠΊΡΠ°), query ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ (ΠΏΡΠ΅ΡΠΈΠΊΡ __query
), Π·Π½Π°ΡΠ΅Π½ΠΈΡ, ΠΈΠ·Π²Π»Π΅ΠΊΠ°Π΅ΠΌΡΠ΅ ΠΈΠ· URL (ΠΏΡΠ΅ΡΠΈΠΊΡ __segments
) ΠΈ HTTP Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΈ (ΠΏΡΠ΅ΡΠΈΠΊΡ __headers
)
ΠΡΠΈΠΌΠ΅Ρ:
{
"_a": "${fieldB}", //ΠΏΠΎΠ»Π΅ ΠΈΠ· ΡΠ΅Π»Π° Π·Π°ΠΏΡΠΎΡΠ°
"_b": "${__query.arg1}", //query ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ
"_c": "${__segments.id}", //ΡΠ΅Π³ΠΌΠ΅Π½Ρ URL, ΡΠΌ. `ΠΠΊΡΡΡΠ°ΡΠΈΡ Π΄Π°Π½Π½ΡΡ
ΠΈΠ· URL`
"_d": "${__headers.Accept}" //HTTP Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ
}
ΠΠ½ΠΎΠ³Π΄Π° Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎΡΡΡ ΡΠ³Π΅Π½Π΅ΡΠΈΡΠΎΠ²Π°ΡΡ ΡΠ»ΡΡΠ°ΠΉΠ½ΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΠΈ ΡΠΎΡ ΡΠ°Π½ΠΈΡΡ ΠΈ/ΠΈΠ»ΠΈ Π²Π΅ΡΠ½ΡΡΡ Π΅Π³ΠΎ Π² ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠ΅ ΡΠ°Π±ΠΎΡΡ ΠΌΠΎΠΊΠ°. ΠΠ»Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠΈ ΡΠ°ΠΊΠΈΡ ΡΡΠ΅Π½Π°ΡΠΈΠ΅Π² ΡΠ΄Π΅Π»Π°Π½ΠΎ ΠΏΠΎΠ»Π΅ seed, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡΡΠ΅Π΅ Π·Π°Π΄Π°ΡΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅, ΠΊΠΎΡΠΎΡΡΠ΅ Π±ΡΠ΄ΡΡ ΡΠ³Π΅Π½Π΅ΡΠΈΡΠΎΠ²Π°Π½Ρ ΠΏΡΠΈ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΠΌΠΎΠΊΠ°. ΠΡΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΠΈΠ·Π±Π΅ΠΆΠ°ΡΡ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎΡΡΠΈ ΠΏΠ΅ΡΠ΅ΡΠΎΠ·Π΄Π°Π²Π°ΡΡ ΠΌΠΎΠΊΠΈ Ρ Π·Π°Ρ Π°ΡΠ΄ΠΊΠΎΠΆΠ΅Π½ΡΠΌΠΈ id
Π seed'Π°Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅ΡΡΡ ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡ ΠΏΡΠ΅Π²Π΄ΠΎΡΡΠ½ΠΊΡΠΈΠΉ:
%{randomString(n)}
- ΠΏΠΎΠ΄ΡΡΠ°Π½ΠΎΠ²ΠΊΠ° ΡΠ»ΡΡΠ°ΠΉΠ½ΠΎΠΉ ΡΡΡΠΎΠΊΠΈ Π΄Π»ΠΈΠ½ΠΎΠΉ n%{randomString("ABCDEF1234567890", m, n)}
- ΠΏΠΎΠ΄ΡΡΠ°Π½ΠΎΠ²ΠΊΠ° ΡΠ»ΡΡΠ°ΠΉΠ½ΠΎΠΉ ΡΡΡΠΎΠΊΠΈ, ΡΠΎΡΡΠΎΡΡΠ΅ΠΉ ΠΈΠ· ΡΠΈΠΌΠ²ΠΎΠ»ΠΎΠ²ABCDEF1234567890
Π΄Π»ΠΈΠ½ΠΎΠΉ Π² ΠΈΠ½ΡΠ΅ΡΠ²Π°Π»Π΅ [m, n)%{randomNumericString(n)}
- ΠΏΠΎΠ΄ΡΡΠ°Π½ΠΎΠ²ΠΊΠ° ΡΠ»ΡΡΠ°ΠΉΠ½ΠΎΠΉ ΡΡΡΠΎΠΊΠΈ, ΡΠΎΡΡΠΎΡΡΠ΅ΠΉ ΡΠΎΠ»ΡΠΊΠΎ ΠΈΠ· ΡΠΈΡΡ, Π΄Π»ΠΈΠ½ΠΎΠΉ n%{randomInt(n)}
- ΠΏΠΎΠ΄ΡΡΠ°Π½ΠΎΠ²ΠΊΠ° ΡΠ»ΡΡΠ°ΠΉΠ½ΠΎΠ³ΠΎ Int Π² Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π΅ [0, n)%{randomInt(m,n)}
- ΠΏΠΎΠ΄ΡΡΠ°Π½ΠΎΠ²ΠΊΠ° ΡΠ»ΡΡΠ°ΠΉΠ½ΠΎΠ³ΠΎ Int Π² Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π΅ [m, n)%{randomLong(n)}
- ΠΏΠΎΠ΄ΡΡΠ°Π½ΠΎΠ²ΠΊΠ° ΡΠ»ΡΡΠ°ΠΉΠ½ΠΎΠ³ΠΎ Long Π² Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π΅ [0, n)%{randomLong(m,n)}
- ΠΏΠΎΠ΄ΡΡΠ°Π½ΠΎΠ²ΠΊΠ° ΡΠ»ΡΡΠ°ΠΉΠ½ΠΎΠ³ΠΎ Long Π² Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π΅ [m, n)%{UUID}
- ΠΏΠΎΠ΄ΡΡΠ°Π½ΠΎΠ²ΠΊΠ° ΡΠ»ΡΡΠ°ΠΉΠ½ΠΎΠ³ΠΎ UUID%{now(yyyy-MM-dd'T'HH:mm:ss)}
- ΡΠ΅ΠΊΡΡΠ΅Π΅ Π²ΡΠ΅ΠΌΡ Π² Π·Π°Π΄Π°Π½Π½ΠΎΠΌ ΡΠΎΡΠΌΠ°ΡΠ΅%{today(yyyy-MM-dd)}
- ΡΠ΅ΠΊΡΡΠ°Ρ Π΄Π°ΡΠ° Π² Π·Π°Π΄Π°Π½Π½ΠΎΠΌ ΡΠΎΡΠΌΠ°ΡΠ΅
ΠΠΎΠΆΠ½ΠΎ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΡΡ ΡΡΡΠΎΠΊΠΈ ΡΠΎ ΡΠ»ΠΎΠΆΠ½ΡΠΌ ΡΠΎΡΠΌΠ°ΡΠΎΠΌ: %{randomInt(10)}: %{randomLong(10)} | %{randomString(12)}
, ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°ΡΡΡΡ Π²ΡΠ΅ ΠΏΡΠ΅Π²Π΄ΠΎΡΡΠ½ΠΊΡΠΈΠΈ ΠΈΠ· ΡΠΏΠΈΡΠΊΠ° Π²ΡΡΠ΅
ΠΠ°ΠΉΠ΄Π΅Π½ΡΠ΅ Π·Π°Π³Π»ΡΡΠΊΠΈ - ΠΊΠ°Π½Π΄ΠΈΠ΄Π°ΡΡ, ΠΎΡΡΠ°Π²ΡΠΈΠ΅ΡΡ ΠΏΠΎΡΠ»Π΅ Π²Π°Π»ΠΈΠ΄Π°ΡΠΈΠΈ URL, Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΎΠ² ΠΈ ΡΠ΅Π»Π° Π·Π°ΠΏΡΠΎΡΠ° ΠΠ°ΠΉΠ΄Π΅Π½ΡΠ΅ ΡΡΠ΅Π½Π°ΡΠΈΠΈ - ΠΊΠ°Π½Π΄ΠΈΠ΄Π°ΡΡ, ΠΎΡΡΠ°Π²ΡΠΈΠ΅ΡΡ ΠΏΠΎΡΠ»Π΅ Π²Π°Π»ΠΈΠ΄Π°ΡΠΈΠΈ ΡΠ΅Π»Π° ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ
ΠΠ°ΠΉΠ΄Π΅Π½ΡΠ΅ Π·Π°Π³Π»ΡΡΠΊΠΈ (ΡΡΠ΅Π½Π°ΡΠΈΠΈ) | Π’ΡΠ΅Π±ΡΠ΅ΡΡΡ ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅ | ΠΠ°ΠΉΠ΄Π΅Π½ΠΎ ΡΠΎΡΡΠΎΡΠ½ΠΈΠΉ | Π Π΅Π·ΡΠ»ΡΡΠ°Ρ |
---|---|---|---|
β1 | Π½Π΅Ρ | - | Π‘ΡΠ°Π±ΠΎΡΠ°Π΅Ρ β1 |
β1 | Π΄Π° | 0 | ΠΡΠΈΠ±ΠΊΠ° |
β1 | Π΄Π° | 1 | Π‘ΡΠ°Π±ΠΎΡΠ°Π΅Ρ β1 |
β1 β2 |
Π½Π΅Ρ Π½Π΅Ρ |
- | ΠΡΠΈΠ±ΠΊΠ° |
β1 β2 |
Π½Π΅Ρ Π΄Π° |
- 0 |
Π‘ΡΠ°Π±ΠΎΡΠ°Π΅Ρ β1 |
β1 β2 |
Π½Π΅Ρ Π΄Π° |
- 1 |
Π‘ΡΠ°Π±ΠΎΡΠ°Π΅Ρ β2 |
β1 β2 |
Π½Π΅Ρ Π΄Π° |
- 2 (ΠΈ Π±ΠΎΠ»Π΅Π΅) |
ΠΡΠΈΠ±ΠΊΠ° |
β1 β2 |
Π΄Π° Π΄Π° |
0 0 |
ΠΡΠΈΠ±ΠΊΠ° |
β1 β2 |
Π΄Π° Π΄Π° |
0 1 |
Π‘ΡΠ°Π±ΠΎΡΠ°Π΅Ρ β2 |
β1 β2 |
Π΄Π° Π΄Π° |
0 2 (ΠΈ Π±ΠΎΠ»Π΅Π΅) |
ΠΡΠΈΠ±ΠΊΠ° |
β1 β2 |
Π΄Π° Π΄Π° |
1 1 (ΠΈ Π±ΠΎΠ»Π΅Π΅) |
ΠΡΠΈΠ±ΠΊΠ° |
β1 β2 β3 |
Π΄Π° Π΄Π° Π΄Π° |
0 1 0 |
Π‘ΡΠ°Π±ΠΎΡΠ°Π΅Ρ β2 |
β1 β2 β3 |
Π΄Π° Π΄Π° Π΄Π° |
0 1 1 |
ΠΡΠΈΠ±ΠΊΠ° |
β1 β2 β3 |
Π΄Π° Π΄Π° Π΄Π° |
0 2 0 |
ΠΡΠΈΠ±ΠΊΠ° |
ΠΠ»Π³ΠΎΡΠΈΡΠΌ ΡΠ°Π±ΠΎΡΡ:
- ΠΠΎΠΈΡΠΊ ΠΌΠΎΠΊΠ° ΠΏΠΎ URL/HTTP-verb/Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΎΠ²
- ΠΠ°Π»ΠΈΠ΄Π°ΡΠΈΡ body
- ΠΠΎΠΈΡΠΊ state ΠΏΠΎ ΠΏΡΠ΅Π΄ΠΈΠΊΠ°ΡΡ
- ΠΠΎΠ΄ΡΡΠ°Π½ΠΎΠ²ΠΊΠ° Π·Π½Π°ΡΠ΅Π½ΠΈΠΉ Π² ΡΠ°Π±Π»ΠΎΠ½ ΠΎΡΠ²Π΅ΡΠ°
- ΠΠΎΠ΄ΠΈΡΠΈΠΊΠ°ΡΠΈΡ state
- ΠΡΠ΄Π°ΡΠ° response
HTTP Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΈ Π²Π°Π»ΠΈΠ΄ΠΈΡΡΡΡΡΡ Π½Π° ΠΏΠΎΠ»Π½ΠΎΠ΅ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΠΈΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠΉ, Π»ΠΈΡΠ½ΠΈΠ΅ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΈ Π½Π΅ ΡΠ²Π»ΡΡΡΡΡ ΠΎΡΠΈΠ±ΠΊΠΎΠΉ
ΠΠ°Π»ΠΈΠ΄Π°ΡΠΈΡ ΡΠ΅Π»Π° Π·Π°ΠΏΡΠΎΡΡ Π² HTTP Π·Π°Π³Π»ΡΡΠΊΠ°Ρ ΠΌΠΎΠΆΠ΅Ρ ΡΠ°Π±ΠΎΡΠ°ΡΡ Π² ΡΠ»Π΅Π΄ΡΡΡΠΈΡ ΡΠ΅ΠΆΠΈΠΌΠ°Ρ :
- no_body - Π·Π°ΠΏΡΠΎΡ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±ΡΡΡ Π±Π΅Π· ΡΠ΅Π»Π°
- any_body - ΡΠ΅Π»ΠΎ Π·Π°ΠΏΡΠΎΡΠ° Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±ΡΡΡ Π½Π΅ ΠΏΡΡΡΡΠΌ, ΠΏΡΠΈ ΡΡΠΎΠΌ Π½ΠΈΠΊΠ°ΠΊ Π½Π΅ ΠΏΠ°ΡΡΠΈΡΡΡ ΠΈ Π½Π΅ ΠΏΡΠΎΠ²Π΅ΡΡΠ΅ΡΡΡ
- raw - ΡΠ΅Π»ΠΎ Π·Π°ΠΏΡΠΎΡΠ° Π½ΠΈΠΊΠ°ΠΊ Π½Π΅ ΠΏΠ°ΡΡΠΈΡΡΡ ΠΈ ΠΏΡΠΎΠ²Π΅ΡΡΠ΅ΡΡΡ Π½Π° ΠΏΠΎΠ»Π½ΠΎΠ΅ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΠΈΠ΅ Ρ ΡΠΎΠ΄Π΅ΡΠΆΠΈΠΌΡΠΌ request.body
- json - ΡΠ΅Π»ΠΎ Π·Π°ΠΏΡΠΎΡΠ° Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±ΡΡΡ Π²Π°Π»ΠΈΠ΄Π½ΡΠΌ JSON'ΠΎΠΌ ΠΈ ΠΏΡΠΎΠ²Π΅ΡΡΠ΅ΡΡΡ Π½Π° ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΠΈΠ΅ Ρ ΡΠΎΠ΄Π΅ΡΠΆΠΈΠΌΡΠΌ request.body
- xml - ΡΠ΅Π»ΠΎ Π·Π°ΠΏΡΠΎΡΠ° Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±ΡΡΡ Π²Π°Π»ΠΈΠ΄Π½ΡΠΌ XML ΠΈ ΠΏΡΠΎΠ²Π΅ΡΡΠ΅ΡΡΡ Π½Π° ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΠΈΠ΅ Ρ ΡΠΎΠ΄Π΅ΡΠΆΠΈΠΌΡΠΌ request.body
- jlens - ΡΠ΅Π»ΠΎ Π·Π°ΠΏΡΠΎΡΠ° Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±ΡΡΡ Π²Π°Π»ΠΈΠ΄Π½ΡΠΌ JSON'ΠΎΠΌ ΠΈ Π²Π°Π»ΠΈΠ΄ΠΈΡΡΠ΅ΡΡΡ ΠΏΠΎ ΡΡΠ»ΠΎΠ²ΠΈΡΠΌ, ΠΎΠΏΠΈΡΠ°Π½ΡΠΌ Π² request.body
- xpath - ΡΠ΅Π»ΠΎ Π·Π°ΠΏΡΠΎΡΠ° Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±ΡΡΡ Π²Π°Π»ΠΈΠ΄Π½ΡΠΌ XML ΠΈ Π²Π°Π»ΠΈΠ΄ΠΈΡΡΠ΅ΡΡΡ ΠΏΠΎ ΡΡΠ»ΠΎΠ²ΠΈΡΠΌ, ΠΎΠΏΠΈΡΠ°Π½ΡΠΌ Π² request.body
- web_form - ΡΠ΅Π»ΠΎ Π·Π°ΠΏΡΠΎΡΠ° Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±ΡΡΡ Π² ΡΠΎΡΠΌΠ°ΡΠ΅ x-www-form-urlencoded ΠΈ Π²Π°Π»ΠΈΠ΄ΠΈΡΡΠ΅ΡΡΡ ΠΏΠΎ ΡΡΠ»ΠΎΠ²ΠΈΡΠΌ, ΠΎΠΏΠΈΡΠ°Π½ΡΠΌ Π² request.body
- multipart - ΡΠ΅Π»ΠΎ Π·Π°ΠΏΡΠΎΡΠ° Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±ΡΡΡ Π² ΡΠΎΡΠΌΠ°ΡΠ΅ multipart/form-data. ΠΡΠ°Π²ΠΈΠ»Π° Π²Π°Π»ΠΈΠ΄Π°ΡΠΈΠΈ ΡΠ°ΡΡΠ΅ΠΉ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠΈΡΡΡΡΡΡ ΠΈΠ½Π΄ΠΈΠ²ΠΈΠ΄ΡΠ°Π»ΡΠ½ΠΎ (ΡΠΌ. ΡΠ°Π·Π΄Π΅Π» Π½ΠΈΠΆΠ΅)
ΠΠΠΠΠΠΠΠ! multipart Π·Π°ΠΏΡΠΎΡΡ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ Π²ΡΠΏΠΎΠ»Π½ΡΡΡ Π½Π° ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΠΉ ΠΌΠ΅ΡΠΎΠ΄ - /api/mockingbird/execmp
ΠΠ»Ρ ΠΎΡΠ²Π΅ΡΠΎΠ² ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°ΡΡΡΡ ΡΠ»Π΅Π΄ΡΡΡΠΈΠ΅ ΡΠ΅ΠΆΠΈΠΌΡ:
- raw
- json
- xml
- binary
- proxy
- json-proxy
- xml-proxy
Π Π΅ΠΆΠΈΠΌΡ request ΠΈ response ΠΏΠΎΠ»Π½ΠΎΡΡΡΡ Π½Π΅Π·Π°Π²ΠΈΡΠΈΠΌΡ Π΄ΡΡΠ³ ΠΎΡ Π΄ΡΡΠ³Π° (ΠΌΠΎΠΆΠ½ΠΎ ΡΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠΈΡΠΎΠ²Π°ΡΡ ΠΎΡΠ²Π΅Ρ xml'Π΅ΠΌ Π½Π° json Π·Π°ΠΏΡΠΎΡ ΠΏΡΠΈ ΠΆΠ΅Π»Π°Π½ΠΈΠΈ, ΠΊΡΠΎΠΌΠ΅ ΡΠ΅ΠΆΠΈΠΌΠΎΠ² json-proxy ΠΈ xml-proxy)
Π ΠΏΠΎΠ»Π΅ delay ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΡ ΠΊΠΎΡΡΠ΅ΠΊΡΠ½ΡΠΉ FiniteDuration Π½Π΅ Π΄ΠΎΠ»ΡΡΠ΅ 30 ΡΠ΅ΠΊΡΠ½Π΄
ΠΡΠ²Π°Π΅Ρ, ΡΡΠΎ URL ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ ΠΊΠ°ΠΊΠΎΠΉ-Π½ΠΈΠ±ΡΠ΄Ρ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡ Π½Π΅ ΠΊΠ°ΠΊ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ, Π° ΠΊΠ°ΠΊ Π½Π΅ΠΏΠΎΡΡΠ΅Π΄ΡΡΠ²Π΅Π½Π½ΠΎ ΡΠ°ΡΡΡ ΠΏΡΡΠΈ. Π ΡΠ°ΠΊΠΈΡ ΡΠ»ΡΡΠ°ΡΡ ΡΡΠ°Π½ΠΎΠ²ΠΈΡΡΡ Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΡΠΌ ΠΎΠΏΠΈΡΠ°ΡΡ persistent Π·Π°Π³Π»ΡΡΠΊΡ ΠΈΠ·-Π·Π° Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ ΠΏΠΎΠ»Π½ΠΎΠ³ΠΎ ΡΠΎΠ²ΠΏΠ°Π΄Π΅Π½ΠΈΡ ΠΏΡΡΠΈ. ΠΠ° ΠΏΠΎΠΌΠΎΡΡ ΠΏΡΠΈΡ ΠΎΠ΄ΠΈΡ ΠΏΠΎΠ»Π΅ pathPattern, Π² ΠΊΠΎΡΠΎΡΠΎΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΡ ΡΠ΅Π³ΡΠ»ΡΡΠΊΡ, Π½Π° ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΠΈΠ΅ ΠΊΠΎΡΠΎΡΠΎΠΉ Π±ΡΠ΄Π΅Ρ ΠΏΡΠΎΠ²Π΅ΡΡΡΡΡΡ ΠΏΡΡΡ. ΠΡΠΌΠ΅ΡΡ, ΡΡΠΎ Ρ ΠΎΡΡ ΡΠΎΠΏΠΎΡΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ ΠΈ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΡΡ Π² ΠΌΠΎΠ½Π³Π΅ ΡΡΡΠ΅ΠΊΡΠΈΠ²Π½ΡΠΌ ΡΠΏΠΎΡΠΎΠ±ΠΎΠΌ, Π·Π»ΠΎΡΠΏΠΎΡΡΠ΅Π±ΡΡΡ ΡΡΠΎΠΉ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡΡ Π½Π΅ ΡΡΠΎΠΈΡ ΠΈ ΠΏΡΠΈ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ ΡΠΎΠΏΠΎΡΡΠ°Π²Π»Π΅Π½ΠΈΡ ΠΏΠΎ ΠΏΠΎΠ»Π½ΠΎΠΌΡ ΡΠΎΠ²ΠΏΠ°Π΄Π΅Π½ΠΈΡ Π½Π΅ ΡΠ»Π΅Π΄ΡΠ΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ pathPattern
ΠΡΠΈΠΌΠ΅Ρ:
{
"name": "Sample stub",
"scope": "persistent",
"pathPattern": "/pattern/(?<id>\d+)",
"method": "GET",
"request": {
"headers": {},
"mode": "no_body",
"body": {}
},
"response": {
"code": 200,
"mode": "json",
"headers": {"Content-Type": "application/json"},
"body": {"id": "${pathParts.id}"}
}
}
Π’ΠΎ, ΡΡΠΎ Π½ΡΠΆΠ½ΠΎ ΠΈΠ·Π²Π»Π΅ΡΡ ΠΈΠ· ΠΏΡΡΠΈ, Π½ΡΠΆΠ½ΠΎ Π΄Π΅Π»Π°ΡΡ ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½ΠΎΠΉ Π³ΡΡΠΏΠΏΠΎΠΉ, Π³ΡΡΠΏΠΏ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΠ³ΠΎΠ΄Π½ΠΎ, Π²ΠΏΠΎΡΠ»Π΅Π΄ΡΡΠ²ΠΈΠΈ Π½Π° Π½ΠΈΡ
ΠΌΠΎΠΆΠ½ΠΎ ΡΡΡΠ»Π°ΡΡΡΡ ΡΠ΅ΡΠ΅Π· pathParts.<ΠΈΠΌΡ_Π³ΡΡΠΏΠΏΡ>
Π Π½Π΅ΠΊΠΎΡΠΎΡΡΡ ΡΠ»ΡΡΠ°ΡΡ Π½ΡΠΆΠ½ΠΎ ΠΏΠΎΠ΄ΡΡΠ°Π²ΠΈΡΡ Π² ΠΎΡΠ²Π΅Ρ Π΄Π°Π½Π½ΡΠ΅, ΠΊΠΎΡΠΎΡΡΠ΅ Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ ΠΈΠ·Π²Π»Π΅ΡΡ ΠΏΡΠΎΡΡΡΠΌΠΈ ΡΡΠ΅Π΄ΡΡΠ²Π°ΠΌΠΈ. ΠΠ»Ρ ΡΡΠΈΡ ΡΠ΅Π»Π΅ΠΉ Π±ΡΠ»ΠΈ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Ρ ΡΠΊΡΡΡΠ°ΠΊΡΠΎΡΡ
ΠΠΎΡΡΠ°ΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΡ ΠΈΠ· XML, Π»Π΅ΠΆΠ°ΡΠ΅Π³ΠΎ Π² CDATA
ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ:
{
"type": "xcdata",
"prefix": "/root/inner/tag", //ΠΡΡΡ Π΄ΠΎ ΡΡΠ³Π° Ρ CDATA
"path": "/path/to" //ΠΡΡΡ Π΄ΠΎ Π½ΡΠΆΠ½ΠΎΠ³ΠΎ ΡΡΠ³Π°
}
ΠΠΎΡΡΠ°ΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΡ ΠΈΠ· JSON, Π»Π΅ΠΆΠ°ΡΠ΅Π³ΠΎ Π² CDATA
ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ:
{
"type": "jcdata",
"prefix": "/root/inner/tag", //ΠΡΡΡ Π΄ΠΎ ΡΡΠ³Π° Ρ CDATA
"path": "path.to" //ΠΡΡΡ Π΄ΠΎ Π½ΡΠΆΠ½ΠΎΠ³ΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΡ
}
ΠΠ½ΠΎΠ³Π΄Π° ΠΏΡΠΈΡ
ΠΎΠ΄ΠΈΡΡΡ ΠΈΠΌΠ΅ΡΡ Π΄Π΅Π»ΠΎ Ρ Π·Π°ΠΏΡΠΎΡΠ°ΠΌΠΈ, Π² ΠΊΠΎΡΠΎΡΡΡ
Π²Π½ΡΡΡΠΈ CDATA Π»Π΅ΠΆΠΈΡ XML. Π ΡΠ°ΠΊΠΈΡ
ΡΠ»ΡΡΠ°ΡΡ
ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΈΠ½Π»Π°ΠΉΠ½ΠΈΡΡ ΡΠΎΠ΄Π΅ΡΠΆΠΈΠΌΠΎΠ΅ DATA Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠ° inlineCData
(ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅ΡΡΡ Π² xpath
ΠΈ xml
)
{
"name": "Sample stub",
"method": "POST",
"path": "/pos-loans/api/cl/get_partner_lead_info",
"state": {
// ΠΡΠ΅Π΄ΠΈΠΊΠ°ΡΡ
},
"request": {
"headers": {"Content-Type": "application/json"},
"mode": "json",
"body": {
"trace_id": "42",
"account_number": "228"
}
},
"persist": {
// ΠΠΎΠ΄ΠΈΡΠΈΠΊΠ°ΡΠΈΠΈ ΡΠΎΡΡΠΎΡΠ½ΠΈΡ
},
"response": {
"code": 200,
"mode": "json",
"body": {
"code": 0,
"credit_amount": 802400,
"credit_term": 120,
"interest_rate": 13.9,
"partnum": "CL3.15"
},
"headers": {"Content-Type": "application/json"},
"delay": "1 second"
}
}
{
"name": "Sample stub",
"method": "POST",
"path": "/pos-loans/api/evil/soap/service"
"state": {
// ΠΡΠ΅Π΄ΠΈΠΊΠ°ΡΡ
},
"request": {
"headers": {"Content-Type": "application/xml"},
"mode": "raw"
"body": "<xml><request type=\"rqt\"></request></xml>"
},
"persist": {
// ΠΠΎΠ΄ΠΈΡΠΈΠΊΠ°ΡΠΈΠΈ ΡΠΎΡΡΠΎΡΠ½ΠΈΡ
},
"response": {
"code": 200,
"mode": "raw"
"body": "<xml><response type=\"rqt\"></response></xml>",
"headers": {"Content-Type": "application/xml"},
"delay": "1 second"
}
}
{
"name": "Sample stub",
"method": "POST",
"path": "/pos-loans/api/cl/get_partner_lead_info",
"state": {
// ΠΡΠ΅Π΄ΠΈΠΊΠ°ΡΡ
},
"request": {
"headers": {"Content-Type": "application/json"},
"mode": "jlens",
"body": {
"meta.id": {"==": 42}
}
},
"persist": {
// ΠΠΎΠ΄ΠΈΡΠΈΠΊΠ°ΡΠΈΠΈ ΡΠΎΡΡΠΎΡΠ½ΠΈΡ
},
"response": {
"code": 200,
"mode": "json",
"body": {
"code": 0,
"credit_amount": 802400,
"credit_term": 120,
"interest_rate": 13.9,
"partnum": "CL3.15"
},
"headers": {"Content-Type": "application/json"},
"delay": "1 second"
}
}
ΠΠΠΠΠΠΠΠ! ΠΠ ΠΠ‘ΠΠΠΠ¬ΠΠ£ΠΠ’Π ΠΠΠΠΠ‘ΠΠΠΠ‘Π« Π XPATH ΠΠ«Π ΠΠΠΠΠΠ―Π₯
{
"name": "Sample stub",
"method": "POST",
"path": "/pos-loans/api/cl/get_partner_lead_info",
"state": {
// ΠΡΠ΅Π΄ΠΈΠΊΠ°ΡΡ
},
"request": {
"headers": {"Content-Type": "application/xml"},
"mode": "xpath",
"body": {
"/payload/response/id": {"==": 42}
},
"extractors": {"name": {...}, ...} //ΠΎΠΏΡΠΈΠΎΠ½Π°Π»ΡΠ½ΠΎ
},
"persist": {
// ΠΠΎΠ΄ΠΈΡΠΈΠΊΠ°ΡΠΈΠΈ ΡΠΎΡΡΠΎΡΠ½ΠΈΡ
},
"response": {
"code": 200,
"mode": "raw"
"body": "<xml><response type=\"rst\"></response></xml>",
"headers": {"Content-Type": "application/xml"},
"delay": "1 second"
}
}
ΠΠΠΠΠΠΠΠ! multipart Π·Π°ΠΏΡΠΎΡΡ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ Π²ΡΠΏΠΎΠ»Π½ΡΡΡ Π½Π° ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΠΉ ΠΌΠ΅ΡΠΎΠ΄ - /api/mockingbird/execmp
Π Π΅ΠΆΠΈΠΌΡ Π²Π°Π»ΠΈΠ΄Π°Π½ΠΈΠΈ part:
any
- Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ Π½ΠΈΠΊΠ°ΠΊ Π½Π΅ Π²Π°Π»ΠΈΠ΄ΠΈΡΡΠ΅ΡΡΡraw
- ΠΏΠΎΠ»Π½ΠΎΠ΅ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΠΈΠ΅json
- ΠΏΠΎΠ»Π½ΠΎΠ΅ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΠΈΠ΅, Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΠΏΠ°ΡΡΠΈΡΡΡ ΠΊΠ°ΠΊ Jsonxml
- ΠΏΠΎΠ»Π½ΠΎΠ΅ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΠΈΠ΅, Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΠΏΠ°ΡΡΠΈΡΡΡ ΠΊΠ°ΠΊ XMLurlencoded
- Π°Π½Π°Π»ΠΎΠ³ΠΈΡΠ½ΠΎ ΡΠ΅ΠΆΠΈΠΌΡweb_form
Π΄Π»Ρ Π²Π°Π»ΠΈΠ΄Π°ΡΠΈΠΈ Π²ΡΠ΅Π³ΠΎ ΡΠ΅Π»Π°jlens
- ΠΏΡΠΎΠ²Π΅ΡΠΊΠ° Json ΠΏΠΎ ΡΡΠ»ΠΎΠ²ΠΈΡΠΌxpath
- ΠΏΡΠΎΠ²Π΅ΡΠΊΠ° XML ΠΏΠΎ ΡΡΠ»ΠΎΠ²ΠΈΡΠΌ
{
"name": "Sample stub",
"method": "POST",
"path": "/test/multipart",
"state": {
// ΠΡΠ΅Π΄ΠΈΠΊΠ°ΡΡ
},
"request": {
"headers": {},
"mode": "multipart",
"body": {
"part1": {
"mode": "json", //ΡΠ΅ΠΆΠΈΠΌ Π²Π°Π»ΠΈΠ΄Π°ΡΠΈΠΈ
"headers": {}, //Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΈ part
"value": {} //ΡΠΏΠ΅ΡΠΈΡΠΈΠΊΠ°ΡΠΈΡ Π·Π½Π°ΡΠ΅Π½ΠΈΡ Π΄Π»Ρ Π²Π°Π»ΠΈΠ΄Π°ΡΠΎΡΠ°
},
"part2": {
...
}
},
"bypassUnknownParts": true //ΡΠ»Π°Π³, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡΡΠΈΠΉ ΠΈΠ³Π½ΠΎΡΠΈΡΠΎΠ²Π°ΡΡ Π²ΡΠ΅ partΡ, ΠΎΡΡΡΡΠ²ΡΡΡΠΈΠ΅ Π² ΡΠΏΠ΅ΡΠΈΡΠΈΠΊΠ°ΡΠΈΠΈ Π²Π°Π»ΠΈΠ΄Π°ΡΠΎΡΠ°
//ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ ΡΠ»Π°Π³ Π²ΠΊΠ»ΡΡΠ΅Π½, ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠ΅ΡΠ΅Π΄Π°Π²Π°ΡΡ ΡΠΎΠ»ΡΠΊΠΎ Π΄Π»Ρ ΠΎΡΠΊΠ»ΡΡΠ΅Π½ΠΈΡ (false)
},
"persist": {
// ΠΠΎΠ΄ΠΈΡΠΈΠΊΠ°ΡΠΈΠΈ ΡΠΎΡΡΠΎΡΠ½ΠΈΡ
},
"response": {
"code": 200,
"mode": "json",
"body": {
"code": 0,
"credit_amount": 802400,
"credit_term": 120,
"interest_rate": 13.9,
"partnum": "CL3.15"
},
"headers": {"Content-Type": "application/json"},
"delay": "1 second"
}
}
{
"name": "Simple proxy",
"method": "POST",
"path": "/pos-loans/api/cl/get_partner_lead_info",
"state": {
// ΠΡΠ΅Π΄ΠΈΠΊΠ°ΡΡ
},
"request": {
// Π‘ΠΏΠ΅ΡΠΈΡΠΈΠΊΠ°ΡΠΈΡ Π·Π°ΠΏΡΠΎΡΠ°
},
"response": {
"mode": "proxy",
"uri": "http://some.host/api/cl/get_partner_lead_info"
}
}
{
"name": "Simple proxy",
"method": "POST",
"path": "/pos-loans/api/cl/get_partner_lead_info",
"state": {
// ΠΡΠ΅Π΄ΠΈΠΊΠ°ΡΡ
},
"request": {
// Π‘ΠΏΠ΅ΡΠΈΡΠΈΠΊΠ°ΡΠΈΡ Π·Π°ΠΏΡΠΎΡΠ°, mode json ΠΈΠ»ΠΈ jlens
},
"response": {
"mode": "json-proxy",
"uri": "http://some.host/api/cl/get_partner_lead_info",
"patch": {
"field.innerField": "${req.someRequestField}"
}
}
}
{
"name": "Simple proxy",
"method": "POST",
"path": "/pos-loans/api/cl/get_partner_lead_info",
"state": {
// ΠΡΠ΅Π΄ΠΈΠΊΠ°ΡΡ
},
"request": {
// Π‘ΠΏΠ΅ΡΠΈΡΠΈΠΊΠ°ΡΠΈΡ Π·Π°ΠΏΡΠΎΡΠ°, mode xml ΠΈΠ»ΠΈ xpath
},
"response": {
"mode": "xml-proxy",
"uri": "http://some.host/api/cl/get_partner_lead_info",
"patch": {
"/env/someTag": "${/some/requestTag}"
}
}
}
Π² ΡΠ΅ΠΆΠΈΠΌΠ°Ρ jlens ΠΈ xpath ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅ΡΡΡ ΡΠ»Π΅Π΄ΡΡΡΠ΅Π΅:
{
"a": {"==": "some value"}, //ΠΏΠΎΠ»Π½ΠΎΠ΅ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΠΈΠ΅
"b": {"!=": "some value"}, //Π½Π΅ ΡΠ°Π²Π½ΠΎ
"c": {">": 42} | {">=": 42} | {"<": 42} | {"<=": 42}, //ΡΡΠ°Π²Π½Π΅Π½ΠΈΡ, ΡΠΎΠ»ΡΠΊΠΎ Π΄Π»Ρ ΡΠΈΡΠ΅Π», ΠΊΠΎΠΌΠ±ΠΈΠ½ΠΈΡΡΡΡΡΡ
"d": {"~=": "\d+"}, //ΡΠΎΠΏΠΎΡΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ Ρ regexp,
"e": {"size": 10}, //Π΄Π»ΠΈΠ½Π°, Π΄Π»Ρ ΠΌΠ°ΡΡΠΈΠ²ΠΎΠ² ΠΈ ΡΡΡΠΎΠΊ
"f": {"exists": true} //ΠΏΡΠΎΠ²Π΅ΡΠΊΠ° ΡΡΡΠ΅ΡΡΠ²ΠΎΠ²Π°Π½ΠΈΡ
}
ΠΠ»ΡΡΠ°ΠΌΠΈ Π² ΡΠ°ΠΊΠΈΡ
ΠΎΠ±ΡΠ΅ΠΊΡΠ°Ρ
ΡΠ²Π»ΡΠ΅ΡΡΡ Π»ΠΈΠ±ΠΎ ΠΏΡΡΡ Π² json ("a.b.[0].c") Π»ΠΈΠ±ΠΎ xpath ("/a/b/c")
ΠΠ°ΠΌΠ΅ΡΠ°Π½ΠΈΠ΅: Π² Π΄Π°Π½Π½ΡΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ ΡΡΠ½ΠΊΡΠΈΠΈ ΡΡΠ°Π²Π½Π΅Π½ΠΈΡ ΠΌΠΎΠ³ΡΡ Π½Π΅ΠΊΠΎΡΡΠ΅ΠΊΡΠ½ΠΎ ΡΠ°Π±ΠΎΡΠ°ΡΡ Ρ xpath, ΡΠΊΠ°Π·ΡΠ²Π°ΡΡΠΈΠΌΠΈ Π½Π° XML Π°ΡΡΠΈΠ±ΡΡΡ.
ΠΠ±ΠΎΠΉΡΠΈ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΎΠΉ Π½Π° ΡΡΡΠ΅ΡΡΠ²ΠΎΠ²Π°Π½ΠΈΠ΅/Π½Π΅ΡΡΡΠ΅ΡΡΠ²ΠΎΠ²Π°Π½ΠΈΠ΅:
/tag/otherTag/[@attr='2']": {"exists": true}
Π² ΡΠ΅ΠΆΠΈΠΌΠ΅ jlens Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΠΎ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°ΡΡΡΡ ΡΠ»Π΅Π΄ΡΡΡΠΈΠ΅ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ:
{
"g": {"[_]": ["1", 2, true]}, //ΠΏΠΎΠ»Π΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΡΠΎΠ΄Π΅ΡΠΆΠ°ΡΡ ΠΎΠ΄Π½ΠΎ ΠΈΠ· ΠΏΠ΅ΡΠ΅ΡΠΈΡΠ»Π΅Π½ΡΡ
Π·Π½Π°ΡΠ΅Π½ΠΈΠΉ
"h": {"![_]": ["1", 2, true]}, //ΠΏΠΎΠ»Π΅ ΠΠ Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΡΠΎΠ΄Π΅ΡΠΆΠ°ΡΡ Π½ΠΈ ΠΎΠ΄Π½ΠΎ ΠΈΠ· ΠΏΠ΅ΡΠ΅ΡΠΈΡΠ»Π΅Π½ΡΡ
Π·Π½Π°Π΅ΡΠ½ΠΈΠΉ
"i": {"&[_]": ["1", 2, true]} // ΠΏΠΎΠ»Π΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±ΡΡΡ ΠΌΠ°ΡΡΠΈΠ²ΠΎΠΌ ΠΈ ΡΠΎΠ΄Π΅ΡΠΆΠ°ΡΡ Π²ΡΠ΅ ΠΏΠ΅ΡΠ΅ΡΠΈΡΠ»Π΅Π½Π½ΡΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΡ (ΠΏΡΠΈ ΡΡΠΎΠΌ ΠΏΠΎΡΡΠ΄ΠΎΠΊ Π½Π΅ Π²Π°ΠΆΠ΅Π½)
}
Π² ΡΠ΅ΠΆΠΈΠΌΠ΅ xpath Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΠΎ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°ΡΡΡΡ ΡΠ»Π΅Π΄ΡΡΡΠΈΠ΅ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ:
"/some/tag": {"cdata": {"==": "test"}}, //Π²Π°Π»ΠΈΠ΄Π°ΡΠΈΡ Π½Π° ΠΏΠΎΠ»Π½ΠΎΠ΅ ΡΠΎΠ²ΠΏΠ°Π΄Π΅Π½ΠΈΠ΅ CDATA, Π°ΡΠ³ΡΠΌΠ΅Π½Ρ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±ΡΡΡ Π‘Π’Π ΠΠΠΠ
"/some/tag": {"cdata": {"~=": "\d+"}}, //Π²Π°Π»ΠΈΠ΄Π°ΡΠΈΡ DATA ΡΠ΅Π³ΡΠ»ΡΡΠΊΠΎΠΉ, Π°ΡΠ³ΡΠΌΠ΅Π½Ρ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±ΡΡΡ Π‘Π’Π ΠΠΠΠ
"/some/tag": {"jcdata": {"a": {"==": 42}}}, //Π²Π°Π»ΠΈΠ΄ΠΈΡΡΠ΅ΠΌ ΡΠΎΠ΄Π΅ΡΠΆΠΈΠΌΠΎΠ΅ CDATA ΠΊΠ°ΠΊ JSON, ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°ΡΡΡΡ Π²ΡΠ΅ Π΄ΠΎΡΡΡΠΏΠ½ΡΠ΅ ΠΏΡΠ΅Π΄ΠΈΠΊΠ°ΡΡ
"/other/tag": {"xcdata": {"/b": {"==": 42}}} //Π²Π°Π»ΠΈΠ΄ΠΈΡΡΠ΅ΠΌ ΡΠΎΠ΄Π΅ΡΠΆΠΈΠΌΠΎΠ΅ CDATA ΠΊΠ°ΠΊ XML, ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°ΡΡΡΡ Π²ΡΠ΅ Π΄ΠΎΡΡΡΠΏΠ½ΡΠ΅ ΠΏΡΠ΅Π΄ΠΈΠΊΠ°ΡΡ
Π² ΡΠ΅ΠΆΠΈΠΌΠ΅ web_form ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°ΡΡΡΡ Π’ΠΠΠ¬ΠΠ ΡΠ»Π΅Π΄ΡΡΡΠΈΠ΅ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ:
==
, !=
, ~=
, size
, [_]
, ![_]
, &[_]
ΠΠ°ΠΊ ΡΡΠΎ ΡΡΡΡΠΎΠ΅Π½ΠΎ ΠΏΠΎΠ΄ ΠΊΠ°ΠΏΠΎΡΠΎΠΌ: ΠΡΠΈ ΡΠΎΠ·Π΄Π°Π½ΠΈΠΈ ΠΌΠΎΠΊΠ° Π²Π»ΠΎΠΆΠ΅Π½ΡΠ΅ Π² Π·Π°ΠΏΡΠΎΡ proto ΡΠ°ΠΉΠ»Ρ ΠΏΠ°ΡΡΡΡΡΡ ΠΈ ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΡΡΡΡΡ Π² json-ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ protobuf ΡΡ Π΅ΠΌΡ. Π Π±Π°Π·Π΅ Ρ ΡΠ°Π½ΠΈΡΡΡ ΠΈΠΌΠ΅Π½Π½ΠΎ json-ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΠ΅, Π° Π½Π΅ ΠΎΡΠΈΠ³ΠΈΠ½Π°Π»ΡΠ½ΡΠΉ proto ΡΠ°ΠΉΠ». ΠΠ΅ΡΠ²ΠΎΠ΅ ΡΡΠ°Π±Π°ΡΡΠ²Π°Π½ΠΈΠ΅ ΠΌΠΎΠΊΠ° ΠΌΠΎΠΆΠ΅Ρ Π·Π°Π½ΠΈΠΌΠ°ΡΡ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ Π±ΠΎΠ»ΡΡΠ΅ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ, ΡΠ΅ΠΌ ΠΏΠΎΡΠ»Π΅Π΄ΡΡΡΠΈΠ΅, Ρ.ΠΊ. ΠΏΡΠΈ ΠΏΠ΅ΡΠ²ΠΎΠΌ ΡΡΠ°Π±Π°ΡΡΠ²Π°Π½ΠΈΠΈ ΠΈΠ· json-ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΠ΅Π½ΠΈΡ Π³Π΅Π½Π΅ΡΠΈΡΡΠ΅ΡΡΡ Π΄Π΅ΠΊΠΎΠ΄Π΅Ρ protobuf ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ. ΠΠΎΡΠ»Π΅ Π΄Π΅ΠΊΠΎΠ΄ΠΈΡΠΎΠ²Π°Π½ΠΈΡ Π΄Π°Π½Π½ΡΠ΅ ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΡΡΡΡΡ Π² json, ΠΊΠΎΡΠΎΡΡΠΉ ΠΏΡΠΎΠ²Π΅ΡΡΠ΅ΡΡΡ json-ΠΏΡΠ΅Π΄ΠΈΠΊΠ°ΡΠ°ΠΌΠΈ, Π·Π°Π΄Π°Π½ΡΠΌΠΈ Π² ΠΏΠΎΠ»Π΅ requestPredicates. ΠΡΠ»ΠΈ ΡΡΠ»ΠΎΠ²ΠΈΡ Π²ΡΠΏΠΎΠ»Π½ΡΡΡΡΡ - ΡΠΎ json ΠΈΠ· response.data (Π² ΡΠ΅ΠΆΠΈΠΌΠ΅ fill) ΡΠ΅ΡΠΈΠ°Π»ΠΈΠ·ΡΠ΅ΡΡΡ Π² protobuf ΠΈ ΠΎΡΠ΄Π°ΡΡΡΡ Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΠΎΡΠ²Π΅ΡΠ°.
ΠΠ»Π³ΠΎΡΠΈΡΠΌ ΡΠ°Π±ΠΎΡΡ:
- ΠΠΎΠΈΡΠΊ ΠΌΠΎΠΊΠ°(-ΠΎΠ²) ΠΏΠΎ ΠΈΠΌΠ΅Π½ΠΈ ΠΌΠ΅ΡΠΎΠ΄Π°
- ΠΠ°Π»ΠΈΠ΄Π°ΡΠΈΡ body
- ΠΠΎΠΈΡΠΊ state ΠΏΠΎ ΠΏΡΠ΅Π΄ΠΈΠΊΠ°ΡΡ
- ΠΠΎΠ΄ΡΡΠ°Π½ΠΎΠ²ΠΊΠ° Π·Π½Π°ΡΠ΅Π½ΠΈΠΉ Π² ΡΠ°Π±Π»ΠΎΠ½ ΠΎΡΠ²Π΅ΡΠ°
- ΠΠΎΠ΄ΠΈΡΠΈΠΊΠ°ΡΠΈΡ state
- ΠΡΠ΄Π°ΡΠ° response
{
"name": "Sample stub",
"scope": "..",
"service": "test",
"methodName": "/pos-loans/api/cl/get_partner_lead_info",
"seed": {
"integrationId": "%{randomString(20)}" //ΠΏΡΠΈΠΌΠ΅Ρ
},
"state": {
// ΠΡΠ΅Π΄ΠΈΠΊΠ°ΡΡ
},
"requestCodecs": "..", //proto-ΡΠ°ΠΉΠ» ΡΡ
Π΅ΠΌΡ Π·Π°ΠΏΡΠΎΡΠ° Π² base64
"requestClass": "..", //ΠΈΠΌΡ ΡΠΈΠΏΠ° Π·Π°ΠΏΡΠΎΡΠ° ΠΈΠ· proto ΡΠ°ΠΉΠ»Π°
"responseCodecs": "..", //proto-ΡΠ°ΠΉΠ» ΡΡ
Π΅ΠΌΡ ΠΎΡΠ²Π΅ΡΠ° Π² base64
"responseClass": "..", //ΠΈΠΌΡ ΡΠΈΠΏΠ° ΠΎΡΠ²Π΅ΡΠ° ΠΈΠ· proto ΡΠ°ΠΉΠ»Π°
"requestPredicates": {
"meta.id": {"==": 42}
},
"persist": {
// ΠΠΎΠ΄ΠΈΡΠΈΠΊΠ°ΡΠΈΠΈ ΡΠΎΡΡΠΎΡΠ½ΠΈΡ
},
"response": {
"mode": "fill",
"data": {
"code": 0,
"credit_amount": 802400,
"credit_term": 120,
"interest_rate": 13.9,
"partnum": "CL3.15"
},
"delay": "1 second"
}
}
ΠΠ»Π³ΠΎΡΠΈΡΠΌ ΡΠ°Π±ΠΎΡΡ:
- ΠΠΎΠΈΡΠΊ ΠΌΠΎΠΊΠ° ΠΏΠΎ source
- ΠΠΎΠΈΡΠΊ state ΠΏΠΎ ΠΏΡΠ΅Π΄ΠΈΠΊΠ°ΡΡ
- ΠΠ°Π»ΠΈΠ΄Π°ΡΠΈΡ Π²Ρ ΠΎΠ΄ΡΡΠ΅Π³ΠΎ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ
- ΠΠΎΠ΄ΡΡΠ°Π½ΠΎΠ²ΠΊΠ° Π·Π½Π°ΡΠ΅Π½ΠΈΠΉ Π² ΡΠ°Π±Π»ΠΎΠ½ ΠΎΡΠ²Π΅ΡΠ°
- ΠΠΎΠ΄ΠΈΡΠΈΠΊΠ°ΡΠΈΡ state
- ΠΡΠΏΡΠ°Π²ΠΊΠ° response
- ΠΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΊΠΎΠ»Π±Π΅ΠΊΠΎΠ² (ΡΠΌ. ΡΠ°Π·Π΄Π΅Π» "ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ ΠΊΠΎΠ»Π±Π΅ΠΊΠΎΠ²")
Π Π°Π±ΠΎΡΠ° Ρ ΠΎΡΠ΅ΡΠ΅Π΄ΡΠΌΠΈ
ΠΠ»Ρ input ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°ΡΡΡΡ ΡΠ΅ΠΆΠΈΠΌΡ:
- raw
- json
- xml
- jlens
- xpath
ΠΠ»Ρ output ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°ΡΡΡΡ ΡΠ΅ΠΆΠΈΠΌΡ:
- raw
- json
- xml
{
"name": "ΠΡΠΈΡΠ»Π° Π²Π΅ΡΠ½Π°",
"service": "test",
"source": "rmq_example_autobroker_decision", //source ΠΈΠ· ΠΊΠΎΠ½ΡΠΈΠ³Π°
"input": {
"mode": .. //ΠΊΠ°ΠΊ Π΄Π»Ρ HTTP Π·Π°Π³Π»ΡΡΠ΅ΠΊ
"payload": .. //ΠΊΠ°ΠΊ body Π΄Π»Ρ HTTP Π·Π°Π³Π»ΡΡΠ΅ΠΊ
},
"state": {
// ΠΡΠ΅Π΄ΠΈΠΊΠ°ΡΡ
},
"persist": { //ΠΠΏΡΠΈΠΎΠ½Π°Π»ΡΠ½ΠΎ
// ΠΠΎΠ΄ΠΈΡΠΈΠΊΠ°ΡΠΈΠΈ ΡΠΎΡΡΠΎΡΠ½ΠΈΡ
},
"destination": "rmq_example_q1", // destination ΠΈΠ· ΠΊΠΎΠ½ΡΠΈΠ³Π°, ΠΎΠΏΡΠΈΠΎΠ½Π°Π»ΡΠ½ΠΎ
"output": { //ΠΠΏΡΠΈΠΎΠ½Π°Π»ΡΠ½ΠΎ
"mode": "raw",
"payload": "..",
"delay": "1 second"
},
"callback": { .. }
}
ΠΠ»Ρ ΠΈΠΌΠΈΡΠ°ΡΠΈΠΈ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΡ ΡΠ΅Π°Π»ΡΠ½ΠΎΠ³ΠΎ ΠΌΠΈΡΠ° ΠΈΠ½ΠΎΠ³Π΄Π° Π½ΡΠΆΠ½ΠΎ Π²ΡΠΏΠΎΠ»Π½ΠΈΡΡ Π²ΡΠ·ΠΎΠ² HTTP ΡΠ΅ΡΠ²ΠΈΡΠ° (ΠΏΡΠΈΠΌΠ΅Ρ - Π·Π°Π±ΡΠ°ΡΡ GBO ΠΊΠΎΠ³Π΄Π° ΠΏΡΠΈΡ ΠΎΠ΄ΠΈΡ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅) ΠΈΠ»ΠΈ ΠΎΡΠΏΡΠ°Π²Π»ΡΡΡ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΠ΅ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ Π² ΠΎΡΠ΅ΡΠ΅Π΄ΠΈ. ΠΠ»Ρ ΡΡΠΎΠ³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΊΠΎΠ»Π±Π΅ΠΊΠΈ. Π Π΅Π·ΡΠ»ΡΡΠ°Ρ Π²ΡΠ·ΠΎΠ²Π° ΡΠ΅ΡΠ²ΠΈΡΠ° ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡΠΈ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎΡΡΠΈ ΡΠ°ΡΠΏΠ°ΡΡΠΈΡΡ ΠΈ ΡΠΎΡ ΡΠ°Π½ΠΈΡΡ Π² ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅. ΠΠΎΠ»Π»Π±Π΅ΠΊΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡ ΡΠΎΡΡΡΠ½ΠΈΠ΅ Π²ΡΠ·Π²Π°Π²ΡΠ΅Π³ΠΎ.
ΠΠ»Ρ request ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°ΡΡΡΡ ΡΠ΅ΠΆΠΈΠΌΡ
- no_body
- raw
- json
- xml
ΠΠ»Ρ response ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°ΡΡΡΡ ΡΠ΅ΠΆΠΈΠΌΡ
- json
- xml
ΠΠ±ΡΠ°ΡΠΈΡΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅! Π Π²ΡΡ ΡΠ΅ΠΏΠΎΡΠΊΡ ΠΊΠΎΠ»Π±Π΅ΠΊΠΎΠ² ΠΏΠ΅ΡΠ΅Π΄Π°ΡΡΡΡ ΠΏΠ΅ΡΠ²ΠΎΠ½Π°ΡΠ°Π»ΡΠ½ΡΠΉ ΡΡΠ΅ΠΉΡ, ΠΎΠ½ Π½Π΅ ΠΈΠ·ΠΌΠ΅Π½ΡΠ΅ΡΡΡ Π±Π»ΠΎΠΊΠΎΠΌ perist (!!!)
{
"type": "http",
"request": {
"url": "http://some.host/api/v2/peka",
"method": "POST",
"headers": {"Content-Type": "application/json"},
"mode": "json",
"body": {
"trace_id": "42",
"account_number": "228"
}
},
"responseMode": "json" | "xml", //ΠΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΠΎ ΡΠΎΠ»ΡΠΊΠΎ ΠΏΡΠΈ Π½Π°Π»ΠΈΡΠΈΠΈ Π±Π»ΠΎΠΊΠ° persist
"persist": { //ΠΠΏΡΠΈΠΎΠ½Π°Π»ΡΠ½ΠΎ
// ΠΠΎΠ΄ΠΈΡΠΈΠΊΠ°ΡΠΈΠΈ ΡΠΎΡΡΠΎΡΠ½ΠΈΡ
},
"delay": "1 second", //ΠΠ°Π΄Π΅ΡΠΆΠΊΠ° ΠΠΠ ΠΠ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ΠΌ ΠΊΠΎΠ»Π±Π΅ΠΊΠ°, ΠΎΠΏΡΠΈΠΎΠ½Π°Π»ΡΠ½ΠΎ
"callback": { .. } //ΠΠΏΡΠΈΠΎΠ½Π°Π»ΡΠ½ΠΎ
}
ΠΠ»Ρ output ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°ΡΡΡΡ ΡΠ΅ΠΆΠΈΠΌΡ:
- raw
- json
- xml
{
"type": "message",
"destination": "rmq_example_q1", // destination ΠΈΠ· ΠΊΠΎΠ½ΡΠΈΠ³Π°
"output": {
"mode": "raw",
"payload": ".."
},
"callback": { .. } //ΠΠΏΡΠΈΠΎΠ½Π°Π»ΡΠ½ΠΎ
}