Particle Photon API: получение токена клиента работает на Postman, но не с axios

Я занимаюсь разработкой собственного реагирующего приложения, которое комбинирует фотонную частицу. Следуя документации двухногого автора; перед настройкой устройства мне нужно получить код претензии.

curl -X POST \
  https://api.particle.io/oauth/token \
  -H 'Accept: application/json' \
  -H 'Content-Type: application/x-www-form-urlencoded' \
  -d 'grant_type=client_credentials&client_id=client_id&client_secret=clsecret&scope=customer%3Demail%40gmail.com'

Когда я делаю запрос, используя CURL или даже почтальона, я получил желаемые результаты. Но когда я пробовал это с помощью axios внутри реагировать родной (iOS), я всегда получаю следующую ошибку: Invalid or missing grant_type parameter,

Код ниже - это мой React Native код, который извлекает данные. И, как вы можете видеть, я передаю grant_type.

costumerToken() {
    const route = `${this.route}/oauth/token`;
    const headers = {
        "Accept": "application/json",
        "Content-Type": "application/x-www-form-urlencoded"
    }
    const body = {
        "grant_type": "client_credentials",
        "client_id": this.clientId,
        "client_secret": this.clientSecret,
        "scope": `customer=${this.costumerEmail}`
    }
    console.log(route, headers, body);
    return axios.post(route, body, {headers: headers})
        .then(res => {
            return Promise.resolve(res);
        })
        .catch(err => {
            return Promise.reject(err.response);
        });
}

Что случилось?

1 ответ

Решение

При прохождении Object как axios.post() body, он отправит его как JSON, но API Particle ожидает, что оно будет application/x-www-form-urlencoded, В Axios docs мы углубимся в эту тему. Чтобы это работало, вы можете изменить код на:

customerToken() {
    const route = `${this.route}/oauth/token`;
    const headers = {
        "Accept": "application/json",
        "Content-Type": "application/x-www-form-urlencoded"
    }
    const body = new URLSearchParams();
    body.append("grant_type", "client_credentials");
    body.append("client_id", this.clientId);
    body.append("client_secret", this.clientSecret);
    body.append("scope", `customer=${this.costumerEmail}`);
    console.log(route, headers, body);
    return axios.post(route, body, {headers: headers})
        .then(res => {
            return Promise.resolve(res);
        })
        .catch(err => {
            return Promise.reject(err.response);
        });
}
Другие вопросы по тегам