Voraussetzung
JSON Server
npm install -g json-server
(Mac / Linux:)
sudo npm install -g json-server
- Start des Servers aus dem Projekt-Directory
- Startet mit Port 3000 (default) (Konflikt: selber Port wie nmp start !)
- Angabe der Datei, die überwacht werden soll mit watch
npx json-server --watch src/assets/db.json --port 3100
- Beispielpost
- PFAD/posts/1 entspricht posts mit "id": 1
http://localhost:3100/posts
http://localhost:3100/posts/1
- Beispieldaten ( z.B. in assets/db.json )
- "echtes" JSON: Attributnamen immer mit Anführungsstrichen
{
"posts": [
{ "id": 1, "title": "json-server", "author": "typicode" }
],
"comments": [
{ "id": 1, "body": "some comment", "postId": 1 }
],
"profile": { "name": "typicode" }
}
Optional: JSON Formatter & Validator
Axios
- https://axios-http.com/
- Promise-basierter HTTP-Client für node.js und den browser
- isomorphisch: Verwendung auf Server und im Browser
- Server-Seite: modul http
- Browser: XMLHttpRequests (ajax)
npm install axios
HTTP GET mit Axios
import React, { Component } from 'react'
import axios from 'axios'
class Beispiel extends Component {
constructor(props) {
super(props)
this.state = {
posts: [],
errorMessage: ''
}
}
componentDidMount() {
axios.get('https://jsonplaceholder.typicode.com/posts')
.then(response => {
console.log(response)
this.setState({
posts: response.data
})
})
.catch(error => {
console.log(error)
this.setState({
errorMessage: 'Fehler beim Laden'
})
})
}
render() {
return (
<div>
<h2>Beiträge</h2>
{
this.state.posts.length>0 &&
this.state.posts.map(post => <div key={post.id}>{post.title}</div>)
}
{
this.state.errorMessage &&& <div>{this.state.errorMessage}</div>
}
</div>
)
}
}
export default Beispiel
HTTP POST
import React, { Component } from 'react'
import axios from 'axios'
class Beispiel extends Component {
constructor(props) {
super(props)
this.state = {
name: ''
}
}
handleChange = event => {
this.setState({ name: event.target.value });
}
handleSubmit = event => {
event.preventDefault();
const user = {
name: this.state.name
};
axios.post(`https://jsonplaceholder.typicode.com/users`, { user })
.then(response => {
console.log(response);
console.log(response.data);
})
}
render() {
return (
<div>
<form onSubmit={this.handleSubmit}>
<label>
Username:
<input type="text" name="name" onChange={this.handleChange} />
</label>
<button type="submit">Hinzufügen</button>
</form>
</div>
)
}
}
export default Beispiel
HTTP PUT
import React, { Component } from 'react'
import axios from 'axios'
class Beispiel extends Component {
constructor(props) {
super(props)
this.state = {
posts: [],
errorMessage: ''
}
this.base_url = "http://localhost:3000"
}
componentDidMount() {
axios.get(this.base_url + '/posts')
.then(response => {
console.log(response)
this.setState({
posts: response.data
})
})
.catch(error => {
console.log(error)
this.setState({
errorMessage: 'Fehler beim Laden'
})
})
}
handleUpdate() {
let exampleID = 1
axios.put(this.base_url + '/posts/' + exampleID + '/',
{ "userId": 1, "title": "lorem", "body": "ipsum" })
.then(response => {
const updatedData = data.map(ele => (ele.id === exampleID ? response.data : ele))
this.setState({
posts: updatedData
})
})
.catch(error => {
console.log(error)
})
}
render() {
return (
<div>
<h2>Beiträge</h2>
<button onClick={() => this.handleUpdate()}>Hinzufügen</button>
{
this.state.posts.length>0 &&
this.state.posts.map(post => <div key={post.id}>{post.title}</div>)
}
{
this.state.errorMessage &&& <div>{this.state.errorMessage}</div>
}
</div>
)
}
}
export default Beispiel
HTTP DELETE
import React, { Component } from 'react'
import axios from 'axios'
class Beispiel extends Component {
constructor(props) {
super(props)
this.state = {
posts: [],
errorMessage: ''
}
this.base_url = "http://localhost:3000"
}
componentDidMount() {
axios.get(this.base_url + '/posts')
.then(response => {
console.log(response)
this.setState({
posts: response.data
})
})
.catch(error => {
console.log(error)
this.setState({
errorMessage: 'Fehler beim Laden'
})
})
}
handleDelete(id) {
axios.delete(this.base_url + '/posts/' + id + '/')
.then(response => {
let tempData= data.filter(ele => id != ele.id )
this.setState({
posts: tempData
})
})
.catch(error => {
console.log(error)
})
}
render() {
return (
<div>
<h2>Beiträge</h2>
{
this.state.posts.length>0 &&
this.state.posts.map(post => (<div key={post.id}>
{post.title}
<span onClick={() => this.handleDelete(post.id)}>Löschen</span>
</div>))
}
{
this.state.errorMessage &&& <div>{this.state.errorMessage}</div>
}
</div>
)
}
}
export default Beispiel