2016-11-17 15 views
0

JSONオブジェクト内にそのコードを渡す必要があるサービスプロバイダにコードのスニペットをアップロードするための小さなスクリプトを作成しようとしています。Curlを使用してオブジェクトJSONの一部としてコードファイルを渡します

file_content=$(<my_file.js) 
curl -X POST -H "Content-Type: application/json" 
    -d '{"name":$file_name","script":"$file_content"}' https://someservice.com/api/endpoint 

ここで、file_contentはmy_file内のjavascriptコードです。問題はそのように印刷され、ペイロードは無効です。私はそれが有効なjsonの方法でそのファイルを読む方法を見つけることを試みています。私はそれがむしろ特異だが、そのようなコマンドが存在するかどうか疑問に思う。

編集:もう一つの選択肢は、JSONオブジェクト全体をファイルに配置することですが、可能ならばそれを避けたいと思います。

+0

の可能な複製を[curlコマンドラインを使用して/ポストxmlファイルを送信] (http://stackoverflow.com/questions/3007253/send-post-xml-file-using-curl-command-line) – Tomalak

+0

@Tomalakそれは似ていますが、JSONオブジェクト全体をファイル自体に移動する必要があります。私が解決策を見つけることができない場合は、私はこのために行くでしょう。 – acadavid

答えて

1

非常に単純な場合を除いて、JSON、つまり文字列補間を使用してJSONを構築することはできません。ファイルのコンテンツをJSON文字列に入れるのは単純なケースではありません。

実際のJSONシリアライザでJSONを構築する必要があります。 Pythonはこのようなシリアライザを持っているので、Pythonにそのような作業をさせるのは簡単です。

# from http://stackoverflow.com/a/13466143 
json_escape() { 
    printf '%s' $1 | python -c 'import json,sys; print(json.dumps(sys.stdin.read()))' 
} 

ので、あなたが適切な値のエンコードを行うことができます。

file_content=$(<my_file.js) 
json_file_name=$(json_escape "fancy filename") 
json_file_content=$(json_escape "$file_content") 
json='{"name":'$json_file_name',"script":'$json_file_content'}' 

curl -X POST -H "Content-Type: application/json" -d "$json" https://someservice.com/api/endpoint 
+0

はい、私がやろうとしていたことは、もっと基本的なツールを使うのはやや不合理だと思います。あなたの助けをありがとう! – acadavid

+0

bashには適切なJSON処理がありません。これまでに見つかったことはすべて間違っているか、外部ツールを使用しています。 JSON操作用ツール(https://stedolan.github.io/jq/など)がありますが、標準的なLinuxディストリビューションではない可能性が高いため、移植性が問題になります。しかし、Pythonは利用可能性が高く、成熟しており高速です。すべてのスクリプトがAPIにデータを送信する場合は、Pythonスクリプトに完全に変換することをお勧めします。 Pythonを使ってHTTPリクエストを作成し、レスポンスを処理することができます。 – Tomalak

+1

合意。最終的に私はRubyスクリプトを使いましたが、これは簡単で簡単でした。私はこのアイデアで遊んでいましたが、最終的には適切なツールを使ってそれを行う方が簡単です。 – acadavid

0

使用jqのJSONシリアライズ機能:

cat my_file.js | jq '@json' 
関連する問題