Как правильно получать данные из среднего API в Javascript

У меня есть средние данные запроса API. Средние документы

Example request:

GET /v1/me HTTP/1.1
Host: api.medium.com
Authorization: Bearer 181d415f34379af07b2c11d144dfbe35d
Content-Type: application/json
Accept: application/json
Accept-Charset: utf-8

В ПРИМЕРЕ PHP-КОДА ниже все работает нормально, поскольку я могу успешно получить свои данные из Medium API.

$url  = "https://api.medium.com/v1/me";
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type:application/json', 'Authorization: Bearer 29f812842-xxxxxxxxxxx'));
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "GET");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
echo $output = curl_exec($ch);

Вот моя проблема. Когда я пытался получить данные из JavaScript, ниже выдавалась ошибка

XHROPTIONS
https://api.medium.com/v1/me
CORS Missing Allow Origin

Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at https://api.medium.com/v1/me. (Reason: CORS header ‘Access-Control-Allow-Origin’ missing). Status code: 401.

ниже приведен код, вызывающий ошибку

async function GetUsersData() {

    try {                
const response = await fetch('https://api.medium.com/v1/me', {
    method: 'GET',
    mode: 'cors',
    credentials: 'include',
    headers: {
    'Content-Type': 'application/json',
    'Authorization': 'Bearer  29f8128xxxx'
  }
});

console.info(response);
alert(response);

} catch (error) {
    // handle the error
alert(error);
} 

}
GetUsersData();

Ошибка CORS означает, что api.medium.com не разрешает доступ из браузеров.

Jaromanda X 04.08.2024 06:38

Этого можно добиться, используя прокси-сервер на стороне сервера в качестве посредника.

YUSOF KHAN 04.08.2024 06:46

перейдите на вкладку сети и проверьте заголовки запросов. Если ваш источник по какой-то причине равен нулю, вы получите сообщение об ошибке.

Aniket Pandey 04.08.2024 07:49

вы проверяли срок действия сгенерированного токена?? Может быть, срок годности истек?

Aniket Pandey 04.08.2024 08:00
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
4
55
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Похоже, вы добавляете в свой запрос правильный заголовок, который требуется для Medium API. Нам нужно правильно указать Access-Control-Allow-Origin в вашем заголовке, что разрешено Medium API. Поскольку мы не контролируем код Medium API. Есть несколько способов обойти это. Один из способов — создать собственный прокси-сервер на стороне сервера. Вы можете попробовать использовать Node JS или любой другой серверный язык для этого конкретного случая использования, а затем вызвать эту конечную точку из вашего клиентского приложения.

Мы можем управлять собственным CORS на стороне сервера. Пожалуйста, попробуйте этот подход и дайте мне знать, если вы все еще сталкиваетесь с проблемой. Поделитесь подробным журналом этого.

We need to add the Access-Control-Allow-Origin into your header а?
Jaromanda X 04.08.2024 06:40

Поскольку мы не можем контролировать средний API, поэтому прокси-сервер на стороне сервера может помочь вам решить эту проблему. Речь идет о CORS, разрешенном сервером. Что вы можете сделать, так это реализовать для этого код на стороне сервера, и они вызывают конечную точку API на стороне сервера, чтобы получить это на стороне клиента.

Farrukh Naveed Anjum 04.08.2024 06:49

Да, но это утверждение предполагает, что вам НУЖЕН этот заголовок - за исключением того, что вы этого не сделаете, если вы используете свой собственный сервер для проксирования запроса - если вы, конечно, не создадите второй сервер только для проксирования запросов... но это наивный способ сделай это

Jaromanda X 04.08.2024 06:52

Я считаю, что браузер применяет политику одного и того же происхождения, которая предотвращает отправку запросов к другому домену, если целевой сервер явно не разрешает это, включая в ответ определенные заголовки CORS.

Я бы предложил вам использовать серверный скрипт для получения данных из Medium API. Таким образом, ваш JavaScript может взаимодействовать с вашим сервером (который имеет тот же источник), а затем ваш сервер может взаимодействовать с Medium API.

Например:

// Node.js Server-Side Code

const express = require('express');
const fetch = require('node-fetch');
const app = express();

app.get('/medium-data', async (req, res) => {
  const url = 'https://api.medium.com/v1/me';
  const response = await fetch(url, {
    method: 'GET',
    headers: {
      'Content-Type': 'application/json',
      'Authorization': 'Bearer 29f8128xxxx'
    }
  });
  const data = await response.json();
  res.json(data);
});

app.listen(3000, () => {
  console.info('Server running on port 3000');
});




// Client-Side JavaScript
    async function GetUsersData() {
 try {                
    const response = await fetch('http://localhost:3000/medium-data');
    const data = await response.json();
    console.info(data);
    alert(JSON.stringify(data));
  } catch (error) {
    alert(error);
  }
}

GetUsersData();
Ответ принят как подходящий

Чтобы обойти эту проблему, вы можете использовать прокси-сервер на стороне сервера для обработки запроса API. Таким образом, запрос выполняется между серверами, минуя ограничения CORS в браузере.

Использование прокси-сервера на стороне сервера Настройте прокси-сервер

Вот пример использования Node.js и Express:

// server.js
const express = require('express');
const fetch = require('node-fetch');
const app = express();

app.get('/api/medium/me', async (req, res) => {
  try {
    const response = await fetch('https://api.medium.com/v1/me', {
      method: 'GET',
      headers: {
        'Authorization': 'Bearer 29f812842-xxxxxxxxxxx'
      }
    });
    const data = await response.json();
    res.json(data);
  } catch (error) {
    res.status(500).send(error.toString());
  }
});

app.listen(3000, () => console.info('Server running on port 3000'));

Обновите свой код внешнего интерфейса Измените свой JavaScript, чтобы вместо этого он отправлял запрос на ваш прокси-сервер:

async function GetUsersData() {
    try {
        const response = await fetch('/api/medium/me');
        if (!response.ok) {
            throw new Error('Network response was not ok');
        }
        const data = await response.json();
        console.info(data);
        alert(JSON.stringify(data));
    } catch (error) {
        alert('Error: ' + error.message);
    }
}
GetUsersData();

Использование прокси-сервера CORS (временное решение) Если вам нужно быстрое решение и вас устраивают потенциальные проблемы с безопасностью и надежностью, вы можете использовать прокси-сервис CORS, например cors-anywhere:

async function GetUsersData() {
    try {
        const response = await fetch('https://cors-anywhere.herokuapp.com/https://api.medium.com/v1/me', {
            method: 'GET',
            headers: {
                'Authorization': 'Bearer 29f812842-xxxxxxxxxxx'
            }
        });
        if (!response.ok) {
            throw new Error('Network response was not ok');
        }
        const data = await response.json();
        console.info(data);
        alert(JSON.stringify(data));
    } catch (error) {
        alert('Error: ' + error.message);
    }
}
GetUsersData();

Для надежного и безопасного решения рекомендуется настроить прокси-сервер на стороне сервера. Прокси-сервер CORS можно использовать для быстрого тестирования, но он не идеален для производственных сред.

Другие вопросы по теме