from - getjson javascript
No hay encabezado ''Access-Control-Allow-Origin'' presente en el error de recurso solicitado (8)
Chrome no le permite integrar dos host locales diferentes, es por eso que estamos recibiendo este error.
Solo tiene que incluir el paquete Microsoft Visual Studio Web Api Core del administrador nuget y agregar las dos líneas de código en los proyectos de WebApi en su archivo
WebApiConfig.cs
.
var cors = new EnableCorsAttribute("*", "*", "*");
config.EnableCors(cors);
Entonces todo listo.
Estoy tratando de obtener el feed de un sitio web de noticias. Pensé que usaría la API de feed de google para convertir el feed feedburner en json. La siguiente URL devolverá 10 publicaciones del feed, en formato json. http://ajax.googleapis.com/ajax/services/feed/load?v=1.0&num=10&q=http://feeds.feedburner.com/mathrubhumi
Usé el siguiente código para obtener el contenido de la URL anterior
$.ajax({
type: "GET",
dataType: "jsonp",
url: "http://ajax.googleapis.com/ajax/services/feed/load",
data: {
"v": "1.0",
"num": "10",
"q": "http://feeds.feedburner.com/mathrubhumi"
},
success: function(result) {
//.....
}
});
pero no funciona y obtengo el siguiente error
XMLHttpRequest no puede cargar http://ajax.googleapis.com/ajax/services/feed/load?v=1.0&num=10&q=http%3A%2F%2Ffeeds.feedburner.com%2Fmathrubhumi . No hay encabezado ''Access-Control-Allow-Origin'' presente en el recurso solicitado. Por lo tanto, el origen '' http: // localhost '' no tiene acceso permitido.
¿Cómo puedo solucionar esto?
Creo que esto podría deberse a que Chrome no admite
localhost
para pasar por
Access-Control-Allow-Origin
;
consulte el problema de Chrome
Para que Chrome envíe
Access-Control-Allow-Origin
en el encabezado, solo alias su localhost en su archivo / etc / hosts a otro dominio, como:
127.0.0.1 localhost yourdomain.com
Luego, si accede a su secuencia de comandos usando
yourdomain.com
lugar de
localhost
, la llamada debería tener éxito.
Para el desarrollo puede usar https://cors-anywhere.herokuapp.com , para la producción es mejor configurar su propio proxy
async function read() {
let r= await (await fetch(''https://cors-anywhere.herokuapp.com/http://ajax.googleapis.com/ajax/services/feed/load?v=1.0&num=10&q=http://feeds.feedburner.com/mathrubhumi'')).json();
console.log(r);
}
read();
Pruebe esto: configure la llamada Ajax configurando el encabezado de la siguiente manera:
var uri = "http://localhost:50869/odata/mydatafeeds"
$.ajax({
url: uri,
beforeSend: function (request) {
request.setRequestHeader("Authorization", "Negotiate");
},
async: true,
success: function (data) {
alert(JSON.stringify(data));
},
error: function (xhr, textStatus, errorMessage) {
alert(errorMessage);
}
});
Luego ejecute su código abriendo Chrome con la siguiente línea de comando:
chrome.exe --user-data-dir="C:/Chrome dev session" --disable-web-security
Si llama al servicio de arranque de primavera. puedes manejarlo usando el siguiente código.
@Bean
public WebMvcConfigurer corsConfigurer() {
return new WebMvcConfigurerAdapter() {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOrigins("*")
.allowedMethods("GET", "POST", "PUT", "DELETE", "HEAD", "OPTIONS")
.allowedHeaders("*", "Access-Control-Allow-Headers", "origin", "Content-type", "accept", "x-requested-with", "x-requested-by") //What is this for?
.allowCredentials(true);
}
};
}
Si usa el navegador Google Chrome, puede hackear con una extensión.
Puede encontrar una extensión de Chrome que modificará los encabezados de CORS sobre la marcha en su aplicación. Obviamente, esto es solo para Chrome, pero me gusta que funcione con cero cambios en cualquier lugar.
Puede usarlo para depurar su aplicación en una máquina local (si todo funciona en producción).
Aviso : si la URL se rompe, el nombre de la extensión es Access-Control-Allow-Origin: * . Le recomiendo que desactive esta extensión cuando no esté trabajando en sus cosas, porque, por ejemplo, youtube no funciona con esta extensión.
Solo para su información, noté esta información de la documentación de jQuery que creo que se aplica a este problema:
Debido a restricciones de seguridad del navegador, la mayoría de las solicitudes "Ajax" están sujetas a la misma política de origen ; la solicitud no puede recuperar con éxito datos de un dominio, subdominio, puerto o protocolo diferente.
Cambiar el archivo de hosts como @thanix no funcionó para mí, pero la extensión mencionada por @dkruchok resolvió el problema.
Utilice
@CrossOrigin
en el
backendside
en el controlador de arranque Spring (ya sea nivel de clase o nivel de método) como la solución para el error de Chrome
''No ''Access-Control-Allow-Origin''
encabezado
''No ''Access-Control-Allow-Origin''
está presente en el recurso solicitado ''.
Esta solución me funciona al 100% ...
Ejemplo: nivel de clase
@CrossOrigin
@Controller
public class UploadController {
----- O -------
Ejemplo: nivel de método
@CrossOrigin(origins = "http://localhost:3000", maxAge = 3600)
@RequestMapping(value = "/loadAllCars")
@ResponseBody
public List<Car> loadAllCars() {
Ref: https://spring.io/blog/2015/06/08/cors-support-in-spring-framework