[Micronaut] Receiving Japanese(Shift-JIS) data as HTTPResponse

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

© 版权声明
THE END
喜欢就支持一下吧
点赞7 分享
So what if we fall down? At least we are still young.
摔倒了又怎样,至少我们还年轻
评论 抢沙发

请登录后发表评论

    暂无评论内容