Respuestas:
A continuación, le mostramos cómo puede depurar las solicitudes CORS con curl.
Envío de una solicitud CORS regular utilizando cUrl:
curl -H "Origin: http://example.com" --verbose \
https://www.googleapis.com/discovery/v1/apis?fields=
La -H "Origin: http://example.com"
bandera es el dominio de terceros que realiza la solicitud. Sustituir en cualquiera que sea su dominio.
El --verbose
indicador imprime la respuesta completa para que pueda ver los encabezados de solicitud y respuesta.
La url que estoy usando anteriormente es una solicitud de muestra a una API de Google que admite CORS, pero puede sustituirla por la url que esté probando.
La respuesta debe incluir el Access-Control-Allow-Origin
encabezado.
Enviar una solicitud de verificación previa utilizando cUrl:
curl -H "Origin: http://example.com" \
-H "Access-Control-Request-Method: POST" \
-H "Access-Control-Request-Headers: X-Requested-With" \
-X OPTIONS --verbose \
https://www.googleapis.com/discovery/v1/apis?fields=
Esto se parece a la solicitud CORS normal con algunas adiciones:
Las -H
banderas envían encabezados de solicitud de verificación previa adicionales al servidor
El -X OPTIONS
indicador indica que se trata de una solicitud de OPCIONES HTTP.
Si la solicitud de verificación previa se realiza correctamente, la respuesta debe incluir las Access-Control-Allow-Origin
, Access-Control-Allow-Methods
y Access-Control-Allow-Headers
las cabeceras de respuesta. Si la solicitud de verificación previa no tuvo éxito, estos encabezados no deberían aparecer o la respuesta HTTP no será 200.
También puede especificar encabezados adicionales, como User-Agent
, mediante el uso de la -H
bandera.
--verbose
opción, como se mencionó anteriormente.
--head
:curl -H "Origin: http://example.com" --head https://www.googleapis.com/discovery/v1/apis\?fields\=
curl -H "Access-Control-Request-Method: GET" -H "Origin: http://example.com" -I https://s3.amazonaws.com/your-bucket/file
.
curl -H "Access-Control-Request-Method: GET" -H "Origin: http://localhost" --head http://www.example.com/
Access-Control-Allow-*
entonces su recurso es compatible con CORS.Justificación de una respuesta alternativa
Busco en Google esta pregunta de vez en cuando y la respuesta aceptada nunca es lo que necesito. Primero imprime el cuerpo de respuesta, que es mucho texto. Agregar --head
salidas solo encabezados. En segundo lugar, al probar las URL de S3, debemos proporcionar un encabezado adicional -H "Access-Control-Request-Method: GET"
.
Espero que esto ahorre tiempo.
--head
hacer que curl imprima los encabezados, pero también hace que curl haga una HEAD
solicitud en lugar de a GET
. Dependiendo de lo que esté probando, es posible que desee hacer una GET
solicitud. Puedes hacer esto agregando --IXGET
.
El script bash "corstest" a continuación me funciona. Se basa en el comentario anterior de Jun .
uso
url de corstest [-v]
ejemplos
./corstest https://api.coindesk.com/v1/bpi/currentprice.json
https://api.coindesk.com/v1/bpi/currentprice.json Access-Control-Allow-Origin: *
el resultado positivo se muestra en verde
./corstest https://github.com/IonicaBizau/jsonrequest
https://github.com/IonicaBizau/jsonrequest does not support CORS
you might want to visit https://enable-cors.org/ to find out how to enable CORS
el resultado negativo se muestra en rojo y azul
la opción -v mostrará los encabezados de rizo completo
corstest
#!/bin/bash
# WF 2018-09-20
# https://stackoverflow.com/a/47609921/1497139
#ansi colors
#http://www.csc.uvic.ca/~sae/seng265/fall04/tips/s265s047-tips/bash-using-colors.html
blue='\033[0;34m'
red='\033[0;31m'
green='\033[0;32m' # '\e[1;32m' is too bright for white bg.
endColor='\033[0m'
#
# a colored message
# params:
# 1: l_color - the color of the message
# 2: l_msg - the message to display
#
color_msg() {
local l_color="$1"
local l_msg="$2"
echo -e "${l_color}$l_msg${endColor}"
}
#
# show the usage
#
usage() {
echo "usage: [-v] $0 url"
echo " -v |--verbose: show curl result"
exit 1
}
if [ $# -lt 1 ]
then
usage
fi
# commandline option
while [ "$1" != "" ]
do
url=$1
shift
# optionally show usage
case $url in
-v|--verbose)
verbose=true;
;;
esac
done
if [ "$verbose" = "true" ]
then
curl -s -X GET $url -H 'Cache-Control: no-cache' --head
fi
origin=$(curl -s -X GET $url -H 'Cache-Control: no-cache' --head | grep -i access-control)
if [ $? -eq 0 ]
then
color_msg $green "$url $origin"
else
color_msg $red "$url does not support CORS"
color_msg $blue "you might want to visit https://enable-cors.org/ to find out how to enable CORS"
fi
Parece que esto funciona:
curl -I http://example.com
Busque Access-Control-Allow-Origin: *
en los encabezados devueltos
*
no funciona si las credenciales, como una cookie, deben presentarse con la solicitud de API. En ese caso, también se requiere el FQDN en la Access-Control-Allow-Origin
respuesta Access-Control-Allow-Credentials: true
. Las solicitudes con credenciales, aunque no fueron especificadas como un requisito por parte de OP, por lo que *
funcionan para cualquier solicitud no autenticada.