¿Cómo codificar datos en URL para el comando curl?
Estoy intentando escribir un script bash para realizar pruebas que tome un parámetro y lo envíe a través de curl al sitio web. Necesito codificar la URL del valor para asegurarme de que los caracteres especiales se procesen correctamente. ¿Cuál es la mejor manera de hacer esto?
Aquí está mi script básico hasta ahora:
#!/bin/bash
host=${1:?'bad host'}
value=$2
shift
shift
curl -v -d "param=${value}" http://${host}/somepath $@
Usar curl --data-urlencode
; de man curl
:
Esto publica datos, similar a las otras
--data
opciones, con la excepción de que realiza codificación de URL. Para ser compatible con CGI, la<data>
pieza debe comenzar con un nombre seguido de un separador y una especificación de contenido.
Uso de ejemplo:
curl \
--data-urlencode "paramName=value" \
--data-urlencode "secondParam=value" \
http://example.com
Consulte la página de manual para obtener más información.
Esto requiere curl 7.18.0 o posterior (lanzado en enero de 2008) . Úselo curl -V
para verificar qué versión tiene.
También puedes codificar la cadena de consulta :
curl --get \
--data-urlencode "p1=value 1" \
--data-urlencode "p2=value 2" \
http://example.com
# http://example.com?p1=value%201&p2=value%202
Otra opción es utilizar jq
:
$ printf %s 'input text'|jq -sRr @uri
input%20text
$ jq -rn --arg x 'input text' '$x|@uri'
input%20text
-r
( --raw-output
) genera el contenido sin formato de las cadenas en lugar de los literales de cadena JSON. -n
( --null-input
) no lee la entrada de STDIN.
-R
( --raw-input
) trata las líneas de entrada como cadenas en lugar de analizarlas como JSON, y -sR
( --slurp --raw-input
) lee la entrada en una sola cadena. Puede reemplazar -sRr
con -Rr
si su entrada solo contiene una sola línea o si no desea reemplazar los avances de línea con %0A
:
$ printf %s\\n multiple\ lines of\ text|jq -Rr @uri
multiple%20lines
of%20text
$ printf %s\\n multiple\ lines of\ text|jq -sRr @uri
multiple%20lines%0Aof%20text%0A
O este porcentaje codifica todos los bytes:
xxd -p|tr -d \\n|sed 's/../%&/g'