Получение 415 неподдерживаемого типа носителя при запросе токена из Spotify API

См. также lazy_static , что делает вещи немного более эргономичными. Это по существу то же самое, что и статическая Once для каждой переменной, но обертывает ее типом, который реализует Deref, чтобы вы могли получить к нему доступ, как обычная ссылка.

Использование выглядит так ( из документации ):

#[macro_use]
extern crate lazy_static;

use std::collections::HashMap;

lazy_static! {
    static ref HASHMAP: HashMap = {
        let mut m = HashMap::new();
        m.insert(0, "foo");
        m.insert(1, "bar");
        m.insert(2, "baz");
        m
    };
    static ref COUNT: usize = HASHMAP.len();
    static ref NUMBER: u32 = times_two(21);
}

fn times_two(n: u32) -> u32 { n * 2 }

fn main() {
    println!("The map has {} entries.", *COUNT);
    println!("The entry for `0` is \"{}\".", HASHMAP.get(&0).unwrap());
    println!("A expensive calculation on a static results in: {}.", *NUMBER);
}

Обратите внимание, что autoderef означает, что вам даже не нужно использовать * всякий раз, когда вы вызываете метод для вашей статической переменной. Переменная будет инициализирована в первый раз, когда она Deref 'd.

Однако lazy_static переменные неизменяемы (поскольку они находятся за ссылкой). Если вы хотите изменить статичность, вам нужно будет использовать Mutex:

lazy_static! {
    static ref VALUE: Mutex;
}

impl Drop for IsFoo {
    fn drop(&mut self) {
        let mut value = VALUE.lock().unwrap();
        *value += 1;
    }
}

#[test]
fn test_drops_actually_work() {
    // Have to drop the mutex guard to unlock, so we put it in its own scope
    {
        *VALUE.lock().unwrap() = 0;
    }
    {
        let c = CBox;
        c.set(IsFoo);
        c.set(IsFoo);
        c.poll(/*...*/);
    }
    assert!(*VALUE.lock().unwrap() == 2); // Assert that all expected drops were invoked
}

0
задан Marouen 31 March 2019 в 14:54
поделиться

1 ответ

Просто выстрел в темноте, вы пытались передать заголовки непосредственно в конструктор HttpHeaders()? Я видел странные вещи, которые иногда случаются при попытке .append() или .set() заголовков после их создания.

Попробуйте изменить код заголовка / параметра с:

let headers = new HttpHeaders();
headers.append('Content-Type', 'application/x-www-form-urlencoded');
headers.append('Authorization', 'Basic ' + btoa(clientId + ':' + clientSecret));

На:

...

const encodedClient = btoa(`${clientId}:${clientSecret}`);

const headers = new HttpHeaders({
   'Content-Type': 'application/json',
   'Authorization': `Basic ${encodedClient}`
});

const params = new HttpParams({
   'grant_type': 'client_credentials'
});

...

У меня нет никаких гарантий, что это решит вашу проблему, но по вашим фотографиям я вижу что заголовки / параметры не отображаются, и, возможно, стоит попробовать.

Надеюсь, у вас все получится!

В прошлом я использовал API Spotify для стороннего проекта, написанного на Angular, если вас интересуют ссылки на вещи: SpotifyTelevision

0
ответ дан Tony M 31 March 2019 в 14:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: