PokéAPI
(Source)
Une promesse (promise) est un objet qui encapsule une opération dont le résultat n’est pas encore connu.
La fonction JavaScript fetch()
est importée du web.
// Envoie une requête HTTP asynchrone vers l'URL spécifiée
fetch(url)
.then(() => {
// Code appelé ultérieurement si la requête réussit
})
.catch(() => {
// Code appelé ultérieurement si la requête échoue
});
// Envoi d'une requête HTTP asynchrone vers l'URL spécifiée
// La réponse est reçue ici sous forme de données JSON
fetch("http://my-api-url")
// Accès au contenu JSON de la réponse
.then(response => response.json())
// Utilisation du contenu de la réponse
// `content` est un objet ou un tableau JavaScript
.then(content => {
// ...
})
.catch(error => {
console.error(errpr);
});
fetch('https://mywebsite.com/endpoint/', {
method: 'POST',
headers: {
Accept: 'application/json',
'Content-Type': 'application/json',
},
body: JSON.stringify({
firstParam: 'yourValue',
secondParam: 'yourOtherValue',
}),
});
https://github.com/ensc-mobi/RandomBeer
const headers = {
"Content-Type": "application/json",
Accept: "application/json"
};
// Retourne une recette de bière au hasard
export const getRandomBrewdog = () =>
fetch(`${rootEndpoint}/beers/random`, { headers })
.then(response => response.json())
// Access first element of returned array
.then(beers => beers[0])
.catch(error => {
console.error(error);
});
// ...
_getRandomBrewdogWithFeedback = () => {
this.setState({ isLoading: true });
getRandomBrewdog().then(beer =>
this.setState({
name: beer.name,
description: beer.description,
isLoading: false // la requête est terminée
})
);
};
componentDidMount() {
this._getRandomBrewdogWithFeedback();
}
// ...
https://github.com/mevdschee/php-crud-api
Fichier api.php
à publier sur un serveur web PHP. Fournit une API web pour accéder aux données d’un SGBDR.
// Update to reflect your local settings
$config = new Config([
'username' => 'xxx',
'password' => 'xxx',
'database' => 'xxx',
]);
URL http://my-server-url/api.php/records/...
GET my-table
: renvoie la liste des enregistrements de la table my-table
.GET my-table/id
: renvoie l’enregistrement identifié par id
.POST my-table
: création d’un nouvel enregistrement avec les données contenues dans le corps de la requête.https://github.com/ensc-mobi/MyMoviesNative
export default class Movie {
@observable id;
@observable title;
// ...
@observable image;
constructor(
id,
title,
// ...
image
) {
this.id = id;
this.title = title;
// ...
this.image = image;
}
}
const rootEndpoint = "http://localhost/mymovies/api.php/records";
const headers = {
"Content-Type": "application/json",
Accept: "application/json"
};
export const getAllMovies = () =>
fetch(`${rootEndpoint}/movie/`, { headers })
.then(response => response.json())
.then(jsonResponse => jsonResponse.records)
.catch(error => {
console.log(error);
});
export default class MovieStore {
@observable movies;
// ...
fetchAll() {
this.movies = [];
getAllMovies().then(movies => {
//console.log(movies);
movies.forEach(movieData => {
const movie = new Movie(
movieData.mov_id,
movieData.mov_title,
// ...
movieData.mov_image
);
this.movies = [movie, ...this.movies];
});
});
}
}
export default class HomeScreen extends React.Component {
render() {
const movieStore = new MovieStore();
// All React Navigation screens receive this object as prop
const { navigation } = this.props;
// Navigation object is passed down to children components
return <MainView movieStore={movieStore} navigation={navigation} />;
}
}
@observer
export default class MovieItem extends React.Component {
render() {
const { movie } = this.props;
const { navigation } = this.props;
return (
<View style={styles.container}>
<TouchableOpacity
onPress={() => {
navigation.navigate("Details", {
movie: movie
});
}}
>
<Text style={styles.text}>
{movie.title} ({movie.year})
</Text>
</TouchableOpacity>
</View>
);
}
}
export default class DetailsScreen extends React.Component {
render() {
const { navigation } = this.props;
const movie = navigation.getParam("movie");
const imageUrl = imagesEndpoint + movie.image;
return (
<View style={styles.container}>
<Text style={styles.title}>
{movie.title} ({movie.year})
</Text>
<Text style={styles.director}>Réalisateur(s) : {movie.director}</Text>
<Text style={styles.description}>{movie.shortDescription}</Text>
<Image style={styles.image} source={{ uri: imageUrl }}></Image>
</View>
);
}
}