🎶
AxiosでSpotify Web APIを使うときにpostリクエストで詰まった
はじめに
こちらの記事でSpotify WEB APIにpostリクエストを行うときに少し詰まったのでメモです。
著者はReactの初学者です。
事象
axios.get
メソッドで正常に作動していた下記の形式を流用しpost
リクエストを行ったところ、401 Unauthorized
エラーが返ってくる。
const result = await axios.post(
`https://api.spotify.com/v1/playlists/${id}/tracks?${searchParam.toString()}`,
{
headers: {
"Content-Type": "application/json",
"Authorization": `Bearer ${accessToken}`
}
}
);
原因
公式ドキュメントのわかりやすいところに書いていました。get
メソッドaxios.get(url[, config])
に対して
post
メソッドはaxios.post(url[, data[, config]])
となっています。
現在の状態ではheaders
がdata
として処理されてしまっているのでしょう。
解決
コードの変更
data
引数を追加してheader
が正常に処理されるようにします。
const result = await axios.post(
`https://api.spotify.com/v1/playlists/${id}/tracks?${searchParam.toString()}`,
+ {},
{
headers: {
"Content-Type": "application/json",
"Authorization": `Bearer ${accessToken}`
}
}
);
インスタンス化
さらに再発の防止とコード削減のためにheader
部分をインスタンス化します。
export class ApiClient{
static createInstance = (accessToken: string) =>{
const instance = axios.create({
baseURL: 'https://api.spotify.com/v1',
headers:{
'Content-Type': 'application/json',
'Authorization': `Bearer ${accessToken}`
}
});
return instance;
}
static async get<T>(url: string, accessToken: string){
const instance = this.createInstance(accessToken);
return await instance.get(url)
.catch((e) => {
return Promise.reject(e);
});
}
static async post(url: string, accessToken: string, data?: any){
const instance = this.createInstance(accessToken);
return await instance.post(url, data)
.catch((e) => {
return Promise.reject(e);
});
}
}
const result = ApiClient.post(
`/playlists/${id}/tracks?${searchParam.toString()}`,
accessToken,
);
これで間違いなくリクエストを行うことができるようになりました。
おわりに
表題にはSpotify Web APIと書きましたが、原因はパッケージ側でした。しかし、同じような事象で詰まった人が検索で辿り着けるように表題には残しておきます。公式ドキュメントを見ることが大切なことを今回でつくづく実感しました。
今後も詰まったところは解決策を形に残すことを心がけたいと思います。
Discussion