2016-05-18 8 views
1

文字列をURLエンコードしてURLに埋め込む方法を教えてください。私はであり、ではGETまたはPOSTデータを取得しようとしていないので、curlの-G--data--data-urlencodeのオプションは機能していないようです。例えばbashまたはcurlを使用してURLにデータをurlencodeする方法

、希望されない

curl http://example.com/foo?bar=spaced%20data" 

と機能的に同等であろう

curl -G http://example.com/foo --data-urlencode "bar=spaced data" 

を使用した場合。

私は文字列foo/barを持っています。文字列はfoo%2fbarであり、URLに埋め込まれている必要があります。 (私はこのような何かを見つけることができれば)urlencode機能のいくつかの種類が存在する場合

curl http://example.com/api/projects/foo%2fbar/events 

一つの仮想的な解決策は、bashで前処理したデータをだろう。

DATA=foo/bar 
ENCODED=`urlencode $DATA` 
curl http://example.com/api/projects/${ENCODED}/events 

別の仮想的な解決策(私はこのような何かを見つけることができれば)これに似たカールでいくつかのスイッチを、次のようになります。

curl http://example.com/api/projects/{0}/events --string-urlencode "0=foo/bar" 

私はこの質問への答えを探しています具体的な理由Gitlab APIです。たとえば、gitlab get single projectNAMESPACE/PROJECT_NAMEはURLエンコードされます(例: /api/v3/projects/diaspora%2Fdiaspora/%2Fで表される)。これに加えて、プロジェクトの個々のプロパティをリクエストできるので、URLはhttp://example.com/projects/diaspora%2Fdiaspora/eventsとなります。

この質問はgitlab固有のものですが、一般的にはREST APIに一般的に当てはまると思います私はstackoverflowまたはインターネット検索で既存の答えを見つけることができません驚いた。

+0

'urlencode $ DATA'は 'DATA = '*' '(ファイル名のリストをエンコードしてグロブを展開する)が悪い場合に動作します。 '' $ DATA ''にする必要があります。また、http://pubs.opengroup.org/onlinepubs/009695399/basedefs/xbd_chap08.htmlガイドラインre:変数名(第4段落)を参照してください。シェルツールとシステムツールは、操作に影響する変数に大文字の名前を使用します。少なくとも1つの小文字の名前は、アプリケーション用に予約されています。環境変数とシェル変数は名前空間を共有するため、これは通常の(エクスポートされていない)名前にも適用されます。 –

+0

ご参考までに、Orwellophileの回答をhttp://japan.stackoverflow.com/a/10660730/14122の公式ではない質問に載せてみましたか? –

+0

この質問にかなり近いと思われます:http://stackoverflow.com/questions/29755942/possible-to-urlencode-a-variable-in-a-shell-scriptには他にも、関数。 – swa66

答えて

2

あなたが提案するurlencode機能を実装するのは簡単です:

urlencode() { 
    python -c 'import urllib, sys; print urllib.quote(sys.argv[1], sys.argv[2])' \ 
    "$1" "$urlencode_safe" 
} 

...として使用する:あなたは、文字通りに通過されているいくつかの文字を持っているしたい場合は

data=foo/bar 
encoded=$(urlencode "$data") 
curl "http://example.com/api/projects/${encoded}/events" 

- 中多くのユースケースでは、これは/ sには望ましいです - 代わりに:

encoded=$(urlencode_safe='/' urlencode "$data") 
+3

FWIW、 'jq'がインストールされていれば、少し短い' printf%s "$ 1" |を使うことができます。 jq -s -R -r @ uri' – rici

関連する問題