Utf-8 рдХреЛ JAX-RS (REST) тАЛтАЛрдореЗрдВ рдлрд╝реЙрд░реНрдо рд╕реЗ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдорд╕реНрдпрд╛рдПрдБ

рдкрд░рд┐рдЪрдп


рд╡реЗрдм рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╕реЗ рдбреЗрдЯрд╛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдИ рддрд░реАрдХреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╢рд╛рдпрдж рд╕рдмрд╕реЗ рдЖрдо рдПрдХ 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 , рддреЛ рд╡рд╣ рд╣реЗрдбрд░ рдЪрд┐рдкрдХрд╛ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

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


All Articles