2015-05-12 16 views
53

Próbuję użyć fetch w React Native, aby pobrać informacje z API usługi Product Hunt. Dostałem prawidłowy token dostępu i zapisałem go w stanie, ale nie wydaje się, aby udało mu się przekazać go w nagłówku autoryzacji dla żądania GET.Używanie nagłówka autoryzacji z funkcją Pobierz w React Native

Oto co mam do tej pory:

var Products = React.createClass({ 
    getInitialState: function() { 
    return { 
     clientToken: false, 
     loaded: false 
    } 
    }, 
    componentWillMount: function() { 
    fetch(api.token.link, api.token.object) 
     .then((response) => response.json()) 
     .then((responseData) => { 
      console.log(responseData); 
     this.setState({ 
      clientToken: responseData.access_token, 
     }); 
     }) 
     .then(() => { 
     this.getPosts(); 
     }) 
     .done(); 
    }, 
    getPosts: function() { 
    var obj = { 
     link: 'https://api.producthunt.com/v1/posts', 
     object: { 
     method: 'GET', 
     headers: { 
      'Accept': 'application/json', 
      'Content-Type': 'application/json', 
      'Authorization': 'Bearer ' + this.state.clientToken, 
      'Host': 'api.producthunt.com' 
     } 
     } 
    } 
    fetch(api.posts.link, obj) 
     .then((response) => response.json()) 
     .then((responseData) => { 
     console.log(responseData); 
     }) 
     .done(); 
    }, 

Oczekiwanie mam dla mojego kodu jest następujący:

  1. Pierwszej będę fetch tokenu dostępu do danych z mojego importowanego modułu API
  2. Po tym ustawię właściwość clientToken z this.state na równi z otrzymanym tokenem dostępu.
  3. Następnie uruchomię getPosts, która powinna zwrócić odpowiedź zawierającą tablicę aktualnych wpisów z Product Hunt.

jestem w stanie sprawdzić, czy token dostępu jest odbierany i że this.state odbiera go jako clientToken nieruchomości. Jestem również w stanie sprawdzić, czy uruchamiany jest getPosts.

Błąd Otrzymuję jest następujący:

API Error

pracuję przy założeniu, że ja jakoś nie przechodzi wzdłuż token dostępu właściwie w moim nagłówku autoryzacji, ale don wydaje się być w stanie dokładnie zrozumieć, dlaczego.

Odpowiedz

30

Okazuje się, że nieprawidłowo użyłem metody fetch.

fetch oczekuje dwóch parametrów: punktu końcowego do interfejsu API i opcjonalnego obiektu, który może zawierać treść i nagłówki.

Owinąłem zamierzony przedmiot w obrębie drugiego przedmiotu, co nie przyniosło mi pożądanego rezultatu.

Oto jak to wygląda na wysokim poziomie:

fetch('API_ENDPOINT', OBJECT) 
    .then(function(res) { 
    return res.json(); 
    }) 
    .then(function(resJson) { 
    return resJson; 
    }) 

ja strukturze mojego obiektu jako takie:

var obj = { 
    method: 'POST', 
    headers: { 
    'Accept': 'application/json', 
    'Content-Type': 'application/json', 
    'Origin': '', 
    'Host': 'api.producthunt.com' 
    }, 
    body: JSON.stringify({ 
    'client_id': '(API KEY)', 
    'client_secret': '(API SECRET)', 
    'grant_type': 'client_credentials' 
    }) 
+0

mógłbyś może dostarczyć działający kod? Próbuję użyć pobierania z nagłówkiem autoryzacji i nie sądzę, że mój kod autoryzacji jest przekazywany jako nagłówek, ponieważ otrzymuję odpowiedź '401'. – GoldenBeet

+1

Zrobione, mam nadzieję, że to pomocne –

+1

Och, byłem na twojej osobistej stronie z tym przykładem! Tak po raz pierwszy wzorowałem się na moim. Odkryłem jednak mój problem, po prostu mój adres URL był błędny. Wymagało to '/' na końcu, którego mi brakowało ... – GoldenBeet

80

Przykład sprowadzić z nagłówkiem autoryzacji:

fetch('URL_GOES_HERE', { 
    method: 'post', 
    headers: { 
    'Authorization': 'Basic '+btoa('username:password'), 
    'Content-Type': 'application/x-www-form-urlencoded' 
    }, 
    body: 'A=1&B=2' 
}); 
+1

To działało idealnie dla mnie. Dzięki. –

+0

To nie działa dla mnie. Nagłówek ''Authorization'' po cichu nie dołącza się do firebug. Próbowałem nawet w tym 'credentials: 'include'' w opcjonalnym obiekcie. –

+2

@RonRoyston przeglądasz połączenie OPCJE? jeśli punkt końcowy API nie ma włączonej funkcji CORS (Access-Control-Allow-Origin: *, jeśli uzyskuje dostęp z innej domeny), może to zakończyć się niepowodzeniem w wywołaniu OPTIONS. –