Ich versuche, fetch
in React Native) zu verwenden, um Informationen aus der Product Hunt-API abzurufen. Ich habe das richtige Zugriffstoken erhalten und es in State gespeichert, aber nicht Es scheint nicht möglich zu sein, es innerhalb des Authorization-Headers für eine GET-Anforderung weiterzuleiten.
Folgendes habe ich bisher:
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();
},
Ich erwarte für meinen Code Folgendes:
fetch
ein Zugriffstoken mit Daten aus meinem importierten API-Modul erstellenclientToken
von this.state
, um dem empfangenen Zugriffstoken zu entsprechen.getPosts
aus, das eine Antwort mit einer Reihe aktueller Posts von Product Hunt zurückgeben sollte.Ich kann überprüfen, ob das Zugriffstoken empfangen wird und ob this.state
empfängt es als seine Eigenschaft clientToken
. Ich kann auch überprüfen, ob getPosts
ausgeführt wird.
Der Fehler, den ich erhalte, ist der folgende:
{"error": "unauthorized_oauth", "error_description": "Bitte geben Sie einen gültigen Zugriffstoken an. Informationen zum Autorisieren einer API-Anforderung finden Sie in unserer API-Dokumentation. Stellen Sie außerdem sicher, dass Sie die richtigen Bereiche benötigen. Bsp." private public " "um auf private Endpunkte zuzugreifen."}
Ich bin davon ausgegangen, dass ich das Zugriffstoken in meinem Autorisierungsheader nicht richtig weitergebe, aber anscheinend nicht in der Lage bin, genau herauszufinden, warum.
Es stellte sich heraus, dass ich die Methode fetch
falsch angewendet habe.
fetch
erwartet zwei Parameter: einen Endpunkt für die API und ein optionales Objekt, das Body und Header enthalten kann.
Ich wickelte das beabsichtigte Objekt in ein zweites Objekt ein, was zu keinem gewünschten Ergebnis führte.
So sieht es auf hohem Niveau aus:
fetch('API_ENDPOINT', OBJECT)
.then(function(res) {
return res.json();
})
.then(function(resJson) {
return resJson;
})
Ich habe mein Objekt so strukturiert:
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'
})
Beispiel für einen Abruf mit Berechtigungskopf:
fetch('URL_GOES_HERE', {
method: 'post',
headers: new Headers({
'Authorization': 'Basic '+btoa('username:password'),
'Content-Type': 'application/x-www-form-urlencoded'
}),
body: 'A=1&B=2'
});
Ich hatte dieses identische Problem, ich benutzte Django-rest-knox für Authentifizierungstoken. Es stellte sich heraus, dass mit meiner Abrufmethode, die so aussah, nichts falsch war:
...
let headers = {"Content-Type": "application/json"};
if (token) {
headers["Authorization"] = `Token ${token}`;
}
return fetch("/api/instruments/", {headers,})
.then(res => {
...
Ich habe Apache ausgeführt.
Was dieses Problem für mich löste, war, WSGIPassAuthorization
in 'On'
In wsgi.conf
Zu ändern.
Ich hatte eine Django App auf AWS EC2 implementiert und verwaltete meine Anwendung mit Elastic Beanstalk. In Django.config
Habe ich Folgendes ausgeführt:
container_commands:
01wsgipass:
command: 'echo "WSGIPassAuthorization On" >> ../wsgi.conf'
completed = (id) => {
var details = {
'id': id,
};
var formBody = [];
for (var property in details) {
var encodedKey = encodeURIComponent(property);
var encodedValue = encodeURIComponent(details[property]);
formBody.Push(encodedKey + "=" + encodedValue);
}
formBody = formBody.join("&");
fetch(markcompleted, {
method: 'POST',
headers: {
'Accept': 'application/json',
'Content-Type': 'application/x-www-form-urlencoded'
},
body: formBody
})
.then((response) => response.json())
.then((responseJson) => {
console.log(responseJson, 'res JSON');
if (responseJson.status == "success") {
console.log(this.state);
alert("your todolist is completed!!");
}
})
.catch((error) => {
console.error(error);
});
};