HTTP通信でjson形式のデータをサーバーAPIにPOSTしたい

質問

〇Content-Type: application/jsonの場合にエンコーディングの指定は必要か。
〇根本的にjson形式のデータをPOSTする方法が間違っているか。
以下の現象に関して、解決策や問題点が思い当たる方がいらっしゃれば、ぜひ教えていただけますでしょうか。
よろしくお願いいたします。

実現したいこと

C#

1// POST: api/PushMsg2 [HttpPost]3 public bool PushMessage([FromBody] string value)4 {5 try 6 {7 Logger.log(Logger.INFO, "Apnsサーバーに送信処理開始(クライアントから受信直後)");8 Logger.log(Logger.INFO, value, true);9 PushMessage msg = JsonConvert.DeserializeObject<PushMessage>(value);10 var ret = SendMessage(msg);11 Logger.log(Logger.INFO, "Apnsサーバーに送信正常終了", true);12 return ret.Result;13 }14 catch(Exception ex)15 {16 Logger.log(Logger.ERROR, "送信異常終了 => " + ex.Message, true);17 return false;18 }19 }

URL:http://IPアドレス:ポート番号/サーバー名/API/PushMsg
Header:Content-Type: application/json\r\n
HTTPBody:以下の文字列(CString)をバッファ(char*)の格納して ”POST”
{"userNo":4,"member":[12,16],"category":"comment","detail":{"commentId":10282,"talkId":36},"title":"新規コメント","message":"新規コメントがあります。","appId":"製品識別用ID","sound":"default"}

で上記APIにjson形式の文字列をPOSTしたい

発生している問題・エラーメッセージ

System.Text.DecoderFallbackException: Unable to translate bytes [82][DC] at index 116 from specified code page to Unicode.……

検証内容

Header: application/json; charset=UNICODE
とすると、API/PushMsgにたどり着いて文字列を渡すことができるが、
引数で受け取る文字列が文字化けしてしまった。
例)≻獵牥潎㨢㜳∬敭扭牥㨢ㅛ崲∬灡䥰≤∺獡牴獯慴敧䄮瑳潲慔歬Ⱒ琢瑩敬㨢丢睥敍獳条≥∬敭獳条≥∺潙⁵慨敶愠丠睥䴠獥慳敧∮∬慣整潧祲㨢挢浯敭瑮Ⱒ搢瑥楡≬笺挢浯敭瑮摉㨢㤱㠶ⰰ琢污䥫≤㈺紱∬潳湵≤∺敤慦汵≴}

そこで検証用にPOSTされた文字列を受け取って、そのまま返すだけのAPIを用意して検証してみた。↓

C#

1[HttpPost("TestFunc")]2 public string TestFunc()3 {4 var postData = "";5 using (var reader = new System.IO.StreamReader(HttpContext.Request.Body))6 {7 postData = reader.ReadToEnd();8 // Process the post data as needed9 // ...10 Logger.log(Logger.INFO, " postData :" + postData, true);11 }12 13 return postData != null ? postData : "no post body";14 }

URL:http://IPアドレス:ポート番号/サーバー名/API/PushMsg/TestFunc
Header:Content-Type: text/plain\r\n
HTTPBody:同様

これを実行してデバックすると、
{"userNo":37,"member":[12],"appId":"製品識別用ID","title":"�V�K���b�Z�[�W","message":"�V�K�̃��b�Z�[�W������܂��B","category":"comment","detail":{"commentId":19674,"talkId":21},"sound":"default"}
上記のように、漢字平仮名部分のみが文字化けしてしまいました。

【現状の原因調査結果・考察】

・そもそもHeaderにて、application/jsonを指定した時点で、エンコーディングはUTF-8で実行されるという認識のため、HeaderのContent-Typeでcharsetの指定は不要なのではないかと考えています。
ちなみに、charset=UTF8などいくつか試したが、APIを呼べたのはcharset=UNICODEとcharset=UTF-16のみでした(いずれも渡した文字列は文字化け)。

・漢字平仮名の文字化けの様子を見るに、Shift-JisからUTF-8に変換した際の文字化けと思われます。

補足情報(FW/ツールのバージョンなど)

【開発環境】
(アプリ)
フレームワーク:MFC
言語:C++
プロジェクトの文字セット:UNICODE

(サーバ)
フレームワーク:.Net Core 3.1
言語:C#

コメントを投稿

0 コメント