Intro
I will try using Japanese(Shift-JIS) text data in my Micronaut application in this time.
Change default file encoding
By default, the encoding for my Micronaut application is “windows-31j”.
When I use Japanese in the comment, an exception will occur, so I should change the encoding to UTF-8.
build.gradle.kts
<span>..</span><span>.</span><span>tasks</span><span>.</span><span>withType</span><span><</span><span>JavaCompile</span><span>>().</span><span>configureEach</span> <span>{</span><span>options</span><span>.</span><span>encoding</span> <span>=</span> <span>"UTF-8"</span><span>}</span><span>..</span><span>.</span> <span>tasks</span><span>.</span><span>withType</span><span><</span><span>JavaCompile</span><span>>().</span><span>configureEach</span> <span>{</span> <span>options</span><span>.</span><span>encoding</span> <span>=</span> <span>"UTF-8"</span> <span>}</span>... tasks.withType<JavaCompile>().configureEach { options.encoding = "UTF-8" }
Enter fullscreen mode Exit fullscreen mode
Setting HTTPResponse encoding
I can use specific encoding for HTTPResponse like below.
HomeController.java
<span>package</span> <span>jp.masanori.responsesample</span><span>;</span><span>import</span> <span>io.micronaut.http.HttpResponse</span><span>;</span><span>import</span> <span>io.micronaut.http.MutableHttpResponse</span><span>;</span><span>import</span> <span>io.micronaut.http.annotation.Controller</span><span>;</span><span>import</span> <span>io.micronaut.http.annotation.Get</span><span>;</span><span>@Controller</span><span>(</span><span>"/sample"</span><span>)</span><span>public</span> <span>class</span> <span>HomeController</span> <span>{</span><span>@Get</span><span>(</span><span>uri</span><span>=</span><span>"/utf8"</span><span>,</span> <span>produces</span> <span>=</span> <span>"text/plain;charset=utf-8"</span><span>)</span><span>public</span> <span>MutableHttpResponse</span><span><</span><span>String</span><span>></span> <span>getUtf8</span><span>(){</span><span>return</span> <span>HttpResponse</span><span>.</span><span>ok</span><span>(</span><span>"こんにちは"</span><span>);</span><span>}</span><span>@Get</span><span>(</span><span>uri</span><span>=</span><span>"/shiftjis"</span><span>,</span> <span>produces</span> <span>=</span> <span>"text/plain;charset=Shift_JIS"</span><span>)</span><span>public</span> <span>String</span> <span>getShiftjis</span><span>(){</span><span>return</span> <span>"こんにちは"</span><span>;</span><span>}</span><span>}</span><span>package</span> <span>jp.masanori.responsesample</span><span>;</span> <span>import</span> <span>io.micronaut.http.HttpResponse</span><span>;</span> <span>import</span> <span>io.micronaut.http.MutableHttpResponse</span><span>;</span> <span>import</span> <span>io.micronaut.http.annotation.Controller</span><span>;</span> <span>import</span> <span>io.micronaut.http.annotation.Get</span><span>;</span> <span>@Controller</span><span>(</span><span>"/sample"</span><span>)</span> <span>public</span> <span>class</span> <span>HomeController</span> <span>{</span> <span>@Get</span><span>(</span><span>uri</span><span>=</span><span>"/utf8"</span><span>,</span> <span>produces</span> <span>=</span> <span>"text/plain;charset=utf-8"</span><span>)</span> <span>public</span> <span>MutableHttpResponse</span><span><</span><span>String</span><span>></span> <span>getUtf8</span><span>(){</span> <span>return</span> <span>HttpResponse</span><span>.</span><span>ok</span><span>(</span><span>"こんにちは"</span><span>);</span> <span>}</span> <span>@Get</span><span>(</span><span>uri</span><span>=</span><span>"/shiftjis"</span><span>,</span> <span>produces</span> <span>=</span> <span>"text/plain;charset=Shift_JIS"</span><span>)</span> <span>public</span> <span>String</span> <span>getShiftjis</span><span>(){</span> <span>return</span> <span>"こんにちは"</span><span>;</span> <span>}</span> <span>}</span>package jp.masanori.responsesample; import io.micronaut.http.HttpResponse; import io.micronaut.http.MutableHttpResponse; import io.micronaut.http.annotation.Controller; import io.micronaut.http.annotation.Get; @Controller("/sample") public class HomeController { @Get(uri="/utf8", produces = "text/plain;charset=utf-8") public MutableHttpResponse<String> getUtf8(){ return HttpResponse.ok("こんにちは"); } @Get(uri="/shiftjis", produces = "text/plain;charset=Shift_JIS") public String getShiftjis(){ return "こんにちは"; } }
Enter fullscreen mode Exit fullscreen mode
Receiving Shift-JIS strings as HTTPResponse by HttpClient
I can receive them by HttpClient like below.
FileController.java
<span>package</span> <span>jp.masanori.websample</span><span>;</span><span>import</span> <span>java.io.File</span><span>;</span><span>import</span> <span>java.io.IOException</span><span>;</span><span>import</span> <span>java.nio.file.Files</span><span>;</span><span>import</span> <span>java.io.InputStreamReader</span><span>;</span><span>import</span> <span>java.io.ByteArrayInputStream</span><span>;</span><span>import</span> <span>java.io.BufferedReader</span><span>;</span><span>import</span> <span>com.fasterxml.jackson.core.JsonProcessingException</span><span>;</span><span>import</span> <span>com.fasterxml.jackson.databind.ObjectMapper</span><span>;</span><span>import</span> <span>io.micronaut.core.io.buffer.ByteBuffer</span><span>;</span><span>import</span> <span>io.micronaut.http.HttpHeaders</span><span>;</span><span>import</span> <span>io.micronaut.http.HttpRequest</span><span>;</span><span>import</span> <span>io.micronaut.http.HttpResponse</span><span>;</span><span>import</span> <span>io.micronaut.http.HttpStatus</span><span>;</span><span>import</span> <span>io.micronaut.http.MediaType</span><span>;</span><span>import</span> <span>io.micronaut.http.annotation.Controller</span><span>;</span><span>import</span> <span>io.micronaut.http.annotation.Get</span><span>;</span><span>import</span> <span>io.micronaut.http.annotation.Part</span><span>;</span><span>import</span> <span>io.micronaut.http.annotation.Post</span><span>;</span><span>import</span> <span>io.micronaut.http.client.HttpClient</span><span>;</span><span>import</span> <span>io.micronaut.http.multipart.CompletedFileUpload</span><span>;</span><span>import</span> <span>jp.masanori.dto.ComputeResult</span><span>;</span><span>import</span> <span>jp.masanori.dto.ComputingStatusRequest</span><span>;</span><span>import</span> <span>reactor.core.publisher.Mono</span><span>;</span><span>@Controller</span><span>(</span><span>"/files"</span><span>)</span><span>public</span> <span>class</span> <span>FileController</span> <span>{</span><span>private</span> <span>final</span> <span>HttpClient</span> <span>httpClient</span><span>;</span><span>public</span> <span>FileController</span><span>(</span><span>HttpClient</span> <span>httpClient</span><span>)</span> <span>{</span><span>this</span><span>.</span><span>httpClient</span> <span>=</span> <span>httpClient</span><span>;</span><span>}</span><span>@Get</span><span>(</span><span>uri</span><span>=</span><span>"/message"</span><span>,</span> <span>produces</span> <span>=</span> <span>"text/plain;charset=utf-8"</span><span>)</span><span>public</span> <span>Mono</span><span><</span><span>String</span><span>></span> <span>getShiftJisText</span><span>()</span> <span>throws</span> <span>IOException</span> <span>{</span><span>HttpRequest</span><span><?></span> <span>req</span> <span>=</span> <span>HttpRequest</span><span>.</span><span>GET</span><span>(</span><span>"http://localhost:8085/sample/shiftjis"</span><span>);</span><span>return</span> <span>Mono</span><span>.</span><span>from</span><span>(</span><span>httpClient</span><span>.</span><span>retrieve</span><span>(</span><span>req</span><span>));</span><span>}</span><span>}</span><span>package</span> <span>jp.masanori.websample</span><span>;</span> <span>import</span> <span>java.io.File</span><span>;</span> <span>import</span> <span>java.io.IOException</span><span>;</span> <span>import</span> <span>java.nio.file.Files</span><span>;</span> <span>import</span> <span>java.io.InputStreamReader</span><span>;</span> <span>import</span> <span>java.io.ByteArrayInputStream</span><span>;</span> <span>import</span> <span>java.io.BufferedReader</span><span>;</span> <span>import</span> <span>com.fasterxml.jackson.core.JsonProcessingException</span><span>;</span> <span>import</span> <span>com.fasterxml.jackson.databind.ObjectMapper</span><span>;</span> <span>import</span> <span>io.micronaut.core.io.buffer.ByteBuffer</span><span>;</span> <span>import</span> <span>io.micronaut.http.HttpHeaders</span><span>;</span> <span>import</span> <span>io.micronaut.http.HttpRequest</span><span>;</span> <span>import</span> <span>io.micronaut.http.HttpResponse</span><span>;</span> <span>import</span> <span>io.micronaut.http.HttpStatus</span><span>;</span> <span>import</span> <span>io.micronaut.http.MediaType</span><span>;</span> <span>import</span> <span>io.micronaut.http.annotation.Controller</span><span>;</span> <span>import</span> <span>io.micronaut.http.annotation.Get</span><span>;</span> <span>import</span> <span>io.micronaut.http.annotation.Part</span><span>;</span> <span>import</span> <span>io.micronaut.http.annotation.Post</span><span>;</span> <span>import</span> <span>io.micronaut.http.client.HttpClient</span><span>;</span> <span>import</span> <span>io.micronaut.http.multipart.CompletedFileUpload</span><span>;</span> <span>import</span> <span>jp.masanori.dto.ComputeResult</span><span>;</span> <span>import</span> <span>jp.masanori.dto.ComputingStatusRequest</span><span>;</span> <span>import</span> <span>reactor.core.publisher.Mono</span><span>;</span> <span>@Controller</span><span>(</span><span>"/files"</span><span>)</span> <span>public</span> <span>class</span> <span>FileController</span> <span>{</span> <span>private</span> <span>final</span> <span>HttpClient</span> <span>httpClient</span><span>;</span> <span>public</span> <span>FileController</span><span>(</span><span>HttpClient</span> <span>httpClient</span><span>)</span> <span>{</span> <span>this</span><span>.</span><span>httpClient</span> <span>=</span> <span>httpClient</span><span>;</span> <span>}</span> <span>@Get</span><span>(</span><span>uri</span><span>=</span><span>"/message"</span><span>,</span> <span>produces</span> <span>=</span> <span>"text/plain;charset=utf-8"</span><span>)</span> <span>public</span> <span>Mono</span><span><</span><span>String</span><span>></span> <span>getShiftJisText</span><span>()</span> <span>throws</span> <span>IOException</span> <span>{</span> <span>HttpRequest</span><span><?></span> <span>req</span> <span>=</span> <span>HttpRequest</span><span>.</span><span>GET</span><span>(</span><span>"http://localhost:8085/sample/shiftjis"</span><span>);</span> <span>return</span> <span>Mono</span><span>.</span><span>from</span><span>(</span><span>httpClient</span><span>.</span><span>retrieve</span><span>(</span><span>req</span><span>));</span> <span>}</span> <span>}</span>package jp.masanori.websample; import java.io.File; import java.io.IOException; import java.nio.file.Files; import java.io.InputStreamReader; import java.io.ByteArrayInputStream; import java.io.BufferedReader; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import io.micronaut.core.io.buffer.ByteBuffer; import io.micronaut.http.HttpHeaders; import io.micronaut.http.HttpRequest; import io.micronaut.http.HttpResponse; import io.micronaut.http.HttpStatus; import io.micronaut.http.MediaType; import io.micronaut.http.annotation.Controller; import io.micronaut.http.annotation.Get; import io.micronaut.http.annotation.Part; import io.micronaut.http.annotation.Post; import io.micronaut.http.client.HttpClient; import io.micronaut.http.multipart.CompletedFileUpload; import jp.masanori.dto.ComputeResult; import jp.masanori.dto.ComputingStatusRequest; import reactor.core.publisher.Mono; @Controller("/files") public class FileController { private final HttpClient httpClient; public FileController(HttpClient httpClient) { this.httpClient = httpClient; } @Get(uri="/message", produces = "text/plain;charset=utf-8") public Mono<String> getShiftJisText() throws IOException { HttpRequest<?> req = HttpRequest.GET("http://localhost:8085/sample/shiftjis"); return Mono.from(httpClient.retrieve(req)); } }
Enter fullscreen mode Exit fullscreen mode
But when I receive a Shift-JIS encoded file, the values will be garbled.
sample.txt
こんにちはこんにちはこんにちは
Enter fullscreen mode Exit fullscreen mode
FileController.java
<span>...</span><span>@Get</span><span>(</span><span>uri</span><span>=</span><span>"/message"</span><span>,</span> <span>produces</span> <span>=</span> <span>"text/plain;charset=utf-8"</span><span>)</span><span>public</span> <span>Mono</span><span><</span><span>String</span><span>></span> <span>getShiftJisText</span><span>()</span> <span>throws</span> <span>IOException</span> <span>{</span><span>HttpRequest</span><span><?></span> <span>req</span> <span>=</span> <span>HttpRequest</span><span>.</span><span>GET</span><span>(</span><span>"http://localhost:8085/sample.txt"</span><span>);</span><span>return</span> <span>Mono</span><span>.</span><span>from</span><span>(</span><span>httpClient</span><span>.</span><span>retrieve</span><span>(</span><span>req</span><span>));</span><span>}</span><span>...</span><span>...</span> <span>@Get</span><span>(</span><span>uri</span><span>=</span><span>"/message"</span><span>,</span> <span>produces</span> <span>=</span> <span>"text/plain;charset=utf-8"</span><span>)</span> <span>public</span> <span>Mono</span><span><</span><span>String</span><span>></span> <span>getShiftJisText</span><span>()</span> <span>throws</span> <span>IOException</span> <span>{</span> <span>HttpRequest</span><span><?></span> <span>req</span> <span>=</span> <span>HttpRequest</span><span>.</span><span>GET</span><span>(</span><span>"http://localhost:8085/sample.txt"</span><span>);</span> <span>return</span> <span>Mono</span><span>.</span><span>from</span><span>(</span><span>httpClient</span><span>.</span><span>retrieve</span><span>(</span><span>req</span><span>));</span> <span>}</span> <span>...</span>... @Get(uri="/message", produces = "text/plain;charset=utf-8") public Mono<String> getShiftJisText() throws IOException { HttpRequest<?> req = HttpRequest.GET("http://localhost:8085/sample.txt"); return Mono.from(httpClient.retrieve(req)); } ...
Enter fullscreen mode Exit fullscreen mode
Result
����ɂ�������ɂ�������ɂ���
Enter fullscreen mode Exit fullscreen mode
To prevent this, I should set the encoding to receive data.
<span>...</span><span>@Get</span><span>(</span><span>uri</span><span>=</span><span>"/message"</span><span>,</span> <span>produces</span> <span>=</span> <span>"text/plain;charset=utf-8"</span><span>)</span><span>public</span> <span>Mono</span><span><</span><span>String</span><span>></span> <span>getShiftJisText</span><span>()</span> <span>throws</span> <span>IOException</span> <span>{</span><span>HttpRequest</span><span><?></span> <span>req</span> <span>=</span> <span>HttpRequest</span><span>.</span><span>GET</span><span>(</span><span>"http://localhost:8085/sample.txt"</span><span>)</span><span>.</span><span>contentType</span><span>(</span><span>MediaType</span><span>.</span><span>TEXT_JSON_TYPE</span><span>);</span><span>// receiving data as ByteBuffer</span><span>HttpResponse</span><span><</span><span>ByteBuffer</span><span>></span> <span>res</span> <span>=</span> <span>Mono</span><span>.</span><span>from</span><span>(</span><span>httpClient</span><span>.</span><span>exchange</span><span>(</span><span>req</span><span>,</span> <span>ByteBuffer</span><span>.</span><span>class</span><span>)).</span><span>block</span><span>();</span><span>if</span><span>(</span><span>res</span><span>.</span><span>status</span><span>()</span> <span>!=</span> <span>HttpStatus</span><span>.</span><span>OK</span><span>)</span> <span>{</span><span>return</span> <span>Mono</span><span>.</span><span>empty</span><span>();</span><span>}</span><span>// set encoding and read data</span><span>try</span><span>(</span><span>ByteArrayInputStream</span> <span>input</span> <span>=</span> <span>new</span> <span>ByteArrayInputStream</span><span>(</span><span>res</span><span>.</span><span>body</span><span>().</span><span>toByteArray</span><span>());</span><span>BufferedReader</span> <span>br</span> <span>=</span> <span>new</span> <span>BufferedReader</span><span>(</span><span>new</span> <span>InputStreamReader</span><span>(</span><span>input</span><span>,</span> <span>"SJIS"</span><span>)))</span> <span>{</span><span>String</span> <span>line</span> <span>=</span> <span>""</span><span>;</span><span>StringBuilder</span> <span>result</span> <span>=</span> <span>new</span> <span>StringBuilder</span><span>();</span><span>while</span><span>((</span><span>line</span> <span>=</span> <span>br</span><span>.</span><span>readLine</span><span>())</span> <span>!=</span> <span>null</span><span>)</span> <span>{</span><span>result</span><span>.</span><span>append</span><span>(</span><span>String</span><span>.</span><span>format</span><span>(</span><span>"%s%s"</span><span>,</span> <span>line</span><span>,</span> <span>"\r\n"</span><span>));</span><span>}</span><span>return</span> <span>Mono</span><span>.</span><span>just</span><span>(</span><span>result</span><span>.</span><span>toString</span><span>());</span><span>}</span><span>catch</span><span>(</span><span>IOException</span> <span>e</span><span>)</span> <span>{</span><span>}</span><span>return</span> <span>Mono</span><span>.</span><span>empty</span><span>();</span><span>}</span><span>...</span><span>...</span> <span>@Get</span><span>(</span><span>uri</span><span>=</span><span>"/message"</span><span>,</span> <span>produces</span> <span>=</span> <span>"text/plain;charset=utf-8"</span><span>)</span> <span>public</span> <span>Mono</span><span><</span><span>String</span><span>></span> <span>getShiftJisText</span><span>()</span> <span>throws</span> <span>IOException</span> <span>{</span> <span>HttpRequest</span><span><?></span> <span>req</span> <span>=</span> <span>HttpRequest</span><span>.</span><span>GET</span><span>(</span><span>"http://localhost:8085/sample.txt"</span><span>)</span> <span>.</span><span>contentType</span><span>(</span><span>MediaType</span><span>.</span><span>TEXT_JSON_TYPE</span><span>);</span> <span>// receiving data as ByteBuffer</span> <span>HttpResponse</span><span><</span><span>ByteBuffer</span><span>></span> <span>res</span> <span>=</span> <span>Mono</span><span>.</span><span>from</span><span>(</span><span>httpClient</span><span>.</span><span>exchange</span><span>(</span><span>req</span><span>,</span> <span>ByteBuffer</span><span>.</span><span>class</span><span>)).</span><span>block</span><span>();</span> <span>if</span><span>(</span><span>res</span><span>.</span><span>status</span><span>()</span> <span>!=</span> <span>HttpStatus</span><span>.</span><span>OK</span><span>)</span> <span>{</span> <span>return</span> <span>Mono</span><span>.</span><span>empty</span><span>();</span> <span>}</span> <span>// set encoding and read data</span> <span>try</span><span>(</span><span>ByteArrayInputStream</span> <span>input</span> <span>=</span> <span>new</span> <span>ByteArrayInputStream</span><span>(</span><span>res</span><span>.</span><span>body</span><span>().</span><span>toByteArray</span><span>());</span> <span>BufferedReader</span> <span>br</span> <span>=</span> <span>new</span> <span>BufferedReader</span><span>(</span><span>new</span> <span>InputStreamReader</span><span>(</span><span>input</span><span>,</span> <span>"SJIS"</span><span>)))</span> <span>{</span> <span>String</span> <span>line</span> <span>=</span> <span>""</span><span>;</span> <span>StringBuilder</span> <span>result</span> <span>=</span> <span>new</span> <span>StringBuilder</span><span>();</span> <span>while</span><span>((</span><span>line</span> <span>=</span> <span>br</span><span>.</span><span>readLine</span><span>())</span> <span>!=</span> <span>null</span><span>)</span> <span>{</span> <span>result</span><span>.</span><span>append</span><span>(</span><span>String</span><span>.</span><span>format</span><span>(</span><span>"%s%s"</span><span>,</span> <span>line</span><span>,</span> <span>"\r\n"</span><span>));</span> <span>}</span> <span>return</span> <span>Mono</span><span>.</span><span>just</span><span>(</span><span>result</span><span>.</span><span>toString</span><span>());</span> <span>}</span><span>catch</span><span>(</span><span>IOException</span> <span>e</span><span>)</span> <span>{</span> <span>}</span> <span>return</span> <span>Mono</span><span>.</span><span>empty</span><span>();</span> <span>}</span> <span>...</span>... @Get(uri="/message", produces = "text/plain;charset=utf-8") public Mono<String> getShiftJisText() throws IOException { HttpRequest<?> req = HttpRequest.GET("http://localhost:8085/sample.txt") .contentType(MediaType.TEXT_JSON_TYPE); // receiving data as ByteBuffer HttpResponse<ByteBuffer> res = Mono.from(httpClient.exchange(req, ByteBuffer.class)).block(); if(res.status() != HttpStatus.OK) { return Mono.empty(); } // set encoding and read data try(ByteArrayInputStream input = new ByteArrayInputStream(res.body().toByteArray()); BufferedReader br = new BufferedReader(new InputStreamReader(input, "SJIS"))) { String line = ""; StringBuilder result = new StringBuilder(); while((line = br.readLine()) != null) { result.append(String.format("%s%s", line, "\r\n")); } return Mono.just(result.toString()); }catch(IOException e) { } return Mono.empty(); } ...
Enter fullscreen mode Exit fullscreen mode
Result
こんにちはこんにちはこんにちは
Enter fullscreen mode Exit fullscreen mode
原文链接:[Micronaut] Receiving Japanese(Shift-JIS) data as HTTPResponse
暂无评论内容