Я вызвал сторонний API с помощью JQuery AJAX. В консоли появляется следующая ошибка:
Cross-Origin Read Blocking (CORB) blocked cross-origin response MY URL with MIME type application/json. See https://www.chromestatus.com/feature/5629709824032768 for more details.
Я использовал следующий код для вызова Ajax:
$.ajax({
type: 'GET',
url: My Url,
contentType: 'application/json',
dataType:'jsonp',
responseType:'application/json',
xhrFields: {
withCredentials: false
},
headers: {
'Access-Control-Allow-Credentials' : true,
'Access-Control-Allow-Origin':'*',
'Access-Control-Allow-Methods':'GET',
'Access-Control-Allow-Headers':'application/json',
},
success: function(data) {
console.info(data);
},
error: function(error) {
console.info("FAIL....================ = ");
}
});
Когда я зарегистрировался в Fiddler, я получил данные в ответ, но не в методе успеха Ajax.
Пожалуйста, помогите мне.
Вы устранили эту ошибку или предупреждение CORB? Я испытываю то же самое с модулем запроса.
@ SherwinAblañaDapito, если вы все еще ищете решение, см. мой ответ для сред разработки / тестирования



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Заголовки ответа обычно устанавливаются на сервере. Установите 'Access-Control-Allow-Headers' на 'Content-Type' на стороне сервера
Я использую сторонний API. Так что я не могу этого сделать. Пожалуйста, дайте мне любое решение на стороне клиента.
Сервер решает, что разрешить, а что нет. Только сервер имеет такой доступ. Управление заголовками ответов со стороны клиента представляет угрозу безопасности. Задача клиентской стороны - отправить правильный запрос, а затем получить ответ, отправленный сервером. Смотрите это: stackoverflow.com/questions/17989951/…
Это CORB, а не CORS.
Вам необходимо добавить CORS на стороне сервера:
Если вы используете nodeJS, тогда:
Сначала вы нужно установитьcors, используя следующую команду:
npm install cors --save
Теперь добавьте следующий код в файл запуска вашего приложения, например (app.js or server.js)
var express = require('express');
var app = express();
var cors = require('cors');
var bodyParser = require('body-parser');
//enables cors
app.use(cors({
'allowedHeaders': ['sessionId', 'Content-Type'],
'exposedHeaders': ['sessionId'],
'origin': '*',
'methods': 'GET,HEAD,PUT,PATCH,POST,DELETE',
'preflightContinue': false
}));
require('./router/index')(app);
Если вам нужно добавить расширение для решения вашей проблемы, вы неправильно обрабатываете запрос на стороне сервера. Просто примечание.
Невозможно просить мою пользовательскую базу установить странное расширение Chrome. А как насчет других браузеров?
Хотя этот ответ не решает проблему в долгосрочной перспективе, он использовал этот плагин, который подтвердил моим коллегам, что это проблема CORS. Так что за это проголосовали!
@IsraelRodriguez вы ошибаетесь, это не расширение Chrome. Он должен быть установлен на стороне сервера, потому что это сервер, который должен разрешать доступ.
@VladimirNul исходный ответ был о расширении Chrome. Шубхам его переписал. Пожалуйста, проверьте историю.
Здесь есть некоторая путаница. OP относится к CORB, а не к CORS.
Если вы собираетесь коренным образом изменить свой ответ с помощью редактирования, вам следует подумать о создании нового ответа. Особенно если это в ответ на комментарии
In most cases, the blocked response should not affect the web page's behavior and the CORB error message can be safely ignored. For example, the warning may occur in cases when the body of the blocked response was empty already, or when the response was going to be delivered to a context that can't handle it (e.g., a HTML document such as a 404 error page being delivered to an tag).
https://www.chromium.org/Home/chromium-security/corb-for-developers
Мне пришлось очистить кеш своего браузера, я читал по этой ссылке, что, если запрос получит пустой ответ, мы получим это предупреждение об ошибке. Я получал CORS по моему запросу, и поэтому ответ на этот запрос стал пустым. Все, что мне нужно было сделать, это очистить кеш браузера, и CORS ушел. Я получал CORS, потому что хром сохранил номер ПОРТА в кеше, сервер просто принимал localhost:3010, а я делал localhost:3002 из-за кеша.
Это не ясно из вопроса, но при условии, что это что-то происходит на клиенте разработки или тестирования, и, учитывая, что вы уже используете Fiddler, вы можете получить ответ Fiddler разрешающим ответом:
AutoResponderAdd Rule и измените правило на:
Method:OPTIONS http://localhost*CORSPreflightAllowUnmatched requests passthroughEnable RulesПара заметок:
Вы пробовали изменить dataType в своем запросе ajax с jsonp на json? это исправило это в моем случае.
dataType:'jsonp',
Вы делаете запрос JSONP, но сервер отвечает JSON.
Браузер отказывается пытаться рассматривать JSON как JSONP, потому что это будет угрозой безопасности. (Если браузер сделал попытается обработать JSON как JSONP, это, в лучшем случае, потерпит неудачу).
См. этот вопрос для более подробной информации о том, что такое JSONP. Обратите внимание, что это неприятный способ обойти ту же политику происхождения, которая использовалась до появления CORS. CORS - гораздо более чистое, безопасное и более эффективное решение проблемы.
Похоже, вы пытаетесь сделать запрос на другой источник и бросаете все, что можете придумать, в одну огромную кучу противоречивых инструкций.
Вы должны понимать, как работает политика одного и того же происхождения.
Подробное руководство см. В этот вопрос.
Теперь несколько замечаний о вашем коде:
contentType: 'application/json',
Удалите это.
dataType:'jsonp',
Удали это. (Вместо этого вы можете заставить сервер отвечать JSONP, но CORS лучше).
responseType:'application/json',
Этот вариант не поддерживается jQuery.ajax. Удали это.
xhrFields: { withCredentials: false },
Это значение по умолчанию. Если вы не устанавливаете для него значение true с помощью ajaxSetup, удалите это.
headers: { 'Access-Control-Allow-Credentials' : true, 'Access-Control-Allow-Origin':'*', 'Access-Control-Allow-Methods':'GET', 'Access-Control-Allow-Headers':'application/json', },
Вернуть ответ с заголовком 'Access-Control-Allow-Origin: *' Проверьте код ниже для ответа сервера Php.
<?php header('Access-Control-Allow-Origin: *');
header('Content-Type: application/json');
echo json_encode($phparray);
Ваш ответ НАСТОЛЬКО мне помог !!! Я просто не могу вас отблагодарить. Я буду продолжать исследовать, что делает «Access Control Allow Origin», чтобы понять последствия, но я только изучаю основы создания веб-службы PHP, и это помогло мне, как вы не поверите. СПАСИБО!!!
Это вообще не решает проблему. Это ошибка CORB, вызванная отправкой ответа с Content-Type: application/json в нем. Код OP уже должен это делать.
@ Квентин, ??? Здравый смысл гласит, что до тех пор, пока у вас есть Allow Origin, браузер будет разрешать запрос независимо от любого подозрительного заголовка / тела.
Блокировка чтения из разных источников (CORB), алгоритм, с помощью которого веб-браузеры могут идентифицировать и блокировать загрузку ресурсов из разных источников до того, как они достигнут веб-страницы ... Он предназначен для предотвращения доставки браузером определенных сетевых ответов из разных источников. на веб-страницу.
Сначала убедитесь, что эти ресурсы обслуживаются с правильным "Content-Type", т. Е. Для типа MIME JSON - "text/json", "application/json", типа MIME HTML - "text/html".
Во-вторых: установите режим на cors, то есть mode:cors
Получение будет выглядеть примерно так
fetch("https://example.com/api/request", {
method: 'POST',
body: JSON.stringify(data),
mode: 'cors',
headers: {
'Content-Type': 'application/json',
"Accept": 'application/json',
}
})
.then((data) => data.json())
.then((resp) => console.info(resp))
.catch((err) => console.info(err))
https://www.chromium.org/Home/chromium-security/corb-for-developers
Если вы работаете на localhost, попробуйте это, это единственное расширение и метод, который работал у меня (Angular, только javascript, без php)
Я столкнулся с этой проблемой, потому что формат ответа jsonp от сервера неправильный. Неправильный ответ выглядит следующим образом.
callback(["apple", "peach"])
Проблема в том, что объект внутри callback должен быть правильным объектом json, а не массивом json. Поэтому я изменил код сервера и изменил его формат:
callback({"fruit": ["apple", "peach"]})
Браузер с радостью принял ответ после модификации.
callback(["apple", "peach"]) - это идеальный JSONP, и он отлично работал, когда я тестировал его в разных источниках.
В этом контексте стоит упомянуть крайний случай: Chrome (по крайней мере, некоторые версии) проверяет предварительные полеты CORS, используя алгоритм, настроенный для CORB. IMO, это немного глупо, потому что предполетные операции, похоже, не влияют на модель угроз CORB, а CORB, похоже, разработан так, чтобы быть ортогональным CORS. Кроме того, тело предварительной проверки CORS недоступно, поэтому нет никаких негативных последствий, только раздражающее предупреждение.
В любом случае, проверьте, что ваши предварительные ответы CORS (ответы метода OPTIONS) не имеют тела (204). Пустой 200 с типом содержимого application / octet-stream и нулевой длиной здесь тоже хорошо работал.
Вы можете подтвердить, действительно ли это именно так, посчитав предупреждения CORB и ответы OPTIONS в теле сообщения.
Попробуйте установить расширение "Moesif CORS", если вы столкнулись с проблемой в Google Chrome. Поскольку это запрос с перекрестным происхождением, хром не принимает ответ, даже если код состояния ответа равен 200
Это плохой совет. Вы не хотите, чтобы пользователи установили расширение для посещения вашего веб-сайта.
У меня была такая же проблема с расширением Chrome. Когда я попытался добавить в свой манифест опцию content_scripts эту часть:
//{
// "matches": [ "<all_urls>" ],
// "css": [ "myStyles.css" ],
// "js": [ "test.js" ]
//}
А другую часть я удаляю из своего манифеста "permissons":
"https://*/"
Только когда я удаляю его CORB в одном из моих запросов XHR, разочаровывается.
Хуже всего то, что в моем коде мало запросов XHR, и только один из них начинает получать ошибку CORB (почему CORB не отображается на другом XHR, я не знаю; почему явные изменения вызвали эту ошибку, я не знаю). Вот почему я проверял весь код снова и снова через несколько часов и потерял много времени.
На стороне сервера возникла проблема с заголовками. Я изменяю свое возвращаемое значение ASP.NET на: public async Task <string> Get (string TM) Возвращаемое значение было мгновение назад JSON (тип содержимого, я думаю, «application / json»), а теперь это другой (может быть «текст» /простой"). И это помогает. Теперь я возвращаю манифест «разрешения» на «https: // * /», и он работает.
Похоже, это предупреждение возникло при отправке пустого ответа с 200.
Эта конфигурация в моем .htaccess отображает предупреждение в Chrome:
Header always set Access-Control-Allow-Origin "*"
Header always set Access-Control-Allow-Methods "POST,GET,HEAD,OPTIONS,PUT,DELETE"
Header always set Access-Control-Allow-Headers "Access-Control-Allow-Headers, Origin,Accept, X-Requested-With, Content-Type, Access-Control-Request-Method, Access-Control-Request-Headers, Authorization"
RewriteEngine On
RewriteCond %{REQUEST_METHOD} OPTIONS
RewriteRule .* / [R=200,L]
Но изменив последнюю строку на
RewriteRule .* / [R=204,L]
решить вопрос!
В расширении Chrome вы можете использовать
chrome.webRequest.onHeadersReceived.addListener
переписать заголовки ответа сервера. Вы можете заменить существующий заголовок или добавить дополнительный заголовок. Это тот заголовок, который вам нужен:
Access-Control-Allow-Origin: *
https://developers.chrome.com/extensions/webRequest#event-onHeadersReceived
Я застрял на проблемах CORB, и это решило их для меня.
«Начиная с Chrome 72, если вам нужно изменить ответы до того, как функция блокировки чтения перекрестных источников (CORB) сможет заблокировать ответ, вам необходимо указать 'extraHeaders' в opt_extraInfpSpec». из документа webRequests
У меня аналогичная проблема. Мой случай связан с тем, что contentType ответа сервера - это application / json, а не text / javascript.
Итак, я решаю это со своего сервера (spring mvc):
// http://127.0.0.1:8080/jsonp/test?callback=json_123456
@GetMapping(value = "/test")
public void testJsonp(HttpServletRequest httpServletRequest,
HttpServletResponse httpServletResponse,
@RequestParam(value = "callback", required = false) String callback) throws IOException {
JSONObject json = new JSONObject();
json.put("a", 1);
json.put("b", "test");
String dataString = json.toJSONString();
if (StringUtils.isBlank(callback)) {
httpServletResponse.setContentType("application/json; charset=UTF-8");
httpServletResponse.getWriter().print(dataString);
} else {
// important: contentType must be text/javascript
httpServletResponse.setContentType("text/javascript; charset=UTF-8");
dataString = callback + "(" + dataString + ")";
httpServletResponse.getWriter().print(dataString);
}
}
Похоже, что вызываемый вами API не включил заголовки, необходимые для разрешения междоменных вызовов из JS. Скорее всего, вместо этого вам нужно будет вызвать на сервер. Вы уверены, что ответ - это JSONP, а не простой JSON? Также обратите внимание, что заголовки, которые вы добавляете в запрос, должны вместо этого помещаться в отклик с сервера.