Форум программистов, компьютерный форум, киберфорум
JavaScript: API
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.52/411: Рейтинг темы: голосов - 411, средняя оценка - 4.52
0 / 0 / 0
Регистрация: 25.04.2019
Сообщений: 1

Трудности с получением JSON-погоды через API с погодного сервера

25.04.2019, 12:00. Показов 76089. Ответов 1
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, уважаемые форумчане!

Несколько дней бьюсь с задачей. По отдельности всё понятно и даже работает, но системно не получается.
Суть: нужно на JavaScript через API функции связаться с погодным сервером и вывести данные на своей странице. Вроде бы всё просто.
1) зарегистрировался на DarkSky, получил бесплатный API-ключ. Разобрался с форматом GET-запроса. Пример:
https://api.darksky.net/foreca... u&units=si

2) через браузерную строку запроса, вручную погодный сервер вполне корректно выдаёт прогноз погоды в формате JSON

JSON
1
{"latitude":51.6606,"longitude":39.2006,"timezone":"Europe/Moscow","currently":{"time":1556180139,"summary":"Ясно","icon":"clear-day","precipIntensity":0,"precipProbability":0,"temperature":23.98,"apparentTemperature":23.98,"dewPoint":2.59,"humidity":0.25,"pressure":1025.31,"windSpeed":3.2,"windGust":4.36,"windBearing":316,"cloudCover":0,"uvIndex":6,"visibility":10.38,"ozone":331.53},"flags":{"sources":["cmc","gfs","icon","isd","madis"],"nearest-station":4.525,"units":"si"},"offset":3}
3) посредством стороннего JSON Parser'а (http://jsonparseronline.com/) получается легко декодировать представленный ассоциативный массив
4) пытался несколько дней вогнать все эти наработки в JAva Script код и толком ничего не выходило

Запрос делаю ассиметричным через XMLHttpRequest.
В статусе ответа всегда возвращается ноль.
Текст запроса (строка с адресом и параметрами) вроде верен.
Соответственно, раз 0, то не возвращается текст ответа (undefined)

Помогите пожалуйста разобраться, свести всё в цельное рабочее состояние.
Я уж много вспомогательного материала перекроил, но ошибку, недочёт найти пока самостоятельно не смог.
Буду рад вашей помощи...
(извините, если правильно оформил запрос-подсвеченный синтаксис и т.д.)

PHP/HTML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
<script>
window.alert("Тест работоспособности");
 
 
var xhr = new XMLHttpRequest();
 
xhr.open("GET","https://api.darksky.net/forecast/eeaf063f48cd92e5300e9028ce268e12/51.6606,39.2006?exclude=minutely,alerts,hourly,daily&flags&lang=ru&units=si", true);
xhr.send(null);
 
var status = xhr.status;
alert(xhr.status);
 
if(status==200)
    document.write("Текст ответа: " + xhr.responseText)
else if(status==404)
    document.write("Ресурс не найден")
else
    document.write(request.statusText)
 
 
//window.alert("Статус: "+xhr.statusText);//нашёл что-то
 
//window.alert(xhr.responseText);//нашёл что-то
 
//var json = JSON.parse(xhr.responseText);
window.alert("Тест2");
//var data = json[Object.keys(json)[0]];
//window.alert(data);
 
 
window.alert("Тест3");
alert(document.location);
 
document.write(txt);
window.alert(getAllResponseHeaders());
 
</script>
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
25.04.2019, 12:00
Ответы с готовыми решениями:

JSON + яндекс API погоды
Всем привет. Есть Яндекс API погоды. Зарегистрировался, получил ключ. Есть желание сделать для себя отображение погоды (интерес...

Десериализация json от api сайта погоды
Нужно помощь десериализации json от api сайта погоды. Ответ json от сайта...

Разделение дня и ночи через прогноз погоды для сайта через API Яндекса
Ранее поднял уже этот вопрос https://www.cyberforum.ru/php/thread1470414.html но только сейчас увидел специальный раздел. Суть осталась та...

1
Эксперт JS
6496 / 3907 / 2006
Регистрация: 14.06.2018
Сообщений: 6,781
26.04.2019, 12:56
Создаем собственный сайт на NodeJS.
Файлы в папке сайта:
index.html
PHP/HTML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
<!DOCTYPE HTML>
<html>
<head>
    <meta charset="utf-8">
</head>
<body>
    <script>
        /**
        * Task Asynchronous Pattern-версия загрузки JSON-файла по HTTP методом GET
        **/
        async function /*Promise<string>*/ getJSONAsync(url) {
            let response = await fetch(url);
            if (response.ok) {
                return await response.json();
            }
            else throw new Error(`${response.status}: ${response.statusText}`);
        }
 
        // Точка входа в программу
        (async function main() {
            // Для обхода CORS-ошибки забираем JSON с собственного сайта!
            let url = "weather.json";
            try {
                json = await getJSONAsync(url);
                console.log(`Сейчас: ${new Date(json.currently.time * 1000)} Текущая температура: ${json.currently.temperature}`);
            }
            catch (e) {
                console.log(e.message);
            }
        })();
    </script>
</body>
</html>
Для загрузки из внешнего источника JSON-файла устанавливаем любой из костылей fetch(). Неважно, какой.
npm install fetch

Непосредственно файл веб-сервера app.js
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
const http = require("http");
const fetchUrl = require("fetch").fetchUrl;
const fs = require("fs");
const url = require("url");
 
http.createServer(listener).listen(3000);
 
async function listener(request, response) {
    switch (request.method) {
        case "GET": {
            // Информация для тестирования
            console.log(request.method);
            console.log(request.headers);
            console.log(request.url);
 
            let url = urlOrIndex(request.url);
            let s;
            // Здесь корень обработки get-запросов
            if (url.endsWith(".html") && fs.existsSync(url)) { // html-страница
                response.setHeader("Content-Type", "text/html; charset=utf-8");
                s = await fs.readTextAsync(url);
            }
            // Обходим CORS-ошибку
            else if (url === "weather.json") {
                s = await requestAsync("https://api.darksky.net/forecast/eeaf063f48cd92e5300e9028ce268e12/51.6606,39.2006?exclude=minutely,alerts,hourly,daily&flags&lang=ru&units=si");
            }
            else if (url.endsWith(".css") && fs.existsSync(url)) { // css-стили
                response.setHeader("Content-Type", "text/css; charset=utf-8");
                s = await fs.readTextAsync(url);
            }
            else if (url.endsWith(".js") && fs.existsSync(url)) { // js-скрипт
                response.setHeader("Content-Type", "application/javascript; charset=utf-8");
                s = await fs.readTextAsync(url);
            }
            else if (url.endsWith(".jpg") && fs.existsSync(url)) { // jpg-картинка
                response.setHeader("Content-Type", "image/jpg");
                response.setHeader("Cache-Control", "max-age=31536000;");
                s = await fs.readBinAsync(url);
            }
            else if (url.endsWith(".png") && fs.existsSync(url)) { // png-картинка
                response.setHeader("Content-Type", "image/png");
                response.setHeader("Cache-Control", "max-age=0;");
                s = await fs.readBinAsync(url);
            }
            else if (url !== "favicon.ico") {
                response.statusCode = 404;
                response.setHeader("Content-Type", "text/html; charset=utf-8");
                s = await fs.readTextAsync("404.html");
            }
            response.end(s);
        }
            break;
    }
}
// ========================= Конец общей части =======================================
function requestAsync(url) {
    return new Promise((resolve, reject) => {
        fetchUrl(url, function (error, meta, body) {
            if (error)
                reject(error);
            else
                resolve(body);
        });
    });
}
 
// promisify fs.readFile() https://stackoverflow.com/questions/34628305/using-promises-with-fs-readfile-in-a-loop
fs.readTextAsync = function (filename) {
    return new Promise((resolve, reject) => {
        fs.readFile(filename, "utf8", (err, buffer) => {
            if (err) reject(err); else resolve(buffer);
        });
    });
};
fs.readBinAsync = function (filename) {
    return new Promise((resolve, reject) => {
        fs.readFile(filename, (err, buffer) => {
            if (err) reject(err); else resolve(buffer);
        });
    });
};
 
function urlOrIndex(url) {
    return url.slice(1) + (url.endsWith("/") ? "index.html" : "");
}
В данном случае тестируем сайт в современном браузере, набрав в адресной строке localhost:3000
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
26.04.2019, 12:56
Помогаю со студенческими работами здесь

Поиск информации через JSON API
Получаю json файл, как сделать, чтобы программа считывала строку из json id:1 и выписывала значение в MessageBox? пытался все сделать на...

Непонятная ошибка с получением строки из JSON
Дано: JSON-строка String1 (около 50к символов), которая парсится, где-то внутри нее спрятана String2 ...

Проблема с получением JSON пакета в WCF сервисе
господа, требуется помощь в следующей ситуации. У меня имеется WCF сервис, и он должен принимать JSON пакеты, POST запросом, с обязательно...

API погоды
Доброго времени! Посоветуйте пожалуйста или может у кого-то есть уже готовый пример (по-проще) по запросу данных, например о погоде...

Проблема с получением сообщения от сервера
Здравствуйте. Разбираюсь с HTTP клиентом. Вот код: #include &quot;stdafx.h&quot; #pragma comment(lib,&quot;ws2_32.lib&quot;) // Пример простого...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит переходные токи и напряжения на элементах схемы. . . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru