2016-09-09 13 views
2

javascript Fetch APIを使用してPOSTリクエストをAPIに送信しようとしています。 Chrome、FF、IE 11(polyfillを使用)ではすべて正常に動作しますが、Microsoft Edgeでは動作しません(コンソールは&のネットワークタブは空です)。これは、ラテンのテキストをparamsとして送信する場合にのみ機能します。例えば、私はこのコードを実行すると:Microsoft Edgeの英語以外の文字でFetch APIが動作しない

fetch(API_URL, { 
    method: 'POST', 
    body: JSON.stringify({ str: '테스트'}) 
}) 
.then((data) => console.log(data)) 
.catch((err) => { 
    console.error('fetch error:', error); 
    throw error; 
}); 

をそれは何もしませんが、私は「いくつかのラテン語テキスト」に「STR」の値を変更すると、それが正常に動作します(API &に正しい要求を送信し、応答を受け取ります)。

ご協力いただければ幸いです。

UPDATE#1:MicrosoftのWebサイト上の

問題:fetch() with unicode characters in request body fails with TypeMismatchError

+0

あなたはエンコードのヘッダーをどのように設定した場合は? – diegoaguilar

+0

@diegoaguilarどのような正確にヘッダーを意味しますか? – Inf

+0

"動作しません"とはどういう意味ですか?間違いはありますか?あなたのサーバーはどんなリクエストを受け取りますか? – Bergi

答えて

2

内部的には、JavaScriptの文字列はUTF-16としてエンコードされています。 Edgeが別のエンコーディングにデフォルトで変換しないように見えて、体がコンフィグレーションされた(または仮定されている?)Content-typeと互換性がないと判断した場合、TypeMismatchErrorがスローされます。

この問題に対する修正は、ペイロードのJSON表現で、すべての非ASCII文字をエスケープすることです:

function encodePayload(payload) { 
    return JSON.stringify(payload). 
     replace(/[\u007F-\uFFFF]/g, function (c) { 
      return "\\u" + ("0000" + c.charCodeAt(0).toString(16)).substr(-4); 
     }); 
} 

fetch(API_URL, { 
    method: 'POST', 
    body: encodePayload({ str: '테스트'}) 
}) 
関連する問題