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);
});
}