POST请求作为GET

时间:2018-02-04 20:11:39

标签: javascript fetch-api

我将插入整个模块,以防您需要查看代码的其他方面。有问题的调用是addTracks方法。该项目允许此人搜索spotify库,创建歌曲播放列表,然后将播放列表添加到他们的帐户。一切正常,除了实际保存到帐户的曲目,我在API上收到401错误,但Chrome和FireFox都将其标记为GET调用,而不是POST。该错误是一个身份验证错误,但我应该被正确授权,授权的唯一奇怪的是范围,在getAccessToken()的重定向中处理。我在这里错过了什么?如果您需要它:Spotify add track documentation

let accessToken;
let expiresIn;
const clientId = '86f8f621d81a4ce18bd21da9fd2da2b1';
const redirectURI = 'http://localhost:3000/';

const Spotify = {
  getAccessToken() {
    if (accessToken) {
      return accessToken;
    } else if (window.location.href.match(/access_token=([^&]*)/) != null) {
      accessToken = window.location.href.match(/access_token=([^&]*)/)[1];
      expiresIn = window.location.href.match(/expires_in=([^&]*)/)[1];
      window.setTimeout(() => accessToken = '', expiresIn * 1000);
      window.history.pushState('Access Token', null, '/');
    } else {
      window.location = `https://accounts.spotify.com/authorize?client_id=${clientId}&response_type=token&scope=playlist-modify-public&redirect_uri=${redirectURI}`;
    }
  },

  async search(term) {
    if (accessToken === undefined) {
      this.getAccessToken();
    }
    try {
      let response = await fetch(`https://api.spotify.com/v1/search?type=track&q=${term}`, {
        method: 'GET',
        headers: {
          Authorization: `Bearer ${accessToken}`
        }
      });
      if (response.ok) {
        let jsonResponse = await response.json();
        let tracks = jsonResponse.tracks.items.map(track => ({
          id: track.id,
          name: track.name,
          artist: track.artists[0].name,
          album: track.album.name,
          uri: track.uri
        }));
        return tracks;
      }
    } catch (error) {
      console.log(error);
    }
  },

  async savePlaylist(name, trackURIs) {
    if (accessToken === undefined) {
      this.getAccessToken();
    }
    if (name === undefined || trackURIs === undefined) {
      return;
    } else {
      let userId = await this.findUserId();
      let playlistID;
      fetch(`https://api.spotify.com/v1/users/${userId}/playlists`, {
        method: 'POST',
        headers: {
          Authorization: `Bearer ${accessToken}`,
          "Content-Type": 'application/json'
        },
        body: JSON.stringify({
          name: name
        })
      }).then(response => {
        return response.json()
      }).then(playlist => {
        playlistID = playlist.id;
        this.addTracks(playlistID, trackURIs, userId);
      });
    }
  },

  addTracks(playlistID, trackURIs, userId) {
    console.log(trackURIs);
    fetch(`https://api.spotify.com/v1/users/${userId}/playlists/${playlistID}/tracks`), {
      method: 'POST',
      headers: {
        Authorization: `Bearer ${accessToken}`,
        "Content-Type": 'application/json'
      },
      body: JSON.stringify({
        uris: trackURIs
      })
    }
  },

  findUserId() {
    if (accessToken === undefined) {
      this.getAccessToken();
    }
    let userId;
    return fetch(`https://api.spotify.com/v1/me`, {
      headers: {
        Authorization: `Bearer ${accessToken}`
      }
    }).then(response => {
      return response.json()
    }).then(jsonResponse => {
      userId = jsonResponse.id;
      return userId;
    });
  }
};

export default Spotify;

1 个答案:

答案 0 :(得分:2)

我是初学者,但可能你应该在addTracks()中的fetch()方法中检查括号

addTracks(playlistID, trackURIs, userId) {
    console.log(trackURIs);
    fetch(`https://api.spotify.com/v1/users/${userId}/playlists/${playlistID}/tracks`->)<-, {
      method: 'POST',
      headers: {
        Authorization: `Bearer ${accessToken}`,
        "Content-Type": 'application/json'
      },
      body: JSON.stringify({
        uris: trackURIs
      })
    }
  },

正确

addTracks(playlistID, trackURIs, userId) {
        console.log(trackURIs);
        fetch(`https://api.spotify.com/v1/users/${userId}/playlists/${playlistID}/tracks`, {
          method: 'POST',
          headers: {
            Authorization: `Bearer ${accessToken}`,
            "Content-Type": 'application/json'
          },
          body: JSON.stringify({
            uris: trackURIs
          })
        })
      },