Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
0
Help us understand the problem. What is going on with this article?
@ponsuke0531

curlのレスポンスをデコードする

# レスポンスをURLデコードしたい
$ curl {URL} | nkf -w --url-input
# レスポンスをUnicodeデコードしたい
$ curl {URL} | sed 's/\\\u\(....\)/\&#x\1;/g' | nkf -w --numchar-input
nkfのオプション 意味
-w UTF-8コードを出力する
--url-input URLデコードする
--numchar-input Unicodeをデコードする

curlのレスポンスが読めない

  • 環境
    • macOS BigSur バージョン11.1
    • nkf : Network Kanji Filter Version 2.1.5

ことの発端は、政府統計の総合窓口(e-Stat)のAPIを使おうとた。
とりあえずcurlしてみた。
読めない!
アプリケーションIDが「hoge」だから認証エラーになっているはずだが、読めない!これじゃエラーじゃなくなっても読めない!

$ curl -X GET -H 'Content-Type:application/json;charset=utf-8' http://api.e-stat.go.jp/rest/3.0/app/json/getStatsList?appId=hoge
{"GET_STATS_LIST":{"RESULT":{"STATUS":100,"ERROR_MSG":"\u8A8D\u8A3C\u306B\u5931\u6557\u3057\u307E\u3057\u305F\u3002\u30A2\u30D7\u30EA\u30B1\u30FC\u30B7\u30E7\u30F3ID\u3092\u78BA\u8A8D\u3057\u3066\u4E0B\u3055\u3044\u3002","DATE":"2021-02-10T21:15:32.959+09:00"},"PARAMETER":{"DATA_FORMAT":"J"}}}%                                                       

URLデコードしたら・・・読めなかった

URLの16進数みたいなのとUnicodeがいつもごちゃごちゃな私。

$ curl -X GET -H 'Content-Type:application/json;charset=utf-8' http://api.e-stat.go.jp/rest/3.0/app/json/getStatsList?appId=hoge | nkf -w --url-input
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   294  100   294    0     0   6000      0 --:--:-- --:--:-- --:--:--  6000
{"GET_STATS_LIST":{"RESULT":{"STATUS":100,"ERROR_MSG":"\u8A8D\u8A3C\u306B\u5931\u6557\u3057\u307E\u3057\u305F\u3002\u30A2\u30D7\u30EA\u30B1\u30FC\u30B7\u30E7\u30F3ID\u3092\u78BA\u8A8D\u3057\u3066\u4E0B\u3055\u3044\u3002","DATE":"2021-02-10T21:40:47.941+09:00"},"PARAMETER":{"DATA_FORMAT":"J"}}}%                                                       

レスポンスはUnicodeだった・・・

Unicodeでデコードしても読めない!

$ curl -X GET -H 'Content-Type:application/json;charset=utf-8' http://api.e-stat.go.jp/rest/3.0/app/json/getStatsList?appId=hoge | nkf -w --numchar-input
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   294  100   294    0     0   3585      0 --:--:-- --:--:-- --:--:--  3542
{"GET_STATS_LIST":{"RESULT":{"STATUS":100,"ERROR_MSG":"\u8A8D\u8A3C\u306B\u5931\u6557\u3057\u307E\u3057\u305F\u3002\u30A2\u30D7\u30EA\u30B1\u30FC\u30B7\u30E7\u30F3ID\u3092\u78BA\u8A8D\u3057\u3066\u4E0B\u3055\u3044\u3002","DATE":"2021-02-10T21:53:55.930+09:00"},"PARAMETER":{"DATA_FORMAT":"J"}}}%                                                       

あぁ!&#始まりで';'終わりじゃなきゃだめなのか!

--cap-input, --url-input
それぞれ :、% に続く 16 進数を文字に変換する
--numchar-input
&#....; のような Unicode 文字参照を変換する
nkf - コマンド (プログラム) の説明 - Linux コマンド集 一覧表

\u&#;に置換するのエスケープ多くて面倒だなぁと思ったら素敵な答えがあった。感謝です。

sed 's/\\\u\(....\)/\&#x\1;/g' | nkf --numchar-input -w
【5秒で使える小ネタ】Unicodeエスケープされた文字列をデコードする - Qiita

$ curl -X GET -H 'Content-Type:application/json;charset=utf-8' http://api.e-stat.go.jp/rest/3.0/app/json/getStatsList?appId=hoge | sed 's/\\\u\(....\)/\&#x\1;/g' | nkf -w --numchar-input
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   294  100   294    0     0   5157      0 --:--:-- --:--:-- --:--:--  5157
{"GET_STATS_LIST":{"RESULT":{"STATUS":100,"ERROR_MSG":"認証に失敗しました。アプリケーションIDを確認して下さい。","DATE":"2021-02-10T22:06:13.754+09:00"},"PARAMETER":{"DATA_FORMAT":"J"}}}% 

そもそもcurlでそんなに頑張らなくてもPostmanかなんか使えばいいんだけどね。これもお勉強です。

0
Help us understand the problem. What is going on with this article?
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ponsuke0531
びっくりするほど物覚えが悪いが、エンジニアを目指しています。

Comments

No comments
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login
0
Help us understand the problem. What is going on with this article?