Arhn - архитектура программирования

Как получить информацию о теле REST API (JSON)?

Я пытаюсь использовать OpenWeather Rest API, но у меня возникают проблемы с доступом к информации о теле. Я использую Postman для тестирования, который работает, но не в моем коде, поэтому мне что-то не хватает.

Результаты почтальона: (я не показываю все содержимое тела, так как это не обязательно) конечная точка REST с запросами: api.openweathermap.org/data/2.5/weather?q=London, uk & APPID = < em> api-key-здесь

{
"coord": {
    "lon": -0.13,
    "lat": 51.51
},
"weather": [
    {
        "id": 500,
        "main": "Rain"
    }
],
"main": {
    "temp": 290.38
},
"name": "London"
}

Конечная точка отлично работает с Postman.

Мой код:

import React, { useState, useEffect } from 'react';

Внутри моей функции LocalWeather:

Переменные:

const [weather, setWeather] = useState([]);

useEffect для запуска моего вызова выборки

useEffect(() => {
    fetchData();
}, []); //  Run once on load

Фактический вызов выборки:

const fetchData = async () => {
    const res = await fetch(`api.openweathermap.org/data/2.5/weather?q=London,uk&APPID=${api-key`);
    res.json()
    .then(res => setWeather(res))
}

Затем я мог бы выйти из заголовков (что дает мне соответствующую информацию):

console.log(res);

Раньше мне приходилось добавлять следующее, потому что useEffect действует как componentDidMount и запускается после первоначального рендеринга.

if (!weather.length) {
    return null;
}

Затем я бы попытался отобразить информацию, если я слежу за результатами Postman:

return (
    <ul>
        <li>{weather.weather[0].main}</li>
    </ul>
);

Что мне не хватает очевидного, что мешает отображать информацию о теле?

Получение на консоли следующего сообщения, которое говорит мне, что на самом деле он не получает никакой информации. Неперехваченный (в обещании) SyntaxError: неожиданный токен ‹в JSON в позиции 0

03.06.2020

  • вы можете добавить лог console.log(res)? 03.06.2020
  • Возвращает все результаты Postman 03.06.2020

Ответы:


1

Проблема, похоже, в том, что fetch считает URL относительным. Поскольку у вас нет URL-адреса с префиксом https://, fetch выполняет запрос относительно той страницы, на которой вы сейчас находитесь. Например: http://localhost:3000/api.openweathermap.org/data/2.5/weather.

Какой бы ни была эта страница (вероятно, страница 404), скорее всего, это не JSON, поэтому он не может проанализировать ее, когда вы выполняете res.json(), поэтому вы получаете синтаксическую ошибку JSON.

Если добавить префикс https://, должно работать!

const fetchData = async () => {
  const res = await fetch(`https://api.openweathermap.org/data/2.5/weather?q=London,uk&APPID=${apiKey}`);
  res
    .json()
    .then(res => setWeather(res))
}
03.06.2020
  • Это помогает, но я все еще получаю пустой массив длиной 0. Array(0)length: 0__proto__: Array(0). Также используется res.weather, упомянутый weiklr. 03.06.2020
  • @Mitchell Получаете ли вы полный ответ API в результате res.json()? Какой результат вы получите, если переключите .then(res => setWeather(res)) на .then(res => console.log(res))? 03.06.2020
  • Я получаю все результаты Postman, переключая его в console.log 03.06.2020
  • Тогда я могу получить элементы основного уровня, выполнив <ul> <li>{openWeather.name}</li> <li>{openWeather.cod}</li> <li>{openWeather.id}</li> <li>{openWeather.timezone}</li> <li>{openWeather.dt}</li> <li>{openWeather.visibility}</li> <li>{openWeather.base}</li> </ul> Но я не могу попасть во вложенные элементы. weather [0] .main не работает. Есть ли строка или что-то, что мне не хватает для доступа к вложенным элементам? 03.06.2020
  • @Mitchell Хм, парсить не надо. Я не очень хорошо знаком с тем, как работают React Hooks, поэтому, возможно, есть проблема в том, чего я не вижу ... Будет ли массив пуст, если вы это сделаете? const fetchData = async () => { const res = await fetch( api.openweathermap.org/data/2.5/weather?q = Лондон, Великобритания & APPID = $ {apiKey} ); res .json() .then(res => { setWeather(res) console.log(res.weather) }) } 04.06.2020
  • возвращается undefined, делая это таким образом. Я тоже пробовал использовать аксиомы, но то же самое. 04.06.2020
  • Очень странно. Есть ли свойство weather при входе в res? 04.06.2020
  • Получение чего-то нового: Promise {<pending>} __proto__: Promise [[PromiseStatus]]: "resolved" [[PromiseValue]]: undefined 05.06.2020
  • .then(res => console.log(res)); возвращается undefined 05.06.2020
  • Это еще более странно. Если вы запустите это только в консоли вашего браузера, это сработает? gist.github.com/nprail/c5bd1d458a9664010f233c006397d686 05.06.2020
  • Это действительно работает, хотя я получаю Promise {<pending>} __proto__: Promise [[PromiseStatus]]: "resolved" [[PromiseValue]]: undefined И затем отображаются все результаты. 05.06.2020

  • 2

    Чтобы добавить к ответу Ноя, если вам нужен только массив погоды, вы можете просто установитьWeather (res.weather) в useEffects вместо этого:

    const fetchData = async () => {
      const res = await fetch(`https://api.openweathermap.org/data/2.5/weather?q=London,uk&APPID=${apiKey}`);
      res
        .json()
        .then(res => setWeather(res.weather))
    }
    

    Таким образом вы сможете избежать проверки if, которую вы выполнили здесь:

    if (!weather.length) {
        return null;
    }
    
    03.06.2020
  • Что помогает. Но в этом случае мне нужен доступ ко всему ответу. Если я сделаю это .then(res => setWeather(res.weather[0]));, тогда я смогу выполнить рендеринг с {weather.main}, но тогда я смогу получить только main, который прямо сейчас отображает дождь. Я также хочу отображать имя. 03.06.2020

  • 3

    Итак, кто-то на канале Slack понял это за меня.

    При возврате JSX:

    <li>{openWeather.weather && openWeather.weather[0].main}</li>
    

    Мне это кажется ошибкой, но он выводит ответ REST API.

    Я все еще получаю предупреждение, и я не понимаю, почему:

        const axiosGet = () => {
            const data = axios.get(`https://api.openweathermap.org/data/2.5/weather?q=London,uk&APPID=api-key`)
            .then(data => setWeather(data.data));
        }
    

    Говорит Line 14:15: 'data' is assigned a value but never used no-unused-vars, хотя все работает. Разве я не устанавливаю конечную точку отдыха для данных, а затем использую ее при запуске метода setWeather?

    05.06.2020
  • Это предупреждение больше связано со стилем кода. Переменная data в const data = axios.get... отличается от переменной в .then. Таким образом, даже если вы используете переменную с именем data в .then, это не та же переменная. По сути, вы могли бы просто отбросить const data = с самого начала. 06.06.2020
  • Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..