Опубликовать данные формы с помощью axios в Node.js

Я тестирую Uber API на Postman и могу успешно отправить запрос с данными формы. Когда я пытаюсь перевести этот запрос, используя Node.js и библиотеку axios, я получаю сообщение об ошибке.

Вот как выглядит мой запрос почтальона:

Почтальон POST запрос

Я получаю ответ: { "error": "invalid_client" }

Вот что я делаю в Node.js и axios:

var axios = require("axios");

const config = { headers: { 'Content-Type': 'multipart/form-data' } };

axios.post('https://login.uber.com/oauth/v2/token', {
  client_id: '***',
  client_secret: '***',
  grant_type: 'authorization_code',
  redirect_uri: 'http://localhost:8080/',
  code: '***'
}, config)
  .then(function(response) {
    console.log(response.data)
  })
  .catch(function(error) {
    console.log(error)
  })

Когда я делаю это, я получаю 400 ответов.

Я добавил 'multipart/form-data' заголовок, потому что я заполнил данные формы в запросе почтальона. Без заголовка я получаю тот же результат.

Я ожидаю получить тот же ответ, который получаю от Почтальона, что-то не так с моей переменной config в скрипте Node.js?

Любая помощь будет оценена!

7 ответов

Вы могли бы использовать Content-Type: 'application/x-www-form-urlencoded', Я столкнулся с аналогичной проблемой с https://login.microsoftonline.com где он не смог обработать входящий application/json,

var axios = require("axios");

axios({
  url: 'https://login.uber.com/oauth/v2/token',
  headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
  data: `client_id=${encodeURIComponent('**')}&client_secret=${encodeURIComponent('**')}&grant_type=authorization_code&redirect_uri=${encodeURIComponent('http://localhost:8080/')}&code=${encodeURIComponent('**')}`
})
.then(function(response) {
  console.log(response.data)
})
.catch(function(error) {
  console.log(error)
})

Вы также можете использовать функцию для обработки перевода в formUrlEncoded следующим образом

const formUrlEncoded = x =>
   Object.keys(x).reduce((p, c) => p + `&${c}=${encodeURIComponent(x[c])}`, '')

var axios = require("axios");

axios({
  url: 'https://login.uber.com/oauth/v2/token',
  headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
  data: formUrlEncoded({
     client_id: '***',
     client_secret: '***',
     grant_type: 'authorization_code',
     redirect_uri: 'http://localhost:8080/',
     code: '***' 
  })
})
.then(function(response) {
  console.log(response.data)
})
.catch(function(error) {
  console.log(error)
})

Вы можете отправлять данные с помощью axios в Node, используя FormDataотform-dataбиблиотека . Вам все еще нужно установить некоторые дополнительные заголовки, например, установить Content-Typeк multipart/form-data, что вы можете сделать с FormData.getHeaders():

      const axios = require('axios');
const FormData = require('form-data');

const form = new FormData();
form.append('my_field', 'my value');
form.append('my_other_field', 'my second value');

axios.post('http://example.com', form, { headers: form.getHeaders() })

Чтобы отправить данные с Content-Type «application / x-www-form-urlencoded», используйте этот фрагмент:

      const axios = require("axios");
const data = {
  username: "hello",
  password: "byby",
};
const body = new URLSearchParams(data);
axios
  .post("https://api.zipwhip.com/user/login", body)
  .then((res) => console.log(res.data));


По состоянию на 10 июня 2017 года axios библиотека не поддерживает размещение данных формы в Node.js. Вот проблема на GitHub - https://github.com/mzabriskie/axios/issues/789

У нас была похожая проблема, и мы решили перейти на request библиотека.

Этот вариант использования теперь четко задокументирован с несколькими решениями в документации axios: https://axios-http.com/docs/urlencoded .

Судя по ошибке, ваш client_id или client_secret неверен. Включите отладку и поделитесь необработанным запросом / ответом (после фильтрации учетных данных).

Это не правда! Вы можете размещать данные с помощью axios, используя nodejs. Я сделал это. Проблема в том, что, если вы используете PHP на стороне сервера, есть ловушка, о которой вам нужно знать. Axios публикует данные в формате JSON (Content-Type: application/json) Стандартный массив PHP $_POST PHP не заполняется при использовании этого типа контента. Так что всегда будет пусто. Чтобы получить параметры записи, отправленные с помощью json-запроса, вам необходимо использовать file_get_contents (" http://php//input").

Простой сценарий PHP на стороне сервера будет:

if($_SERVER['REQUEST_METHOD']==='POST' && empty($_POST)) {
 $_POST = json_decode(file_get_contents('http://php://input'));
}

Используя этот метод, вы можете избежать зависимости от formData. Вы МОЖЕТЕ опубликовать данные напрямую из node.js.

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