Pdef - рд╕рдВрдХрд▓рдХ рдФрд░ рд╡реЗрдм рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╡рд┐рд╡рд░рдг рднрд╛рд╖рд╛

рдкрд┐рдЫрд▓реЗ рд╕рд╛рд▓ рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ, рдореБрдЭреЗ рдЕрдкрдиреА рд╕реНрд╡рдпрдВ рдХреА рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рднрд╛рд╖рд╛ (IDL) рд▓рд┐рдЦрдиреЗ рдХрд╛ рд╡рд┐рдЪрд╛рд░ рдерд╛, рдЬреЛ рдХрд┐ рдкреНрд░реЛрдЯреЛрдмреБрдлрд╝ рдпрд╛ рдереНрд░рд┐рдлреНрдЯ рдХреЗ рд╕рдорд╛рди рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рд╡реЗрдм рдХреЗ рд▓рд┐рдП рдЕрднрд┐рдкреНрд░реЗрдд рд╣реЛрдЧрд╛ред рдореИрдВ рд▓рдЧрднрдЧ рддреАрди рдорд╣реАрдиреЗ рдореЗрдВ рдЗрд╕реЗ рдЦрддреНрдо рдХрд░рдиреЗ рдХреА рдЙрдореНрдореАрдж рдХрд░ рд░рд╣рд╛ рдерд╛ред рдкрд╣рд▓реЗ рд╕реНрдерд┐рд░ рд╕рдВрд╕реНрдХрд░рдг рд╕реЗ рдкрд╣рд▓реЗ рдПрдХ рд╡рд░реНрд╖ рд╕реЗ рдереЛрдбрд╝рд╛ рдЕрдзрд┐рдХ рд╕рдордп рдмреАрдд рдЪреБрдХрд╛ рд╣реИред

Pdef (рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдбреЗрдлрд┐рдирд┐рд╢рди рд▓реИрдВрдЧреНрд╡реЗрдЬ) рдПрдХ рд╕реНрдЯреЗрдЯрд╕ рдЯрд╛рдЗрдк рдХреА рдЧрдИ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрд╢рди рд▓реИрдВрдЧреНрд╡реЗрдЬ рд╣реИ рдЬреЛ JSON рдФрд░ HTTP RPC рдХреЛ рд╕рдкреЛрд░реНрдЯ рдХрд░рддреА рд╣реИред рдпрд╣ рдЖрдкрдХреЛ рдПрдХ рдмрд╛рд░ рдЗрдВрдЯрд░рдлреЗрд╕ рдФрд░ рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдФрд░ рдлрд┐рд░ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдХреЛрдб рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИред Pidef рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдПрдкреАрдЖрдИ, рдЖрдВрддрд░рд┐рдХ рд╕реЗрд╡рд╛рдУрдВ, рд╡рд┐рддрд░рд┐рдд рд╕рд┐рд╕реНрдЯрдо, рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рд╣реИ, рдбреЗрдЯрд╛, рдХреИрд╢ рдФрд░ рд╕рдВрджреЗрд╢ рдХрддрд╛рд░реЛрдВ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд░рд╛рд░реВрдк рдХреЗ рд░реВрдк рдореЗрдВред

рдореБрдЦреНрдп рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛:


рдЖрдкрдХреЛ Pidef рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреНрдпреЛрдВ рд╣реИ? рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╢реНрд░рдо рдЙрддреНрдкрд╛рджрдХрддрд╛ рдореЗрдВ рд╡реГрджреНрдзрд┐ рдФрд░ рдЧреНрд░рд╛рд╣рдХ-рд╕рд░реНрд╡рд░, рд╕реЗрд╡рд╛-рдЙрдиреНрдореБрдЦ рдФрд░ рд╡рд┐рддрд░рд┐рдд рдХреЛрдб рдХреЗ рд╡рд┐рдХрд╛рд╕ рдФрд░ рд╕рдорд░реНрдерди рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдирд╛ред рд▓реЗрдХрд┐рди рдпрд╣ рдПрдкреАрдЖрдИ рдкреНрд░рд▓реЗрдЦрди рдФрд░ рд╡рд┐рд╡рд░рдг рдХреЛ рднреА рдПрдХреАрдХреГрдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЖрдкрдХреЛ рд▓рдВрдмрд╡рдд рдПрдХреАрдХреГрдд рд╕рд┐рд╕реНрдЯрдо рдмрдирд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд╡реНрдпрдХреНрддрд┐рдЧрдд рдШрдЯрдХреЛрдВ рдХреЗ рдЗрдВрдЯрд░реИрдХреНрд╢рди рдХрд╛ рдУрд╡рд░рд╣реЗрдб рдХрдо рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред

рд╕рдВрджреЗрд╢ рд╡рд░реНрдгрди рдЙрджрд╛рд╣рд░рдг:
 message Human { id int64; name string; birthday datetime; sex Sex; continent ContinentName; } 

рдЙрдкрдпреЛрдЧ рдХреЗ рдЙрджрд╛рд╣рд░рдг ( рдЙрддреНрдкрдиреНрди рдХреЛрдб рдЙрджрд╛рд╣рд░рдг ):
Json
 { "id": 1, "name": "Ivan Korobkov", "birthday": "1987-08-07T00:00Z", "sex": "male", "continent": "europe" } 

рдЬрд╛рд╡рд╛
 Human human = new Human() .setId(1) .setName("John") .setSex(Sex.MALE) .setContinent(ContinentName.ASIA) String json = human.toJson(); Human another = Human.fromJson(json); 

рдЕрдЬрдЧрд░
 human = Human(id=1, name="John") human.birthday = datetime.datetime(1900, 1, 2) s = human.to_json() another = Human.from_json(s) 

рдСрдмреНрдЬреЗрдХреНрдЯрд┐рд╡-рд╕реА
 Human *human = [[Human alloc]init]; human.id = 1; human.name = @"John"; human.sex = Sex_MALE; human.continent = ContinentName_EUROPE; NSError *error = nil; NSData *data = [human toJsonError:&error]; Human *another = [Human messageWithData:data error:&error]; 


рд╕реНрдерд╛рдкрдирд╛

Pidef рдореЗрдВ рдПрдХ рдХрдВрдкрд╛рдЗрд▓рд░, рдкреНрд▓рдЧ-рдЗрди рдХреЛрдб рдЬрдирд░реЗрдЯрд░ рдФрд░ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рд╣реЛрддреЗ рд╣реИрдВред рд╕рдВрдХрд▓рдХ рдФрд░ рдХреЛрдб рдЬрдирд░реЗрдЯрд░ рдкрд╛рдпрдерди рдореЗрдВ рд▓рд┐рдЦреЗ рдЧрдП рд╣реИрдВред

рд╕рдВрдХрд▓рдХ рдХреЛ PyPI рдкреИрдХреЗрдЬ рдХреЗ рд░реВрдк рдореЗрдВ PyPI рдХреЗ рд╕рд╛рде рд╕рдВрд╕реНрдерд╛рдкрд┐рдд рдХрд░рдирд╛ :

 pip install pdef-compiler 

рдпрд╛ рдЖрдк рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЗ рд░рд┐рд▓реАрдЬрд╝ рдкреГрд╖реНрда рд╕реЗ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд╕рд╛рде рд╕рдВрдЧреНрд░рд╣ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЗрд╕реЗ рдЕрдирдЬрд╝рд┐рдк рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

 python setup.py install 

рдХреЛрдб рдЬрдирд░реЗрдЯрд░ рдХреА рд╕реНрдерд╛рдкрдирд╛ (рдбрд╛рдЙрдирд▓реЛрдб рд▓рд┐рдВрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рднрд╛рд╖рд╛рдУрдВ рдХреЗ рдкрдиреНрдиреЛрдВ рдкрд░ рд╣реИрдВ):

 pip install pdef-java pip install pdef-python pip install pdef-objc 

рд╕рдм рдХреБрдЫ, рд╕рдВрдХрд▓рдХ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реИред рдЖрдк рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рд╕рдм рдХреБрдЫ рд╕рд╣реА рддрд░реАрдХреЗ рд╕реЗ рд╕реНрдерд╛рдкрд┐рдд рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рдореНрди рдХрдорд╛рдВрдб рдЪрд▓рд╛ рд╕рдХрддреЗ рд╣реИрдВред рд╡рд╣ рдирдореВрдирд╛ рдкреИрдХреЗрдЬ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдЧреА рдФрд░ рдЙрд╕рдХреА рдЬрд╛рдВрдЪ рдХрд░реЗрдЧреАред

 pdefc -v check https://raw.github.com/pdef/pdef/master/example/world.yaml 

рд╕реНрдерд╛рдкрдирд╛ рдХреЗ рджреМрд░рд╛рди рдкреНрд░рддреНрдпреЗрдХ рдХреЛрдб рдЬрдирд░реЗрдЯрд░ рд╕рдВрдХрд▓рдХ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреА рдЦреБрдж рдХреА рдХрдорд╛рдВрдб рдЬреЛрдбрд╝рддрд╛ рд╣реИ, рдЖрдк рдЙрдиреНрд╣реЗрдВ рдорджрдж рдореЗрдВ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ:

 pdefc -h ... generate-python Python code generator. generate-objc Objective-C code generator. generate-java Java code generator. pdefc generate-python -h 


рдХреЗ рдЙрдкрдпреЛрдЧ

рдкреИрдХреЗрдЬ рдлрд╝рд╛рдЗрд▓ myproject.yaml рдмрдирд╛рдПрдБ:

 package: name: myproject modules: - posts - photos 

рдореЙрдбреНрдпреВрд▓ рдлрд╝рд╛рдЗрд▓реЗрдВ рдмрдирд╛рдПрдБ:

 //  posts.pdef namespace myproject; import myproject.photos; interface Posts { get(id int64) Post; @post create(title string @post, text string @post) Post; } message Post { id int64; title string; text string; photos list<Photo>; } 

 //  photos.pdef namespace myproject; message Photo { id int64; url string; } 

рдХреЛрдб рдкреАрдврд╝реА рдЪрд▓рд╛рдПрдВ:

 pdefc generate-java myproject.yaml --out generated-java/ pdefc generate-python myproject.yaml --out generated-python/ pdefc generate-objc myproject.yaml --out generated-objc/ 

рдХреЛрдб рдЬрдирд░реЗрдЯрд░ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛рдУрдВ рдХреЗ рд▓рд┐рдП Pidef рдореЙрдбреНрдпреВрд▓ рдФрд░ рдиреЗрдорд╕реНрдкреЗрд╕ рдХреА рдореИрдкрд┐рдВрдЧ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддреЗ рд╣реИрдВред рдЖрдк рдХрдорд╛рдВрдбреНрд╕ рдХреЗ рд╡рд┐рд╡рд░рдг рд╕реЗ рдЕрдзрд┐рдХ рдЬрд╛рди рд╕рдХрддреЗ рд╣реИрдВред


Pidef рдЧрд╛рдЗрдб 1.1


рд╡рд╛рдХреНрдп-рд╡рд┐рдиреНрдпрд╛рд╕


Pidef рдХрд╛ рд╕рд┐рдВрдЯреИрдХреНрд╕ Java / C ++ рдХреЗ рд╕рдорд╛рди рд╣реЛрддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдкреНрд░рдХрд╛рд░ рдФрд░ рдлрд╝реАрд▓реНрдб / рддрд░реНрдХ рдХрд╛ рдЙрд▓рдЯрд╛ рдХреНрд░рдо рд╣реЛрддрд╛ рд╣реИред рд╕рднреА рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛рдУрдВ рдХреЛ рдПрдХ рд▓реИрдЯрд┐рди рдЪрд░рд┐рддреНрд░ рд╕реЗ рд╢реБрд░реВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдЗрд╕рдореЗрдВ рдХреЗрд╡рд▓ рд▓реИрдЯрд┐рди рд╡рд░реНрдг, рд╕рдВрдЦреНрдпрд╛ рдФрд░ рдЕрдВрдбрд░рд╕реНрдХреЛрд░ рд╢рд╛рдорд┐рд▓ рд╣реИрдВред рд╡реНрдпрд╛рдХрд░рдг рд╡рд┐рд╡рд░рдг (BNF)ред

рдПрдХ рдЙрджрд╛рд╣рд░рдг:
 namespace example; interface MyInterface { method( arg0 int32, arg1 string ) list<string>; } message MyMessage { field0 int32; field1 string; } enum Number { ONE, TWO; } 


рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ


рджреЛ рдкреНрд░рдХрд╛рд░ рдХреА рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ рд╣реИрдВ: рдкреНрд░рд▓реЗрдЦрди рдХреЗ рд▓рд┐рдП рдПрдХрд▓-рд░реЗрдЦрд╛ рдФрд░ рдмрд╣реБ-рдкрдВрдХреНрддрд┐ред рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ рдореЙрдбреНрдпреВрд▓ рдХреА рдмрд╣реБрдд рд╢реБрд░реБрдЖрдд рдореЗрдВ рдЯрд╛рдЗрдк рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ (рд╕рдВрджреЗрд╢, рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдпрд╛ рдЧрдгрдирд╛) рд╕реЗ рдкрд╣рд▓реЗ рдпрд╛ рд╡рд┐рдзрд┐ рд╕реЗ рдкрд╣рд▓реЗ рд░рдЦреА рдЬрд╛ рд╕рдХрддреА рд╣реИрдВред рдПрдХрд▓-рдкрдВрдХреНрддрд┐ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЛ рдкрд╛рд░реНрд╕рд┐рдВрдЧ рдХреЗ рджреМрд░рд╛рди рдХрд╛рдЯ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдмрд╣реБ-рдкрдВрдХреНрддрд┐ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЛ рд╕рд╣реЗрдЬрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдкреНрд░рд▓реЗрдЦрди рдХреЗ рд▓рд┐рдП рдХреЛрдб рдЬрдирд░реЗрдЯрд░ рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

 /** * This is a multi-line module docstring. * It is a available to the code generators. * * Start each line with a star because it is used * as line whitespace/text delimiter when * the docstring is indented (as method docstrings). */ namespace example; // This is a one line comment, it is stripped from the source code. /** Interface docstring. */ interface ExampleInterface { /** * Method docstring. */ hello(name string) string; } 


рдкреИрдХреЗрдЬ рдФрд░ рдореЙрдбреНрдпреВрд▓


рд╕рдВрдХреБрд▓


Pidef рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рд╕рдВрдХреБрд▓ рдореЗрдВ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдкреНрд░рддреНрдпреЗрдХ рдкреИрдХреЗрдЬ рдХреЛ рдПрдХ yaml рдлрд╝рд╛рдЗрд▓ рджреНрд╡рд╛рд░рд╛ рд╡рд░реНрдгрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдкреИрдХреЗрдЬ рдХрд╛ рдирд╛рдо рд╣реЛрддрд╛ рд╣реИ рдФрд░ рдореЙрдбреНрдпреВрд▓ рдФрд░ рдирд┐рд░реНрднрд░рддрд╛ рдХреЛ рд╕реВрдЪреАрдмрджреНрдз рдХрд░рддрд╛ рд╣реИред рд╕рдВрдХреБрд▓ рдХреЗ рдмреАрдЪ рдЪрдХреНрд░реАрдп рдирд┐рд░реНрднрд░рддрд╛ рдирд┐рд╖рд┐рджреНрдз рд╣реИред рдореЙрдбреНрдпреВрд▓ рдирд╛рдо рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдлрд╝рд╛рдЗрд▓реЛрдВ рдореЗрдВ рдореИрдк рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЕрдВрдХ рдХреЛ рд╕рд┐рд╕реНрдЯрдо рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рд╡рд┐рднрд╛рдЬрдХ рд╕реЗ рдмрджрд▓ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ .pdef рдПрдХреНрд╕рдЯреЗрдВрд╢рди .pdef рдЬрд╛рддрд╛ .pdef ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, users.events users/events.pdef рд╕реЗ рдореЗрд▓ рдЦрд╛рддреА рд╣реИред рдирд┐рд░реНрднрд░рддрд╛рдПрдБ рдкреИрдХреЗрдЬ рдХреЗ рдирд╛рдо рдФрд░ рдПрдХ рд╕реНрдкреЗрд╕ рдХреЗ рд╕рд╛рде рдЗрд╕рдХреА yaml рдлрд╝рд╛рдЗрд▓ рдХреЗ рд▓рд┐рдП рд╡реИрдХрд▓реНрдкрд┐рдХ рдкрде рдХреЛ yaml рд╣реИрдВред рдХрдВрд╕реЛрд▓ рдХрдорд╛рдВрдбреНрд╕ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддреЗ рд╕рдордп рдирд┐рд░реНрднрд░рддрд╛ рдкрдереЛрдВ рдХреЛ рд╕реЗрдЯ рдФрд░ рдкреБрдирд░реНрдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдЙрджрд╛рд╣рд░рдг рдкреИрдХреЗрдЬ рдлрд╝рд╛рдЗрд▓:
 package: # Package name name: example # Additional information version: 1.1 url: https://github.com/pdef/pdef/ author: Ivan Korobkov <ivan.korobkov@gmail.com> description: Example application # Module files. modules: - example - photos - users - users.profile # Other packages this package depends on. dependencies: - common - pdef_test https://raw.github.com/pdef/pdef/1.1/test/test.yaml 

рдФрд░ рдЗрд╕рдХреА рдлрд╝рд╛рдЗрд▓ рд╕рдВрд░рдЪрдирд╛ ( api рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рд╡реИрдХрд▓реНрдкрд┐рдХ рд╣реИ):
 api/ example.yaml example.pdef photos.pdef users.pdef users/profile.pdef 


рдореЙрдбреНрдпреВрд▓ рдФрд░ рдирд╛рдо рд╕реНрдерд╛рди


рдПрдХ рдореЙрдбреНрдпреВрд▓ рд╕рдВрджреЗрд╢, рдЗрдВрдЯрд░рдлреЗрд╕ рдФрд░ рдЧрдгрдирд╛ рдХреЗ рд╡рд┐рд╡рд░рдг рдХреЗ рд╕рд╛рде рдПрдХ рдЕрд▓рдЧ *.pdef рдлрд╝рд╛рдЗрд▓ рд╣реИред рд╡реИрдХрд▓реНрдкрд┐рдХ рдкреНрд░рд▓реЗрдЦрди рдХреЗ рддреБрд░рдВрдд рдмрд╛рдж рдкреНрд░рддреНрдпреЗрдХ рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рдирд╛рдо рд╕реНрдерд╛рди рдХрд╛ рд╕рдВрдХреЗрдд рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдПрдХ рд╣реА рдирд╛рдорд╕реНрдерд╛рди рдХреЗ рд╕рднреА рдкреНрд░рдХрд╛рд░реЛрдВ рдореЗрдВ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдирд╛рдо рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдПред рд╡рд┐рднрд┐рдиреНрди рдкреИрдХреЗрдЬ рд╕рдорд╛рди рдирд╛рдорд╕реНрдерд╛рдиреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

Pidefa рдореЗрдВ рдирд╛рдорд╕реНрдерд╛рди рдЬрд╛рд╡рд╛ / C # / C ++ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рд╡реНрдпрд╛рдкрдХ рд╣реИрдВ, рдФрд░ рдпрд╣ рдлрд╝рд╛рдЗрд▓реЛрдВ рдФрд░ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛рдУрдВ рдХреА рд╕рдВрд░рдЪрдирд╛ рдХреЗ рдЕрдиреБрд░реВрдк рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдЙрддреНрддрд░рд╛рд░реНрджреНрдз рдХреЗ рд▓рд┐рдП, рдореЙрдбреНрдпреВрд▓ рдирд╛рдо рд╣реИрдВред рдЖрдорддреМрд░ рдкрд░, рдПрдХ рдпрд╛ рдЕрдзрд┐рдХ рдкреИрдХреЗрдЬ рдПрдХ рд╣реА рдирд╛рдо рд╕реНрдерд╛рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рд╕рдВрднрд╛рд╡рд┐рдд рдЙрджрд╛рд╣рд░рдг: twitter , github рдЖрджрд┐ред

 /** Module with a namespace. */ namespace myproject; message Hello { text string; } 


рдЖрдпрд╛рдд


рдЖрдпрд╛рдд рдЕрдиреНрдп рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ include рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдорд╛рди рд╣реИрдВ, рд╡реЗ рдПрдХ рдореЙрдбреНрдпреВрд▓ рдХреЛ рджреВрд╕рд░реЗ рдореЙрдбреНрдпреВрд▓ рд╕реЗ рдкреНрд░рдХрд╛рд░ рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВред рдореЙрдбреНрдпреВрд▓ рдирд╛рдо рд╕реНрдерд╛рди рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рддреБрд░рдВрдд рдмрд╛рдж рдЖрдпрд╛рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдореЙрдбреНрдпреВрд▓ .pdef рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреЗ рдмрд┐рдирд╛ рдкреИрдХреЗрдЬ рдирд╛рдо рдФрд░ рдлрд╝рд╛рдЗрд▓ рдкрде рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдореЙрдбреНрдпреВрд▓ рдЖрдпрд╛рдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ, рдПрдХ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рд╡рд┐рднрд╛рдЬрдХ рдХреЗ рдмрдЬрд╛рдп рдПрдХ рдбреЙрдЯ рдХреЗ рд╕рд╛рдеред рдЬрдм рдореЙрдбреНрдпреВрд▓ рдирд╛рдо рдкреИрдХреЗрдЬ рдирд╛рдо рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИ, рддреЛ рдореЙрдбреНрдпреВрд▓ рдХреЗрд╡рд▓ рдкреИрдХреЗрдЬ рдирд╛рдо рд╕реЗ рдЖрдпрд╛рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рд╡реНрдпрдХреНрддрд┐рдЧрдд рдЖрдпрд╛рдд:
 namespace example; import package; // Equivalent to "import package.package" when package/module names match. import package.module; 

рдмреИрдЪ рдЖрдпрд╛рдд:
 namespace example; from package.module import submodule0, submodule1; 


рд▓реВрдк рдЖрдпрд╛рдд рдФрд░ рдирд┐рд░реНрднрд░рддрд╛


рд▓реВрдк рдЖрдпрд╛рдд рддрдм рддрдХ рд╕рдВрднрд╡ рд╣реИ рдЬрдм рддрдХ рдХрд┐ рдПрдХ рдореЙрдбреНрдпреВрд▓ рдХреЗ рдкреНрд░рдХрд╛рд░ рджреВрд╕рд░реЗ рдореЙрдбреНрдпреВрд▓ рдХреЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдирд╣реАрдВ рд▓реЗрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрддред рдЕрдиреНрдпрдерд╛, рдЖрдк рдореЙрдбреНрдпреВрд▓ рдХреЛ рдЫреЛрдЯреЗ рд▓реЛрдЧреЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рдиреЗ рдпрд╛ рдЙрдиреНрд╣реЗрдВ рдПрдХ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╕рдВрдпреЛрдЬрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдмреАрдЪ рдЪрдХреНрд░реАрдп рдирд┐рд░реНрднрд░рддрд╛ рдХреА рдЕрдиреБрдорддрд┐ рд╣реИред

рдЕрдзрд┐рдХрд╛рдВрд╢ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛рдУрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕ рддрд░рд╣ рдХреЗ рдкреНрд░рддрд┐рдмрдВрдз рдкрд░реНрдпрд╛рдкреНрдд рд╣реИрдВред рд░реВрдмреА рдпрд╛ рдкрд╛рдпрдерди рдЬреИрд╕реА рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХреА рдЧрдИ рднрд╛рд╖рд╛рдУрдВ рдХрд╛ рднреА рд╕рдорд░реНрдерди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ Pidef рд╕рдВрдХрд▓рдХ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рд╡рдВрд╢рд╛рдиреБрдХреНрд░рдо рдХреЗ рджреМрд░рд╛рди рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рдПрдХ рд╕реНрдкрд╖реНрдЯ рдкреЗрдбрд╝-рдЬреИрд╕рд╛ рдирд┐рд╖реНрдкрд╛рджрди рдХрд╛ рдХреНрд░рдо рд╣реЛрдЧрд╛, рдЕрдиреНрдп рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдореЙрдбреНрдпреВрд▓ рдХреЛ рдХрд┐рд╕реА рднреА рдХреНрд░рдо рдореЗрдВ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЖрдк Pdef рдЬрдирд░реЗрдЯ рдФрд░ рднрд╛рд╖рд╛-рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХреЛрдб рдореЗрдВ рд╡рд┐рд╢рд┐рд╖реНрдЯ рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рдкрд░рд┐рдкрддреНрд░ рдирд┐рд░реНрднрд░рддрд╛ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВ

рдкрд░рд┐рдкрддреНрд░ рдЖрдпрд╛рдд рдФрд░ рдирд┐рд░реНрднрд░рддрд╛ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг:
 // users.pdef namespace example; from example import photos; // Circular import. message User { bestFriend User; // References a declaring type. photo Photo; // References a type from another module. } 

 // photos.pdef namespace example; from example import users; // Circular import. message Photo { user User; // References a user from another module. } 


рдирд╛рдо рдХрд╛ рд╕рдВрдХрд▓реНрдк


рдПрдХ рдирд╛рдорд╕реНрдерд╛рди рдХреЗ рднреАрддрд░, рдПрдХ рд╕реНрдерд╛рдиреАрдп рдкреНрд░рдХрд╛рд░ рдХреЗ рдирд╛рдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, MyMessage , рдЬрдмрдХрд┐ рдПрдХ рдЕрд▓рдЧ namespace.MyMessag рднреАрддрд░ namespace.MyMessag рдкреВрд░рд╛ рдирд╛рдо namespace.MyMessag ред MyMessage namespace.MyMessag ред


рдкреНрд░рдХрд╛рд░ рдкреНрд░рдгрд╛рд▓реА


Pidef рдореЗрдВ рдЗрдВрдЯрд░рдлреЗрд╕ рдФрд░ рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреЗ рдкреГрдердХреНрдХрд░рдг рдХреЗ рд╕рд┐рджреНрдзрд╛рдВрдд рдкрд░ рдирд┐рд░реНрдорд┐рдд рдПрдХ рд╕рд╛рдзрд╛рд░рдг рд╕реНрдереИрддрд┐рдХ рдкреНрд░рдХрд╛рд░ рдкреНрд░рдгрд╛рд▓реА рд╣реИред

рд╢реВрдиреНрдп


void рдПрдХ рд╡рд┐рд╢реЗрд╖ рдкреНрд░рдХрд╛рд░ рд╣реИ рдЬреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рд╡рд┐рдзрд┐ рдкрд░рд┐рдгрд╛рдо рдирд╣реАрдВ рд▓реМрдЯрд╛рддреА рд╣реИред

рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░


рдЖрджрд┐рдо рдкреНрд░рдХрд╛рд░



рдХрдВрдЯреЗрдирд░



 message Containers { numbers list<int32>; tweets list<Tweet>; ids set<int64>; colors set<Color>; userNames map<int64, string>; photos map<string, list<Photo>>; } 

рд╕реНрдерд╛рдирд╛рдВрддрд░рдг


рдПрдХ рдПрдиреНрдпреВрдорд░реЗрд╢рди рдЕрджреНрд╡рд┐рддреАрдп рд╕реНрдЯреНрд░рд┐рдВрдЧ рдорд╛рдиреЛрдВ рдХрд╛ рдПрдХ рд╕рдВрдЧреНрд░рд╣ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЧрдгрдирд╛ рдХреЗ рджреМрд░рд╛рди рд╡рд┐рднреЗрджрдХреЛрдВ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЧрдгрдирд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

 enum Sex { MALE, FEMALE; } enum EventType { USER_REGISTERED, USER_BANNED, PHOTO_UPLOADED, PHOTO_DELETED, MESSAGE_RECEIVED; } 

рд╕рдВрджреЗрд╢ рдФрд░ рдЕрдкрд╡рд╛рдж


рдПрдХ рд╕рдВрджреЗрд╢ (рдПрдирд╛рд▓реЙрдЧ рдЯреВ struct 'рдП) рд╕рд╛рдВрдЦреНрдпрд┐рдХреАрдп рд░реВрдк рд╕реЗ рдЯрд╛рдЗрдк рдХрд┐рдП рдЧрдП рдлрд╝реАрд▓реНрдб рдХрд╛ рдПрдХ рд╕рдВрдЧреНрд░рд╣ рд╣реИред рд╕рдВрджреЗрд╢ рд╕рд░рд▓ рдФрд░ рдмрд╣реБрд░реВрдкреА рд╡рд┐рд░рд╛рд╕рдд рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддреЗ рд╣реИрдВред рдЕрдкрд╡рд╛рдж рдХреЗ рд░реВрдк рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рд╕рдВрджреЗрд╢реЛрдВ рдХреЛ рдЕрдкрд╡рд╛рджреЛрдВ рдкрд░ рдЕрдкрд╡рд╛рджреЛрдВ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред



 /** Example message. */ message User { id int64; name string; age int32; profile Profile; friends set<User>; // Self-referencing. } /** Example exception. */ exception UserNotFound { userId int64; } 

рд╡рд┐рд░рд╛рд╕рдд


рд╡рдВрд╢рд╛рдиреБрдХреНрд░рдо рдПрдХ рд╕рдВрджреЗрд╢ рдХреЛ рджреВрд╕рд░реЗ рд╕рдВрджреЗрд╢ рдпрд╛ рдЕрдкрд╡рд╛рдж рдХреЗ рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рд╕рд╛рдзрд╛рд░рдг рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ, рд╡рдВрд╢рдЬ рдХреЛ рдорд╛рддрд╛-рдкрд┐рддрд╛ рд╕реЗ рдЕрд▓рдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЗрд╕рдХреЗ рд▓рд┐рдП рдмрд╣реБрд░реВрдкрддрд╛ рд╡рд┐рд░рд╛рд╕рдд рд╣реИред


рд╡рдВрд╢рд╛рдиреБрдХреНрд░рдо рдЙрджрд╛рд╣рд░рдг:
 message EditableUser { name string; sex Sex; birthday datetime; } message User : EditableUser { id int32; lastSeen datetime; friendsCount int32; likesCount int32; photosCount int32; } message UserWithDetails : User { photos list<Photo>; friends list<User>; } 

рдмрд╣реБрд░реВрдкрддрд╛ рд╡рд┐рд░рд╛рд╕рдд


рдкреЙрд▓реАрдореЙрд░реНрдлрд┐рдХ рдЗрдирд╣реЗрд░рд┐рдЯреЗрдВрд╕ рдЖрдкрдХреЛ рдбрд┐рд╕реНрдХреНрд░рд┐рдорд┐рдиреЗрдЯрд░ рдлрд╝реАрд▓реНрдб рдХреЗ рдореВрд▓реНрдп рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд╡рдВрд╢ рдХреЛ рдЕрдирдкреИрдХ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рд╕рднреА рд╡рдВрд╢рдЬреЛрдВ рд╡рд╛рд▓рд╛ рдПрдХ рдЕрднрд┐рднрд╛рд╡рдХ рд╡рдВрд╢рд╛рдиреБрдХреНрд░рдо рд╡реГрдХреНрд╖ рд╣реЛрддрд╛ рд╣реИред рдПрдХ рд╡рдВрд╢рдЬ рджреВрд╕рд░реЗ рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓ рд╕рдХрддрд╛ рд╣реИ (рдФрд░ рди рдХреЗрд╡рд▓ рдПрдХ рдорд╛рддрд╛-рдкрд┐рддрд╛), рдмрд▓реНрдХрд┐ рдХреЗрд╡рд▓ рдЙрд╕реА рдкреЗрдбрд╝ рдХреЗ рднреАрддрд░ред

рдмрд╣реБрд░реВрдкрд┐рдХ рд╡рд┐рд░рд╛рд╕рдд рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдЪрд╛рд╣рд┐рдП:


рдкреНрд░рддрд┐рдмрдВрдз:


рдмрд╣реБрд░реВрдкрддрд╛ рд╡рд┐рд░рд╛рд╕рдд рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг:
 /** Discriminator enum. */ enum EventType { USER_EVENT, USER_REGISTERED, USER_BANNED, PHOTO_UPLOADED, } /** Base event with a discriminator field. */ message Event { type EventType @discriminator; // The type field marked as @discriminator time datetime; } /** Base user event. */ message UserEvent : Event(EventType.USER_EVENT) { user User; } message UserRegistered : UserEvent(EventType.USER_REGISTERED) { ip string; browser string; device string; } message UserBanned : UserEvent(EventType.USER_BANNED) { moderatorId int64; reason string; } message PhotoUploaded : Event(EventType.PHOTO_UPLOADED) { photo Photo; userId int64; } 


рдЗрдВрдЯрд░рдлреЗрд╕


рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╕реНрдЯреИрдЯрд┐рдХрд▓реА рдЯрд╛рдЗрдк рдХрд┐рдП рдЧрдП рддрд░реАрдХреЛрдВ рдХрд╛ рдПрдХ рд╕рдВрдЧреНрд░рд╣ рд╣реИред рдкреНрд░рддреНрдпреЗрдХ рд╡рд┐рдзрд┐ рдХрд╛ рдПрдХ рдЕрджреНрд╡рд┐рддреАрдп рдирд╛рдо рд╣реЛрддрд╛ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдирд╛рдо рддрд░реНрдХ рдФрд░ рдкрд░рд┐рдгрд╛рдо рд╣реЛрддрд╛ рд╣реИред рдкрд░рд┐рдгрд╛рдо рдХрд┐рд╕реА рднреА рдкреНрд░рдХрд╛рд░ рдХрд╛ рдбреЗрдЯрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдЕрдиреНрдп рдЗрдВрдЯрд░рдлреЗрд╕ рднреА рд╢рд╛рдорд┐рд▓ рд╣реИрдВред

рдХрд┐рд╕реА рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ рдпрд╛ void рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдкрд░ рдПрдХ рд╡рд┐рдзрд┐ рдХреЛ рдЯрд░реНрдорд┐рдирд▓ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдПрдХ рд╡рд┐рдзрд┐ рдХреЛ рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрдм рд╡рд╣ рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд▓реМрдЯрд╛рддрд╛ рд╣реИред рдПрдХ рдЕрдиреБрдХреНрд░рдорд┐рдХ рд╡рд┐рдзрд┐ рдХреЙрд▓ рдХреЛ рдЯрд░реНрдорд┐рдирд▓ рд╡рд┐рдзрд┐ рдХреЗ рд╕рд╛рде рд╕рдорд╛рдкреНрдд рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, app.users().register("John Doe") ред

рдЯрд░реНрдорд┐рдирд▓ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдбреЗрдЯрд╛ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдЕрд▓рдЧ-рдЕрд▓рдЧ рддрд░реАрдХреЛрдВ рд╕реЗ @post рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд┐рд╣реНрдирд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЙрдирдХреЗ рддрд░реНрдХреЛрдВ рдХреЛ @post рдХреЗ рд░реВрдк рдореЗрдВ рднреА рдЪрд┐рд╣реНрдирд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред HTTP RPC рдЗрди рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ POST рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рднреЗрдЬрддрд╛ рд╣реИ, рдФрд░ @post рдЕрдиреБрд░реЛрдз рдХреЗ рдореБрдЦреНрдп рднрд╛рдЧ рдореЗрдВ рддрд░реНрдХ рдЬреЛрдбрд╝рддрд╛ рд╣реИред

@post рдХреЗ рд╕рд╛рде рдЪрд┐рд╣реНрдирд┐рдд рдЯрд░реНрдорд┐рдирд▓ рд╡рд┐рдзрд┐рдпреЛрдВ рдореЗрдВ @query рддрд░реНрдХ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддреЗ рдЬреЛ HTTP рдХреНрд╡реЗрд░реА рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЗ рд░реВрдк рдореЗрдВ рднреЗрдЬреЗ рдЬрд╛рддреЗ рд╣реИрдВред


рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдЙрджрд╛рд╣рд░рдг:
 interface Application { /** Void method. */ void0() void; /** Interface method. */ service(arg int32) Service; /** Method with 3 args. */ method(arg0 int32, arg1 string, arg2 list<string>) string; } interface Service { /** Terminal method with @query args. */ query(limit int32 @query, offset int32 @query) list<string>; /** Terminal post method with one of args marked as @post. */ @post mutator(arg0 int32, postArg string @post) string; } 

рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╡рдВрд╢рд╛рдиреБрдХреНрд░рдо


рдЗрдВрдЯрд░рдлреЗрд╕ рдЕрдиреНрдп рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЛ рдЗрдирд╣реЗрд░рд┐рдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред


рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╡рдВрд╢рд╛рдиреБрдХреНрд░рдо рдЙрджрд╛рд╣рд░рдг:
 interface BaseInterface { method() void; } interface SubInterface : BaseInterface { anotherMethod() void; } 

рдЕрдкрд╡рд╛рдж


рдЕрдкрд╡рд╛рджреЛрдВ рдХреЛ @throws(Exception) рдЗрдВрдЯрд░рдлрд╝реЗрд╕ @throws(Exception) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд░реВрдЯ рдЗрдВрдЯрд░рдлреЗрд╕ рдореЗрдВ рджрд░реНрд╢рд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред рд░реВрдЯ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╡рд╣ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд╕реЗ рд╕рднреА рдХреЙрд▓ рд╢реБрд░реВ рд╣реЛрддреЗ рд╣реИрдВред рдХреЙрд▓ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдореЗрдВ рдЕрдиреНрдп рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рдЕрдкрд╡рд╛рджреЛрдВ рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдХрдИ рдЕрдкрд╡рд╛рджреЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдмрд╣реБрд░реВрдкрддрд╛ рд╡рд┐рд░рд╛рд╕рдд рдпрд╛ рд░рдЪрдирд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЖрдорддреМрд░ рдкрд░ рдПрдХ рд░реВрдЯ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, Github рдпрд╛ Twitter рдФрд░ рдПрдХ рдЕрдкрд╡рд╛рджред

рдЙрджрд╛рд╣рд░рдг рдмрд╣реБрд░реВрдкреА рдЕрдкрд╡рд╛рдж:
 @throws(AppException) interface Application { users() Users; photos() Photos; search() Search; } enum AppExceptionCode { AUTH_EXC, VALIDATION_EXC, FORBIDDEN_EXC } exception AppException { type AppExceptionCode @discriminator; } exception AuthExc : AppException(AppExceptionCode.AUTH_EXC) {} exception ValidationExc : AppException(AppExceptionCode.VALIDATION_EXC) {} exception ForbiddenExc : AppException(AppExceptionCode.FORBIDDEN_EXC) {} 


рдирд┐рд╖реНрдХрд░реНрд╖

рдХрдВрдкрд╛рдЗрд▓рд░ рдХрд╛ рдбреНрд░рд╛рдлреНрдЯ рд╕рдВрд╕реНрдХрд░рдг рд▓рд┐рдЦрдирд╛ рдХрд╛рдлреА рд╕рд░рд▓ рдерд╛, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдореЗрд░реЗ рдЦрд╛рд▓реА рд╕рдордп рдореЗрдВ рдХрд╛рдо рдХреЗ рдПрдХ рдорд╣реАрдиреЗ рдореЗрдВ рдХрд╣реАрдВ рддреИрдпрд╛рд░ рдерд╛ред рд╡рд░реНрд╖ рдХреЗ рдмрд╛рдХреА рд╕рдордп рдХреЛ рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд рд╕рд░рд▓, рдЕрд╕реНрдкрд╖реНрдЯ рдФрд░ рдЙрдкрдпреЛрдЧ рдореЗрдВ рдЖрд╕рд╛рди рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЦрд░реНрдЪ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рднрд╛рд╖рд╛ рдХреЗ рд╕реНрдерд┐рд░ рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рдХрдИ рд╡рд┐рднреЗрджрдХреЛрдВ рдХреЗ рд╕рд╛рде рдЬреЗрдиреЗрд░рд┐рдХ, рдмрд╣реБрд░реВрдкреА рд╡рд┐рд░рд╛рд╕рдд рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рдереА, рдХреЙрд▓ рдЪреЗрдиреНрд╕ рдореЗрдВ рдЕрдкрд╡рд╛рджреЛрдВ рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рддреЗ рд╣реБрдП, рдПрдХ рдУрдкрди рдЯрд╛рдЗрдк рд╕рд┐рд╕реНрдЯрдо (рдЬреЛ рдЖрдкрдХреЛ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдореВрд▓ рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдЬреИрд╕реЗ рдХрд┐ native mytype ), рдХрдордЬреЛрд░ рдЯрд╛рдЗрдкрд┐рдВрдЧ (рдЬрдм рд╡рд┐рдзрд┐ рдХрд╛ рдлрд╝реАрд▓реНрдб рдпрд╛ рдкрд░рд┐рдгрд╛рдо рдкреНрд░рдХрд╛рд░ object , рдФрд░ рдХреНрд▓рд╛рдЗрдВрдЯ) рдЗрд╕реЗ рд╕реНрд╡рдпрдВ рдЕрдирдкреИрдХ рдХрд░рдирд╛ рдкрдбрд╝рд╛), рд╕рд╛рде рд╣реА рд╕рд╛рде рдФрд░ рднреА рдмрд╣реБрдд рдХреБрдЫред рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рдореБрдЭреЗ рдЖрд╢рд╛ рд╣реИ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рд╕рд░рд▓, рдЖрд╕рд╛рдиреА рд╕реЗ рдкрдврд╝реА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рдФрд░ рдЙрдкрдпреЛрдЧ рдореЗрдВ рдЖрд╕рд╛рди рднрд╛рд╖рд╛ рд╣реИред

REST рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдкреВрд░реНрдг рд╕рдорд░реНрдерди рдХреНрдпреЛрдВ рдирд╣реАрдВ рд╣реИ? рдкреНрд░рд╛рд░рдВрдн рдореЗрдВ, рдЗрд╕рдХреА рдпреЛрдЬрдирд╛ рдмрдирд╛рдИ рдЧрдИ рдереА, рд▓реЗрдХрд┐рди рд╡рд┐рдирд┐рд░реНрджреЗрд╢ рдФрд░ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдмрд╣реБрдд рдЕрдзрд┐рдХ рдЪрдордХреАрд▓реА рдереА, рдЗрд╕рд▓рд┐рдП REST рдХреЛ HTTPрдкреАрд╕реА рдХреЗ рдПрдХ рд╕рд░рд▓ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рджреНрд╡рд╛рд░рд╛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рднрд╡рд┐рд╖реНрдп рдХреЗ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдореЗрдВ, рдпрд╣ рджрд┐рдЦрд╛рдИ рджреЗ рд╕рдХрддрд╛ рд╣реИред рдЖрдк рд╡рд┐рдирд┐рд░реНрджреЗрд╢ рдореЗрдВ RPC рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рд╡рд┐рд╢рд┐рд╖реНрдЯ рднрд╛рд╖рд╛ рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рдХреЗ рдкреГрд╖реНрдареЛрдВ рдкрд░ рдЙрджрд╛рд╣рд░рдг рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВред рд▓рд┐рдВрдХ рд▓реЗрдЦ рдХреЗ рдЕрдВрдд рдореЗрдВ рд╣реИрдВред

рдореИрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ рднрд╛рд╖рд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдкрдиреА рднрд╛рд╡рдирд╛рдУрдВ рдХреЛ рд╕рд╛рдЭрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛, рд▓реЗрдЦрдХ рдирд╣реАрдВред рдкрд┐рдЫрд▓реЗ рдПрдХ рд╕рд╛рд▓ рдореЗрдВ, рдореИрдВрдиреЗ рдХрдИ рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рд╣реИ, рдЙрдирдореЗрдВ рд╕реЗ рдХреБрдЫ рдореЗрдВ рднреА рдЕрд▓реНрдлрд╛ рд╕рдВрд╕реНрдХрд░рдгред рдореБрдЭреЗ pidef рдкрд╕рдВрдж рд╣реИред рдпрд╣ рдШрдЯрдХреЛрдВ рдХреА рдХрдордЬреЛрд░ рдХрдиреЗрдХреНрдЯрд┐рд╡рд┐рдЯреА рдХреЛ рдмрдврд╝рд╛рддрд╛ рд╣реИ, рд╡рд┐рднрд┐рдиреНрди рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рдХреЛрдб рдХреЗ рдирд┐рдпрдорд┐рдд рджреЛрд╣рд░рд╛рд╡ рд╕реЗ рдкреНрд░рдХрд╛рд░, рдЗрдВрдЯрд░рдлреЗрд╕ рдФрд░ рдкреНрд░рд▓реЗрдЦрди рдХреЛ рдПрдХреАрдХреГрдд рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░реЛрдВ рдХреЛ рдореБрдХреНрдд рдХрд░рддрд╛ рд╣реИред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рд▓реЗрдЦ рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рд▓рд┐рдЦрд╛ рдерд╛, рдпрд╣ рдореЛрдмрд╛рдЗрд▓ рдХреНрд▓рд╛рдЗрдВрдЯ, рд╕рд╛рдЗрдЯреНрд╕, рдПрдкреАрдЖрдИ рд╕рд░реНрд╡рд░, рдЖрдВрддрд░рд┐рдХ рд╕реЗрд╡рд╛рдУрдВ, рд╡рд┐рддрд░рд┐рдд рд╕рд┐рд╕реНрдЯрдо, рдкреБрд╢ рдиреЛрдЯрд┐рдлрд┐рдХреЗрд╢рди рд╕рд░реНрд╡рд░, рдХреНрд╡реАрдЬ, рдбреЗрдЯрд╛ рд╕реНрдЯреЛрд░реЗрдЬ рд╕рд┐рд╕реНрдЯрдо рд╕рд╣рд┐рдд рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдгрд╛рд▓рд┐рдпреЛрдВ рдХреЗ рдЗрдВрдЯрд░реИрдХреНрд╢рди рдХреЛ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░рдиреЗ рдХреЗ рдУрд╡рд░рд╣реЗрдб рдХреЛ рдмрд╣реБрдд рдХрдо рдХрд░рддрд╛ рд╣реИред рд╡реЗ рд╕рднреА, рдЕрдВрдд рдореЗрдВ, рдПрдХ рд╣реА рдЙрдкрд▓рдмреНрдз рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ рдФрд░ рдЗрдВрдЯрд░рдлреЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕реА рд╕рдордп, рдХреЛрдИ рддрдХрдиреАрдХреА рд▓реЙрдХ-рдЗрди рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдпрд╣ рдПрдХ рд╣реА JSON рдФрд░ HTTP рд╣реИред

рд╕рдВрджрд░реНрдн

Source: https://habr.com/ru/post/In209018/


All Articles