рдкрд░рд┐рдЪрдп
рд╡реЗрдм рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╕реЗ рдбреЗрдЯрд╛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдИ рддрд░реАрдХреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╢рд╛рдпрдж рд╕рдмрд╕реЗ рдЖрдо рдПрдХ MIME- рдЯрд╛рдЗрдк
application/x-www-form-urlencoded
рд╕рд╛рде рдПрдХ рдлреЙрд░реНрдо рднреЗрдЬ рд░рд╣рд╛ рд╣реИред рдПрдХ рдЕрдиреНрдп рд╡рд┐рдХрд▓реНрдк
multipart/form-data
ред
MVC рдлреНрд░реЗрдорд╡рд░реНрдХ рдореЗрдВ рдирд┐рдпрдВрддреНрд░рдХреЛрдВ рдХреЛ рд░рд┐рд╕реЗрдкреНрд╢рди рдХреЗ рд▓рд┐рдП рд╕рд░реНрд╡рд░ рддрдХрдиреАрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ (
рд╕реНрдкреНрд░рд┐рдВрдЧ рдПрдорд╡реАрд╕реА ,
рдЬрд╛рд╡рд╛ рд╕рд░реНрд╡рд░ рдкреЗрдЬ ,
рдЬрд╛рд╡рд╛ рд╕рд░реНрд╡рд░ рдлреЗрд╕ рдХреЛ рдореБрдЦреНрдп рдЬрд╛рд╡рд╛ рдкреНрд░реМрджреНрдпреЛрдЧрд┐рдХрд┐рдпреЛрдВ рд╕реЗ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рд▓реЗрдХрд┐рди рдпреЗ рдлреНрд░реЗрдорд╡рд░реНрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдбреЗрд╡рд▓рдкрд░ рдХреЗ рд▓рд┐рдП рдЬреАрд╡рди рдХреЛ рдХрд╛рдлреА рдХрдард┐рди рдмрдирд╛ рджреЗрддреЗ рд╣реИрдВ рдпрджрд┐ рд╡рд╣ рдЬрд╛рд╡рд╛ рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рдирд╣реАрдВ рд╣реИ рдпрд╛ рдЬрд░реВрд░рдд рд╣реИред рдлреНрд░реЗрдорд╡рд░реНрдХ рдХреНрдпрд╛ рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рд╕реЗ рдПрдХ рдХрджрдо рджреВрд░ред рдЖрд╡реЗрджрди рдХреЗ рдмреИрдХрдПрдВрдб рдореЗрдВ REST рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рдЙрдЬрд╛рдЧрд░ рдХрд░рдиреЗ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдлреНрд░рдВрдЯ-рдПрдВрдб рдбреЗрд╡рд▓рдкрдореЗрдВрдЯ рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ: рдПрдХ рд╡реНрдпрдХреНрддрд┐ рдЬреЛ рдмреБрдирд┐рдпрд╛рджреА рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдФрд░ jquery рдЬрд╛рдирддрд╛ рд╣реИ, рдмреИрдХрд┐рдВрдЧ рд╡рд┐рдХрд╛рд╕ рд╕реЗ рд╕реНрд╡рддрдВрддреНрд░ рд╣реИ, рд╡рд╣ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЬрдм sc рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реЛ onizatora рд╡рд┐рдХрд▓реНрдк рдХрд╛рдлреА рд╡рд┐рд╕реНрддрд╛рд░:
рдЕрдкрд╛рдЪреЗ рд╡реЗрдЧ ,
FreeMarker (рдпрд╣ рдЙрд▓реНрд▓реЗрдЦ рдХреЗ рд▓рд╛рдпрдХ рд╣реИ рдХрд┐ Spirng MVC рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдирд╡реАрдирддрдо рдХреЗ рд╕рд╛рде рдПрдХреАрдХреГрдд рд╣реИ), рддреЛ рд╕рд░реНрд╡рд░ рд╕рд╛рдЗрдб рдкрд░ рдкреНрд░рдкрддреНрд░ рдбреЗрдЯрд╛ рдмреАрдирд╛, рдЬреЛ рджреЗрдЦреЗрдВ / рдирд┐рдпрдВрддреНрд░рдХ рдпрд╣ рд╕рдЪ рд╣реИ, JSF рднреА рдЖрдиреБрд╡рдВрд╢рд┐рдХ рд╕рдорд╕реНрдпрд╛ рдордирд╛рдпрд╛ рд╕рд╛рде рдЬреБрдбрд╝рд╛ рд╣реБрдЖ рд╣реИ рдореЗрдВ рд▓рд┐рдЦрд╛ рд╣реИ .. рдПрдиреНрдХреЛрдбрд┐рдВрдЧ рдХреЗ рд╕рд╛рде, рдЬрд┐рд╕ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдПрдХ рдЕрд▓рдЧ рд▓реЗрдЦ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рд╖рдп рд╣реИред
рдкрд┐рдЫрд▓реЗ рд▓реЗрдЦ рдореЗрдВ JAX-RS рдХрд╛ рдПрдХ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдкрд░рд┐рдЪрдп рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдФрд░ JAX-RS рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЙрдЬрд╛рдЧрд░ рдХрд┐рдП рдЧрдП рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдлреЙрд░реНрдо рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде
GET
рдФрд░
POST
рдЕрдиреБрд░реЛрдз рд╕реНрд╡реАрдХрд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЧреИрд░
latin-1
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреА рд╕рдорд╕реНрдпрд╛рдУрдВ рдкрд░ рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рдЪрд░реНрдЪрд╛ рдХреА рдЬрд╛рдПрдЧреАред
JAX-RS рдореЗрдВ рдлрд╝реЙрд░реНрдо рдбреЗрдЯрд╛ рдкреБрдирд░реНрдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛
рдХрд┐рд╕реА рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рдХрд┐рд╕реА рдлрд╝реЙрд░реНрдо рд╕реЗ рдХрд┐рд╕реА рд╡рд┐рдзрд┐ рдореЗрдВ рдЗрдВрдЬреЗрдХреНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдИ рдПрдиреЛрдЯреЗрд╢рди рд╣реИрдВ:
@Form
,
@FormParam
ред рдПрдХ
POST
рдЕрдиреБрд░реЛрдз рдХреЗ рд▓рд┐рдП,
@FormParam
рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ
GET
рд▓рд┐рдП
@QueryParam
рдмрд░рд╛рдмрд░ рд╣реИред рдПрдХ рдЫреЛрдЯреЗ рд╕реЗ рдЕрдкрд╡рд╛рдж рдХреЗ рд╕рд╛рде: utf-8 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рд╡реНрдпрд╡рд╣рд╛рд░ред
GET
рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп,
urlencoded
рд╕реЗ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЛ рдбрд┐рдХреЛрдб рдХрд░рдирд╛ рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЗ рдмрд┐рдирд╛ рд╣реЛрддрд╛ рд╣реИред
POST
Content-Type
рдореЗрдВ
charset=utf-8
рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдирд╛ рднреА рдЖрд╡рд╢реНрдпрдХ рд╣реИ, рддрд╛рдХрд┐ рдЬрдм
urlencoded
рд╕реЗ рдбреАрдХреЛрдб рдХрд┐рдпрд╛ рдЬрд╛рдП, рддреЛ рдмрд╛рдЗрдЯ рд╕реНрдЯреНрд░реАрдо UTF-8 рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рд╣реЛ рдЬрд╛рдПрдЧреА, рдФрд░ рд▓реИрдЯрд┐рди -1 (рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╡реНрдпрд╡рд╣рд╛рд░) рдирд╣реАрдВред
рдмреНрд░рд╛рдЙрдЬрд╝рд░реЛрдВ
рдмреНрд░рд╛рдЙрдЬрд╝рд░реНрд╕ (рдпрд╛ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП jquery) рдПрдиреНрдХреЛрдбрд┐рдВрдЧ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ рдкреНрд░рдкрддреНрд░ рдлрд╝реАрд▓реНрдб рдХреЗ рдорд╛рдиреЛрдВ рдХреА рдЧрд▓рдд рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХреА рдУрд░ рд▓реЗ рдЬрд╛рддрд╛ рд╣реИ рдпрджрд┐ рдЙрдирдореЗрдВ рдкреБрд░рд╛рдиреЗ UTF-8 CPs рд╣реЛрддреЗ рд╣реИрдВред
Content-Type: application/x-www-form-urlencoded; charset=utf-8
рд╣реЗрдбрд░ рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдХреЗ jquery рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рдмрд╛рдИрдкрд╛рд╕ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ
Content-Type: application/x-www-form-urlencoded; charset=utf-8
Content-Type: application/x-www-form-urlencoded; charset=utf-8
ред рдмрд┐рдирд╛ js рдХреЗ рдПрдХ рдлреЙрд░реНрдо рдХреЗ рд▓рд┐рдП, рдореИрдВ рдлреЙрд░реНрдо рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд░рд╛рд░реВрдк рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдХреЗ рд╕рдлрд▓ рдирд╣реАрдВ рд╣реЛ рдкрд╛рдпрд╛ред
Jboss рдмреЗрдЪреИрдиреА
рдмреЗрд╢рдХ, рд╕рд╡рд╛рд▓ рдЙрдарддрд╛ рд╣реИ: рдХреНрдпрд╛ рдбреЗрдЯрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдпрджрд┐ рдбреЗрдЯрд╛ рдЕрдиреНрдп рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рд╕реЗ рдЖрдПрдЧрд╛? рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ DRY рдХреЗ рд╕рд┐рджреНрдзрд╛рдВрддреЛрдВ рд╕реЗ рдЙрдЪрд┐рдд рд╣реИ: рдПрдХ рд╣реА рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреНрд▓рд╛рдЗрдВрдЯ рдлреЙрд░реНрдо рдФрд░ рдЗрд╕ рдПрдкреАрдЖрдИ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдмрд╛рд╣рд░реА рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рджреНрд╡рд╛рд░рд╛ рджреЛрдиреЛрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рд░реЗрд╕реНрдЯрд╕реА рдХреНрд▓рд╛рдЗрдВрдЯ рдлреНрд░реЗрдорд╡рд░реНрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп, рдХрдИ рд╡рд┐рдХрд▓реНрдк рд╕рдВрднрд╡ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдк рдЖрд╡рд╢реНрдпрдХ рддрд░реАрдХреЛрдВ рд╕реЗ
@HeaderParam("Content-Type")
рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ:
@Path("/") public interface Rest { @POST @Path("test") public String test(@FormParam("q") String query, @HeaderParam("Content-Type") String contentType); }
рдЙрдкрдпреЛрдЧ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:
Rest client = ProxyFactory.create(Rest.class, url); client.test(query, "application/x-www-form-urlencode; charset=utf-8");
рд▓реЗрдХрд┐рди рдХреНрд▓рд╛рдЗрдВрдЯ рдЗрдВрдЯрд░рд╕реЗрдкреНрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣ рдЕрдзрд┐рдХ рд╕рд╣реА рдФрд░ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реЛрдЧрд╛ рдЬреЛ
Content-Type: application/x-www-form-urlencoded
рд╣реЗрдбрд░ рдХреЗ рд▓рд┐рдП
charset
рдлрд╝реАрд▓реНрдб рдЬреЛрдбрд╝рддрд╛ рд╣реИред рдЗрд╕реЗ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:
@ClientInterceptor @HeaderDecoratorPrecedence public class RestInterceptor implements ClientExecutionInterceptor { public static final String FORM_CONTENT_TYPE = "application/x-www-form-urlencoded"; public static final String FORM_CONTENT_TYPE_WITH_CHARSET = "application/x-www-form-urlencoded; charset=utf-8"; @Override public ClientResponse execute(ClientExecutionContext context) throws Exception { String contentType = context.getRequest().getHeaders().getFirst(HttpHeaders.CONTENT_TYPE); if (formWithoutCharset(contentType)) { context.getRequest().header(HttpHeaders.CONTENT_TYPE, FORM_CONTENT_TYPE_WITH_CHARSET); } return context.proceed(); } private boolean formWithoutCharset(String contentType) { return contentType != null && contentType.contains(FORM_CONTENT_TYPE) && ! contentType.contains("charset"); } }
рдЗрдВрдЯрд░рд╕реЗрдкреНрдЯрд░ рдХрд╛ рдпрд╣ рд╕рдВрд╕реНрдХрд░рдг, рдЬрд╝рд╛рд╣рд┐рд░ рд╣реИ, рдЖрджрд░реНрд╢ рдирд╣реАрдВ рд╣реИред рдпрд╣ рд╕рдВрднрд╡ рд╣реИ рдХрд┐ рдЖрдк рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ
latin-1
рдореЗрдВ рдлреЙрд░реНрдо рдЬрдорд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ ... рд▓реЗрдХрд┐рди рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛрдб рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣ рдкрд╣рд▓рд╛ рдХрджрдо рд╣реИред
рдЗрд╕реЗ рд╕рдХреНрд░рд┐рдп рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рд░реВрдкрд░реЗрдЦрд╛ рдЖрд░рдВрднреАрдХрд░рдг рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдереЛрдбрд╝рд╛ рдареАрдХ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
public static void initResteasy() { ResteasyProviderFactory factory = ResteasyProviderFactory.getInstance(); RegisterBuiltin.register(factory); InterceptorRegistry<ClientExecutionInterceptor> registry = factory.getClientExecutionInterceptorRegistry(); registry.register(new RestInterceptor()); }
рдЙрд╕рдХреЗ рдмрд╛рдж,
ClientRequest
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп, рдФрд░ рдЕрдиреБрд░реЛрдз рднреЗрдЬрдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдЫрджреНрдо рд╡рд╕реНрддреБрдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп, рдпрджрд┐
application/x-www-form-urlencoded
рд╕рд╛рде рдПрдХ
Content-Type
рд╣реЗрдбрд░ рд╣реИ, рд▓реЗрдХрд┐рди рдмрд┐рдирд╛
charset
, рддреЛ рд╡рд╣ рд╣реЗрдбрд░ рдЪрд┐рдкрдХрд╛ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред