Несколько дней назад я написал веб-сервис на python с flask для отправки JSON-данных между моим телефоном (приложение для Android) и моим сервером.
Все работало нормально: я мог отправлять и получать данные через GET, POST с моим приложением для Android, а также с программой «cURL».
Тогда я решил создать простое веб-приложение в качестве клиента для моего веб-сервиса, и началась борьба. Итак, я написал самый простой клиент и сервер, который я могу себе представить:
Client.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>TestClient</title>
<!-- jQuery -->
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js</script></head>
<body>
<script type="text/javascript">
$.get("http://SERVER_URL/test/1", function(data,status){
alert("Data: " + data + "\nStatus: " + status);
});
</script>
</body>
</html>
Мои ответы Python не будут отображаться в моем браузере, поэтому я также создал очень простой PHP-сервер с PHP-фреймворком Slim, работающим на моем сервере Apache2 в качестве виртуального хоста:
index.php:
// Slim import and basic stuff...
// GET route
$app->get('/test/:id', function ($id) {
echo "This is test $id";
});
Поэтому, когда я вручную вызываю этот сайт (из Firefox или Chrome), я получаю простую строку «Это тест № 1», которая отображается в моем браузере, как я и ожидал
НО как только я запускаю свой «Client.html», я ничего не получаю: нет оповещений или чего-то еще. Когда я использую консоль Firefox для проверки на наличие ошибок или чего-то подобного, все тоже выглядит нормально:
ЗАПРОС:
02:49:03.000
User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:28.0) Gecko/20100101 Firefox/28.0
Origin: null
Host: 213.165.80.252
Connection: keep-alive
Accept-Language: de,en-US;q=0.7,en;q=0.3
Accept-Encoding: gzip, deflate
Accept: */*
ОТВЕТ:
Response-Header Δ91ms
X-Powered-By: PHP/5.4.4-14+deb7u14
Vary: Accept-Encoding
Server: Apache/2.2.22 (Debian)
Keep-Alive: timeout=5, max=100
Date: Sun, 05 Oct 2014 00:49:04 GMT
Content-Type: text/html
Content-Length: 15
Content-Encoding: gzip
Connection: Keep-Alive
Так что, в конце концов, я думаю, что-то не так с моим сервером. Что-то вроде «Ответы не обрабатываются JavaScript». Причины моей мысли:
Что на самом деле работает:
Заранее спасибо!
После нескольких дней (!) Исследований я наконец нашел очень простое решение: контроль доступа HTTP (CORS).
Короче говоря — следующий код исправил проблему.
Я должен был сделать следующие шаги на моем сервере:
1.) Активируйте модуль заголовков для apache:
server# a2enmod mod_headers
2.) Измените файл VirtualHost «myservice.conf» на моем сервере и добавьте следующую строку между ними.
Header set Access-Control-Allow-Origin "*"
3.) Проверьте наличие ошибок в вашем файле:
server# apachectl -t
4.) перезагрузите и перезапустите apache
server# service apache2 reload && service apache2 restart
5.) Наслаждайтесь подключением сервера клиента!
Надеюсь, я смогу помочь любому, у кого такая же проблема!
Других решений пока нет …