Bevezetés
Amikor API-kkal dolgozunk, gyakran szeretnénk adatokat küldeni a szervernek feldolgozás céljából. Például, ha van egy listánk a teendőinkről, és azt szeretnénk kiegészíteni, esetleg egy űrlap elküldésével, akkor POST HTTP kéréseket használunk, hogy elküldjük a kérelmet a feldolgozáshoz és a lehetséges tartóssághoz.
Ebből a cikkből megtudjuk, hogyan hajthat végre POST HTTP kéréseket a React alkalmazásban két általános megközelítéssel: a Fetch API és az Axios használatával. Megismerjük, hogyan kell ezt megtenni funkcionális és osztály alapú komponensekben.
A Fetch API használatával a POST HTTP kérés elküldése a React segítségével olyan egyszerű, mint:
fetch('/myserver.endpoint', {
method: 'POST',
body: JSON.stringify({
})
headers: {
'Content-type': 'application/json; charset=UTF-8',
},
})
.then((response) => response.json())
.then((data) => {
console.log(data);
})
.catch((err) => {
console.log(err.message);
});
Az Axios elegáns alternatívát kínál a HTTP POST kérések küldésére:
axios.post('/myserver.endpoint', {
})
.then((response) => {
console.log(response.data);
})
.catch((error) => {
console.log(error);
})
Ha többet szeretne megtudni ezekről a megközelítésekről és működésükről – kérjük, olvassa el az útmutató többi részét!
Mi az a POST HTTP-kérés?
Ahogy a név is sugallja, a POST kéréseket arra használják, hogy adatokat tegyenek fel egy végpontra – amely azután általában feldolgozza és adatbázisba menti. Ezek az adatok származhatnak egy űrlapról, objektumba menthetők, vagy más módon beszerezhetők – de általában JSON-reprezentációvá alakítják át a REST API számára.
A HTTP kérések bármely igével történő küldését egyszerűvé teszi a Fetch API (beépített) és könyvtárak, mint pl Axios. A Fetch API egy beépített böngésző metódus HTTP-kérések végrehajtására, míg az Axios egy külső csomag, amelyet használat előtt telepítenünk kell a projektünkbe.
A választás ezek közül az Önön múlik. A Fetch API részletesebb, és nem működik aszinkron kérésekkel, de az Axios külső függőség. Ennek ellenére sokan szívesebben dolgoznak az Axiosokkal, mint a Fetch API-val. Mindkettőt fedezzük.
Mindkét módszernek vannak előnyei és hátrányai, de fontos megjegyezni, hogy képesek kezelni a szabványos HTTP igéket – POST
, GET
, PUT
, PATCH
, DELETE
.
Jegyzet: Mint korábban említettük, megtanuljuk, hogyan kell teljesíteni POST
kérések funkcionális komponensekkel a Fetch API és Axios metódusok használatával, majd az osztályalapú összetevőkben a JSON helyőrző Ingyenes hamis bejegyzések REST API.
Példánkban azoknak a bejegyzéseknek a listáját fogjuk elkészíteni, amelyeket már letöltöttünk egy hamis API-ból. Létrehozunk egy űrlapot, amely felveszi egy új bejegyzés címét és törzsét, majd a beküldés után egy POST kérést küld a hamis szervernek feldolgozásra:
import { useState, useEffect } from 'react';
const App = () => {
const [posts, setPosts] = useState([]);
useEffect(() => {
fetch('https://jsonplaceholder.typicode.com/posts?_limit=5')
.then((res) => res.json())
.then((data) => {
console.log(data);
setPosts(data);
})
.catch((err) => {
console.log(err.message);
});
}, []);
return (
<>
<div className="add-post-container">
<form>
<input type="text" className="form-control" />
<textarea className="form-control" cols="10" rows="8"></textarea>
<button type="submit">Add Post</button>
</form>
</div>
<div className="posts-container">
{posts.map((post) => {
return (
<div className="post-card" key={post.id}>
<h2 className="post-title">{post.title}</h2>
<p className="post-body">{post.body}</p>
<div className="button">
<div className="delete-btn">Delete</div>
</div>
</div>
);
})}
</div>
</>
);
};
export default App;
Tegyük most működőképessé az űrlapot, hogy az űrlap elküldése után adatokat tudjunk hozzáadni a weboldalunkon található bejegyzések listájához.
A POST HTTP-kérés végrehajtása a React funkcionális komponensében
A React hook-jainak köszönhetően mostantól funkcionális komponensekben is végrehajthatunk HTTP kéréseket. Korábban a funkcionális összetevőket csak a felhasználói felület megjelenítésére használták.
Funkcionális komponens jön létre, amikor egy JavaScript-függvény (standard vagy ES6) React elemet (JSX) ad vissza.
Ahelyett, hogy az állapotobjektumot használnánk a konstruktor metódusban, mint az osztályalapú komponenseknél, most React hookokat használunk, mint pl. useState()
hogy adatainkat az eredeti adatokba való átadás előtt tároljuk.
POST HTTP-kérés végrehajtása a React funkcionális komponensében a Fetch API segítségével
Mivel a Fetch API egy beépített böngésző metódus, amely visszaadja a Promise
, használjuk a .then()
és a .catch()
módszerek a siker és a kudarc kezelésére. Elfogad egy kötelező argumentumot is, amely annak az erőforrásnak/API-nak az URL-je, amelybe az adatokat POSTolni akarjuk, valamint a HTTP kérést jelző argumentumot, ami esetünkben POST
:
import { useState, useEffect } from 'react';
const App = () => {
const [posts, setPosts] = useState([]);
const [title, setTitle] = useState('');
const [body, setBody] = useState('');
const handleSubmit = (e) => {
e.preventDefault();
fetch('https://jsonplaceholder.typicode.com/posts', {
method: 'POST',
body: JSON.stringify({
title: title,
body: body,
userId: Math.random().toString(36).slice(2),
}),
headers: {
'Content-type': 'application/json; charset=UTF-8',
},
})
.then((res) => res.json())
.then((post) => {
setPosts((posts) => [post, ...posts]);
setTitle('');
setBody('');
})
.catch((err) => {
console.log(err.message);
});
};
return (
);
};
export default App;
A fenti kódban létrehoztunk egy metódust, amelyet az űrlaphoz kapcsolunk, így az akkor aktiválódik, amikor az űrlap elküldése gombjára kattintanak. A használattal kezdtük e.preventDefault()
hogy megakadályozzuk az oldal újratöltését az űrlap beküldésekor, ami az rendszerint amit szeretnél, hogy megtörténjen, de nem működik olyan jól a bemutatónkban:
const handleSubmit = (e) => {
e.preventDefault();
};
Nézve a fetch()
hívás esetén az URL-t hozzáadtuk az első kötelező paraméterként, a második paraméter pedig a kérési metódust (POST), a body
, És a header
:
body
– tartalmazza azokat az adatokat, amelyeket el szeretnénk küldeni az API végpontnak, amit nekünk kell szigorít, szöveges alapú JSON-reprezentációvá alakítva.header
– megadja a tartalom típusát, ami esetünkben azapplication/json
, mivel a rakományunk JSON-karakterláncként jelenik meg:
const handleSubmit = (e) => {
e.preventDefault();
fetch('https://jsonplaceholder.typicode.com/posts', {
method: 'POST',
body: JSON.stringify({
title: title,
body: body,
userId: Math.random().toString(36).slice(2),
}),
headers: {
'Content-type': 'application/json; charset=UTF-8',
},
})
};
Végül, mivel ez a metódus visszaadja a Promise
, kivonjuk belőle a JSON tartalmat (a szerver válasza), frissítette a posts
állítsa be az új adatokat.
A hibák kezeléséhez a .catch()
eljárás:
Tekintse meg gyakorlatias, gyakorlati útmutatónkat a Git tanulásához, amely tartalmazza a bevált gyakorlatokat, az iparág által elfogadott szabványokat és a mellékelt csalólapot. Hagyd abba a guglizást a Git parancsokkal, és valójában tanulni meg!
const handleSubmit = (e) => {
e.preventDefault();
fetch({...})
.then((res) => res.json())
.then((post) => {
setPosts((posts) => [post, ...posts]);
setTitle('');
setBody('');
})
.catch((err) => {
console.log(err.message);
});
};
Figyelmeztetés: Jellemzően te nem tárol és dolgoz fel adatokat a kezelőfelületen mint mi, de mivel az általunk használt ál-API valójában nem menti el és nem adja vissza az új bejegyzést – mesterségesen adjuk hozzá a listához, amelyet az első GET-kérésből visszaküld. Miután a bejegyzést eltároltuk az adatbázisban – újabb kérést intézhetünk a háttérhez, hogy a választ adjuk meg a felhasználónak. Ez az oka annak is, hogy az űrlap beküldésének alapértelmezett viselkedése az oldal újratöltése – ami kiváltja a kezdőbetűt fetch()
KÉRÉS KÉRÉSE, és az új bejegyzés automatikusan a régiek mellett jelenjen meg.
POST HTTP kérés végrehajtása a React funkcionális komponensében az Axios segítségével
Az előző részben elmagyaráztuk, hogyan lehet POST-kéréseket végrehajtani a Fetch API-val. Most módosítsuk a handleSubmit()
módszert, és helyette hajtson végre POST kéréseket az Axios segítségével.
Az Axios egy HTTP-ügyfélkönyvtár, amely ígéreteket használ a küldés megkönnyítésére aszinkron HTTP kérések a REST végpontokhoz. Mivel ez egy külső könyvtár, először telepítenünk kell a projektünkbe a következő parancs futtatásával a projektünk könyvtárában:
$ npm install axios
Miután sikeresen telepítettük az Axiost, folytathatjuk a POST kérés végrehajtását:
const handleSubmit = (e) => {
e.preventDefault();
axios
.post('https://jsonplaceholder.typicode.com/posts', {
title: title,
body: body,
})
.then((res) => {
setPosts((posts) => [res.data, ...posts]);
setTitle('');
setBody('');
})
.catch((err) => {
console.log(err.message);
});
};
Ha a fenti kódot nézzük, ez sokkal egyszerűbb és kevesebb szintaxist igényel, mint a Fetch API, mivel többé nem kell JSON-ba konvertálnunk, fejlécekkel dolgoznunk, és még az adatainkat sem kell szigorítani. Ezt a kazánlemezt az Axios absztrahálja.
POST HTTP-kérés végrehajtása a React osztálykomponensében
Az osztályösszetevők POST-kéréseit másképpen kezelik, mint a funkcionális összetevőkben, mivel már nem használunk React hook-okat, hanem a state
tárgy.
Az osztályösszetevő egy ES6 osztály, amely JSX-et ad vissza, és React kiterjesztést igényel.
POST HTTP-kérés végrehajtása a React osztálykomponensében a Fetch API segítségével
A kérés nagyon hasonló a funkcionális komponensek kéréséhez. Csak az adatok tárolása során tapasztalhatunk eltéréseket state
és használat közben state
értékeket, mert már nem használjuk a useState()
horog:
import React, { Component } from 'react';
class App extends Component {
constructor(props) {
super(props);
this.state = {
posts: [],
};
}
handleSubmit = (e) => {
e.preventDefault();
fetch('https://jsonplaceholder.typicode.com/posts', {
method: 'POST',
body: JSON.stringify({
title: this.state.title,
body: this.state.body,
userId: Math.random().toString(36).slice(2),
}),
headers: {
'Content-type': 'application/json; charset=UTF-8',
},
})
.then((response) => response.json())
.then((data) => {
this.setState({ posts: [data, ...this.state.posts] });
this.setState({ title: '' });
this.setState({ body: '' });
})
.catch((err) => {
console.log(err.message);
});
};
render() {
const { posts, title, body } = this.state;
return (
);
}
}
export default App;
Ezúttal már nem deklarálunk módszereket a const
kulcsszó. Ehelyett jelölje be őket a következővel: this
. Ez a módszer akkor lép életbe, amikor az űrlap elküldése gombjára kattintanak. Mivel ez egy űrlap, a használatával kezdtük e.preventDefault()
hogy megakadályozza az oldal újratöltését az űrlap elküldésekor:
handleSubmit = (e) => {
e.preventDefault();
};
Ahogy korábban megtudtuk, a Fetch API két paramétert vesz fel. Az egyik az URL, míg a második olyan opciókat tartalmaz, mint például a kérési mód (POST
), body
, ami az általunk közzétett infó (karikázni kell), majd a headers
:
handleSubmit = (e) => {
e.preventDefault();
fetch('https://jsonplaceholder.typicode.com/posts', {
method: 'POST',
body: JSON.stringify({
title: this.state.title,
body: this.state.body,
userId: Math.random().toString(36).slice(2),
}),
headers: {
'Content-type': 'application/json; charset=UTF-8',
},
})
};
Tudva, hogy ez ígéret, most csatolhatjuk a .then()
módszer a siker kezelésére és a .catch()
módszer a helyzet kezelésére, ha hiba vagy hiba van a HTTP-kérésben.
POST HTTP-kérés végrehajtása a React osztálykomponensében az Axios segítségével
Láttuk, hogyan kell teljesíteni POST
HTTP kérések osztályalapú összetevőkben. Ez nagyon hasonlít az Axioshoz, mivel mindössze annyit kell tennünk, hogy telepítjük az Axiost, majd kicseréljük a handleSubmit()
módszerrel, ezért most az Axiost használjuk a Fetch API helyett:
handleSubmit = (e) => {
e.preventDefault();
axios
.post('https://jsonplaceholder.typicode.com/posts', {
title: this.state.title,
body: this.state.body,
userId: 1,
})
.then((response) => {
this.setState({ posts: [response.data, ...this.state.posts] });
this.setState({ title: '' });
this.setState({ body: '' });
})
.catch((error) => console.log(error));
};
Következtetés
Ebben az útmutatóban megtanultuk, hogyan használhatja a React két elsődleges módszerét a POST HTTP-kérések végrehajtására. Azt is láttuk, hogy ezek hogyan valósíthatók meg funkcionális és osztály alapú komponensekben is, így ez a cikk a projektünkben használtaktól függetlenül szolgálhat számunkra.