◆結論
「yarn add qs」しろ。typescript使ってる人は「yarn add @types/qs」しろ。yarn使ってないならnpm使え。帰れバカ。やめちまえ。
使い方は…普通にimportして使え。わかんないならやめちまえ。
★補足
・「hogehoge.com」は実際には「.env」に定義された環境変数だろう。何言ってるかわからないなら無視しろ。
・baseURLでテンプレート文字列使ってるのは、「/api」とかを付け足すため。
◆何が起きたか
ASP.NETでAPIサーバー立てて、HttpGetの口をはやした。画面からaxiosでもってnestedなデータをGETメソッドで送った。[FromQuery]Attributeを指定したclassにbindされなかった。nullになった。一筋の涙が頬を伝った。
◆調査
3分くらい地団駄を踏みながら絶叫しつつ調査をした。以下のページが見つかった。
Did you try something like this ?
FromQuery Nested Model Binding
y.prop1=value
あー…。…うん?
画面から以下の構造なパラメータを渡してGETを叩いた。
interface GetHogeParameter { foo: number, bar: { baz: number } }
ChromeくんのF12からNetwork開いてクエリを確認した
https://localhost:44304/api/hoge?foo=1&bar=%7B%22baz%22:2%7D
このページでURLデコードした。
https://localhost:44304/api/hoge?foo=1&bar={"baz":2}
おーーー!(歓喜)(殺意)
◆変えよう
「axios nested params」でググったら以下のissueを発見。
以下のコメントを発見。
https://github.com/axios/axios/issues/738#issuecomment-412905574
// Format nested params correctly axios.interceptors.request.use(config => { window.console.log(config); config.paramsSerializer = params => { // Qs is already included in the Axios package return Qs.stringify(params, { arrayFormat: "brackets", encode: false }); }; return config; });
はいはい。qsを弄ればいいのね。qsを見に行こう。
「dot」とページ検索した結果、以下を発見。
Option allowDots can be used to enable dot notation:
var withDots = qs.parse(‘a.b=c’, { allowDots: true });
assert.deepEqual(withDots, { a: { b: ‘c’ } });
「あーーーーーー♨」と言いながら処理をかませた結果「結論」のコードに至った。画面からもっかいAPI叩いた。
https://localhost:44304/api/hoge?foo=1&bar.baz=2
クラスにちゃんとバインドされた。終わり!閉廷!
◆注意
さっきのaxiosのIssueコメントに
UPDATE 2019-07-26: Qs is no longer part of the axios package, so you will need to add this to your package.json if you want this to work.
とか書かれてたから、qsはちゃんと自分でaddしてくれや。
◆結論(にかいめ)
ネストしてるやーつの標準を定めろ無能ども。
コメントを残す