¿Cómo codificar datos en URL para el comando curl?

Resuelto Aaron asked hace 16 años • 38 respuestas

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 $@
Aaron avatar Nov 18 '08 02:11 Aaron
Aceptado

Usar curl --data-urlencode; de man curl:

Esto publica datos, similar a las otras --dataopciones, 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 -Vpara 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
Jacob Rask avatar Jan 08 '2010 13:01 Jacob Rask

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 -sRrcon -Rrsi 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'
nisetama avatar Dec 22 '2015 02:12 nisetama