рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ, рдореИрдВрдиреЗ REST- рдЖрд╢реНрд╡рд╛рд╕рди, REST-API рдкрд░реАрдХреНрд╖рдг рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдЖрдо рдЬрд╛рд╡рд╛ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдкрд░ рдХреБрдЫ рдЙрдкрдпреЛрдЧреА рд╕реБрдЭрд╛рд╡ рдПрдХрддреНрд░ рдХрд┐рдП рд╣реИрдВред
рд╕рднреА рдЙрджрд╛рд╣рд░рдг рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИрдВ, рд╡реЗ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рд╕рд╛рде 50 рд╕реЗ рдЕрдзрд┐рдХ рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдореЗрдВ рдХреЛрдб-рд╕рдореАрдХреНрд╖рд╛ рдХрд░рдиреЗ рдХреЗ рдореЗрд░реЗ рдЕрднреНрдпрд╛рд╕ рд╕реЗ рдПрдХрддреНрд░ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред
рдПрдХ рдЕрд▓рдЧ рд╕реНрдерд╛рди рдкрд░ рдПрдВрдб-рдкреЙрдЗрдВрдЯ рд▓реЗрдВ
рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИред рд▓реЗрдХрд┐рди рдирд╣реАрдВ, рдХрд╛рдлреА рдмрд╛рд░ рдЖрдкрдХреЛ рдЕрдиреБрд░реЛрдз рдореЗрдВ рд╣рд╛рд░реНрдб-рдХреЛрдбреЗрдб рдПрдВрдб-рдкреЙрдЗрдВрдЯ рдХреЗ рд╕рд╛рде рдХреЛрдб рджреЗрдЦрдирд╛ рд╣реЛрдЧрд╛ред
рдЕрдВрддрд┐рдо рд╡рд░реНрдЧ рдХреЗ рд╕реНрдерд┐рд░ рд╕реНрдерд┐рд░рд╛рдВрдХ рдореЗрдВ рдЕрдВрдд-рдмрд┐рдВрджреБрдУрдВ рдХреЛ рд░рдЦрдирд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╣реИред рдЗрд╕реА рд╕рдордп, рдПрдВрдЯреАрдкреИрдЯрд░реНрди "рдирд┐рд░рдВрддрд░ рдЗрдВрдЯрд░рдлрд╝реЗрд╕" рд╕реЗ рдмрдЪрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП - рдпрд╣ рдмреБрд░рд╛ рдЕрднреНрдпрд╛рд╕ рд╣реИред
рдпрд╛рдж рд░рдЦреЗрдВ рдХрд┐ REST- рдЖрд╢реНрд╡рд╕реНрдд рдЖрдкрдХреЛ рдкрде рдкреИрд░рд╛рдореАрдЯрд░ рдмрдирд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:
public final class EndPoints { public static final String users = "/users/{id}"; ... } given().pathParams("id", someId).get(EndPoints.users)...;
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрджрд┐ рдЖрдк рдХрдИ рдкреНрд░рд╢реНрдиреЛрдВ рдореЗрдВ рдПрдХ рд╣реА рдЖрдзрд╛рд░ рдкрде рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЗрд╕реЗ рд╣реЛрдЯрд▓ рдХреЗ рд╕реНрдерд┐рд░рд╛рдВрдХ рдореЗрдВ рд░рдЦрдиреЗ рдФрд░ рдЗрд╕реЗ рдореВрд▓ рдЖрдзрд╛рд░ рдкрд░ рдкрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдЪреНрдЫрд╛ рдЕрднреНрдпрд╛рд╕ рд╣реЛрдЧрд╛, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:
рдкрд░реАрдХреНрд╖рдг рдХреЗ рддрд╣рдд рдЖрд╡реЗрджрди рдХреЗ рдореЗрдЬрдмрд╛рди рдФрд░ рдмрдВрджрд░рдЧрд╛рд╣ рдкрд░ рднреА рдпрд╣реА рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИред
ContentType / Accept
рдпреЗ рд╣реЗрдбрд░ рд▓рдЧрднрдЧ рд╕рднреА HTTP рдЕрдиреБрд░реЛрдзреЛрдВ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред REST- рдЖрд╢реНрд╡рд╕реНрдд рд▓реЗрдЦрдХреЛрдВ рдиреЗ рдЗрд╕реЗ рдорд╣рд╕реВрд╕ рдХрд░рддреЗ рд╣реБрдП, рд╡рд┐рд╢реЗрд╖ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдХреЙрд▓ рдХрд░рдХреЗ рдЙрдиреНрд╣реЗрдВ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдирд╛ рд╕рдВрднрд╡ рдмрдирд╛рдпрд╛:
рдЗрди рд╣реЗрдбрд░ рдХреЛ рд╡рд┐рдирд┐рд░реНрджреЗрд╢рди рдореЗрдВ рдпрд╛ рд╡рд┐рд╢реНрд╡ рд╕реНрддрд░ рдкрд░ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реИред рдЗрд╕рд╕реЗ рдЖрдкрдХреЗ рдХреЛрдб рдХреА рдкрдардиреАрдпрддрд╛ рдмрдврд╝реЗрдЧреАред
рд╕реНрдЯреЗрдЯрд╕рдХреЛрдб, рдЖрджрд┐ред
REST- рдЖрд╢реНрд╡рд╕реНрдд HTTP рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рдШрдЯрдХ рдХреА рдЬрд╛рдБрдЪ рдХреЗ рд▓рд┐рдП рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ рдЖрдк рд╕рдорд╛рди рдХреЛрдб рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рдирд╛ рдЬрд╛рд░реА рд░рдЦрддреЗ рд╣реИрдВ:
рд╡рд┐рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ
рдХреЛрдб рджреЛрд╣рд░рд╛рд╡ рдмреБрд░рд╛ рд╣реИред рджреЛрд╣рд░рд╛рд╡ рдХреЛ рдХрдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред REST- рдЖрд╢реНрд╡рд╛рд╕рди рдореЗрдВ, рдЖрдк рдЕрдиреБрд░реЛрдз рдФрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рджреЛрдиреЛрдВ рдХреЗ рд▓рд┐рдП рд╡рд┐рдирд┐рд░реНрджреЗрд╢ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред рдЕрдиреБрд░реЛрдз рдХреЗ рд╡рд┐рдирд┐рд░реНрджреЗрд╢ рдореЗрдВ рд╣рдордиреЗ рдЙрди рд╕рднреА рдЪреАрдЬрд╝реЛрдВ рдХреЛ рдмрд╛рд╣рд░ рд░рдЦрд╛ рд╣реИ рдЬрд┐рдиреНрд╣реЗрдВ рдЕрдиреБрд░реЛрдзреЛрдВ рдореЗрдВ рджреЛрд╣рд░рд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
RequestSpecification requestSpec = new RequestSpecBuilder() .setBaseUri("http://localhost") .setPort(8080) .setAccept(ContentType.JSON) .setContentType(ContentType.ANY) ... .log(LogDetail.ALL) .build();
рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЗ рд╡рд┐рдирд┐рд░реНрджреЗрд╢ рдореЗрдВ рд╣рдо рд╕рднреА рдЪреЗрдХ рдмрдирд╛рддреЗ рд╣реИрдВ рдЬреЛ рдЕрдиреБрд░реЛрдз рд╕реЗ рдЕрдиреБрд░реЛрдз рддрдХ рджреЛрд╣рд░рд╛рдП рдЬрд╛рддреЗ рд╣реИрдВред
ResponseSpecification responseSpec = new ResponseSpecBuilder() .expectStatusCode(200) .expectBody(containsString("success")) .build();
рдЖрдк рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░ рдХреЗ рдЕрдиреБрд░реЛрдзреЛрдВ / рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдХрдИ рд╡рд┐рдирд┐рд░реНрджреЗрд╢ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЙрдиреНрд╣реЗрдВ рд╕рд╣реА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреА рдмреИрд╕рд╛рдЦреА рди рд▓рд┐рдЦреЗрдВ
рдЖрдкрдХреЛ рдЕрдкрдиреЗ POJO рдХреЛ рдЬреИрдХреНрд╕рди ObjectMapper рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ JSON рдореЗрдВ рдирд╣реАрдВ рдмрджрд▓рдирд╛ рдЪрд╛рд╣рд┐рдП, рдФрд░ рдлрд┐рд░ рдкрд░рд┐рдгрд╛рдореА рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЛ рдЕрдиреБрд░реЛрдз рдирд┐рдХрд╛рдп рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред REST- рдЖрд╢реНрд╡рд╕реНрдд рдЗрд╕ рдХрд╛ рдПрдХ рдмрдбрд╝рд╛ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рд▓рд┐рдП, рдЙрд╕реА рдЬреИрдХреНрд╕рди рдпрд╛ рдЧреЙрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдЗрд╕ рдмрд╛рдд рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдХреНрд▓рд╛рд╕рдкрд╛рде рдореЗрдВ рдХреНрдпрд╛ рд╣реИред JAXB рдХрд╛ рдЙрдкрдпреЛрдЧ XML рдореЗрдВ рдХрдирд╡рд░реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдореВрд▓ рдкреНрд░рд╛рд░реВрдк рд╕рд╛рдордЧреНрд░реА-рдкреНрд░рдХрд╛рд░ рдХреЗ рдореВрд▓реНрдп рджреНрд╡рд╛рд░рд╛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
given().contentType(ContentType.JSON).body(somePojo) .when().post(EndPoints.add) .then() .statusCode(201);
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, REST- рдЖрд╢реНрд╡рд╛рд╕рди рдиреЗ HashMap рдХреЛ JSON рдФрд░ рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдмрдбрд╝рд╛ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред
рдЧреНрд░реЛрд╡реА рдХреА рд╢рдХреНрддрд┐ рдХрд╛ рджреЛрд╣рди рдХрд░реЗрдВ
REST- рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдЦреБрдж Groovy рдореЗрдВ рд▓рд┐рдЦреА рдЧрдИ рд╣реИ рдФрд░ рдЖрдкрдХреЛ Groovy рд╕реЗ рдкреНрд░рд╛рдкреНрдд JSON / XML рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЗ рд▓рд┐рдП рд╡рд┐рднрд┐рдиреНрди рддрд░реАрдХреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:
рдЧреНрд░реВрд╡реА рд╕реЗ рд╡рд┐рдзрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдЖрдк рдЙрддреНрддрд░ рд╕реЗ рдЖрд╡рд╢реНрдпрдХ рдореВрд▓реНрдп рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рд▓рд┐рдЦреЗ рдЧрдП рдХреЛрдб рдХреА рдорд╛рддреНрд░рд╛ рдХреЛ рдХрд╛рдлреА рдХрдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдпрд╣ рд╕рдм, рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдЕрдзрд┐рдХ рд╕реБрдЭрд╛рд╡ рдФрд░ рдЙрджрд╛рд╣рд░рдг рд╣реИрдВ, рддреЛ рдЙрдиреНрд╣реЗрдВ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ рд▓рд┐рдЦреЗрдВред