Разница между Python запросами POST и топором ios POST - PullRequest
0 голосов
/ 27 апреля 2020

Мне трудно понять, почему мой вызов API не работает в axios (относительно новый для JS). Я создал сервер API, который получает заголовок Authorization с токеном JWT.

Вот мой рабочий процесс POST-запроса в Python:

resp = requests.post('http://127.0.0.1:8000/api/v1/login/access-token', data={'username': 'admin@xyz.com', 'password': 'password'})
token = resp.json()['access_token']

test = requests.post('http://127.0.0.1:8000/api/v1/login/test-token', headers={'Authorization': f'Bearer {token}'})
# ALL SUCCESSFUL

Использование axios:

  const handleLogin = () => {
    const params = new URLSearchParams();
    params.append('username', username.value);
    params.append('password', password.value);
    setError(null);
    setLoading(true);
    axios.post('http://localhost:8000/api/v1/login/access-token', params).then(response => {
      console.log(response)
      setLoading(false);
      setUserSession(response.data.access_token);
      props.history.push('/dashboard');
    }).catch(error => {
      setLoading(false);
      console.log(error.response)
      if (error.response.status === 401) {
        setError(error.response.data.message);
      } else {
        setError("Something went wrong. Please try again later.");
      }
    });
  }
// the above works fine

// however:
  const [authLoading, setAuthLoading] = useState(true);

  useEffect(() => {
    const token = getToken();
    if (!token) {
      return;
    }

    axios.post(`http://localhost:8000/api/v1/login/test-token`, {
      headers: {
        'Authorization': 'Bearer ' + token
      }
    }).then(response => {
      // setUserSession(response.data.token);
      console.log('we made it')
      setAuthLoading(false);
    }).catch(error => {
      removeUserSession();
      setAuthLoading(false);
    });
  }, []);

  if (authLoading && getToken()) {
    return <div className="content">Checking Authentication...</div>
  }
// RETURNS A 401 Unauthorized response...

Чем отличаются два вышеуказанных запроса? Почему версия axios возвращает результаты, отличные от запросов?

В моем API для CORS установлено значение *, и я знаю, что token в Ax ios правильно сохраняется в sessionStorage.

Есть идеи?

1 Ответ

0 голосов
/ 27 апреля 2020

Насколько я вижу, вы передаете свое имя пользователя и пароль в топоре ios как параметры и как данные тела в вашем запросе python, я не уверен, ожидает ли ваш бэкэнд это как параметры или данные тела, но попробуйте изменив const params = new URLSearchParams(); на const params = new FormData();, если проблема в том, что сервер не получает данные тела, которые ему нужны. Лучшее, что я могу порекомендовать, это проверить вкладку сети вашего браузера и посмотреть, в чем именно заключается проблема, когда вы попадаете на сервер.

...