Suche…


Syntax

  • Abruf (URL, Optionen) [. dann (...) [. catch (...)]]

Bemerkungen

  • Die Fetch-API ist die am häufigsten verwendete API für HTTP-Anforderungen. Es ist modern, flexibel und setzt Versprechen ein.
  • Die XMLHttpRequest-API wird auch für HTTP-Anforderungen verwendet und ist hauptsächlich enthalten, damit Entwickler ihre bevorzugten vorhandenen Bibliotheken wie ApiSauce verwenden können .
  • Die Websocket-API kann für "Live" -Daten in Echtzeitszenarien verwendet werden, beispielsweise in Chat-Anwendungen.

WebSockets

var ws = new WebSocket('ws://host.com/path');

ws.onopen = () => {
  // connection opened

  ws.send('something'); // send a message
};

ws.onmessage = (e) => {
  // a message was received
  console.log(e.data);
};

ws.onerror = (e) => {
  // an error occurred
  console.log(e.message);
};

ws.onclose = (e) => {
  // connection closed
  console.log(e.code, e.reason);
};

HTTP mit der Abruf-API

Es sei darauf hingewiesen, dass Fetch keine Statusrückrufe unterstützt . Siehe: https://github.com/github/fetch/issues/89 .

Alternativ können Sie XMLHttpRequest https://developer.mozilla.org/en-US/docs/Web/Events/progress verwenden .

fetch('https://mywebsite.com/mydata.json').then(json => console.log(json));

fetch('/login', {
  method: 'POST',
  body: form,
  mode: 'cors',
  cache: 'default',
}).then(session => onLogin(session), failure => console.error(failure));

Weitere Details zum Abruf finden Sie unter MDN

Vernetzung mit XMLHttpRequest

var request = new XMLHttpRequest();
request.onreadystatechange = (e) => {
  if (request.readyState !== 4) {
    return;
  }

  if (request.status === 200) {
    console.log('success', request.responseText);
  } else {
    console.warn('error');
  }
};

request.open('GET', 'https://mywebsite.com/endpoint/');
request.send();

Versprechen mit der Abruf-API und Redux verwenden

Redux ist die am häufigsten verwendete Zustandsverwaltungsbibliothek, die mit React-Native verwendet wird. Das folgende Beispiel zeigt, wie Sie die Abruf-API verwenden und Änderungen mithilfe von redux-thunk an den Statusreduzierer Ihrer Anwendung weiterleiten.

export const fetchRecipes = (action) => {
  return (dispatch, getState) => {
    fetch('/recipes', {
        method: 'POST',
        headers: {
          'Accept': 'application/json',
          'Content-Type': 'application/json'
        },
        body: JSON.stringify({
          recipeName,
          instructions,
          ingredients
        })
    })
    .then((res) => {
      // If response was successful parse the json and dispatch an update
      if (res.ok) {
        res.json().then((recipe) => {
          dispatch({
            type: 'UPDATE_RECIPE',
            recipe
          });
        });
      } else {
        // response wasn't successful so dispatch an error
        res.json().then((err) => {
          dispatch({
            type: 'ERROR_RECIPE',
            message: err.reason,
            status: err.status
          });
        });
      }
    })
    .catch((err) => {
      // Runs if there is a general JavaScript error.
      dispatch(error('There was a problem with the request.'));
    });
  };
};

Websockel mit Socket.io

Socket.io-Client installieren

npm i socket.io-client --save

Modul importieren

import SocketIOClient from 'socket.io-client/dist/socket.io.js'

Initialisieren Sie in Ihrem Konstruktor

constructor(props){
    super(props);
    this.socket = SocketIOClient('http://server:3000');
  }

Damit Sie Ihre Socket-Verbindung ordnungsgemäß verwenden können, sollten Sie Ihre Funktionen auch im Konstruktor binden. Nehmen wir an, wir müssen eine einfache Anwendung erstellen, die alle 5 Sekunden einen Ping per Socket an einen Server sendet (dies als Ping betrachten), und die Anwendung erhält eine Antwort vom Server. Dazu erstellen wir zunächst diese beiden Funktionen:

_sendPing(){
    //emit a dong message to socket server
    socket.emit('ding');
}

_getReply(data){
    //get reply from socket server, log it to console
    console.log('Reply from server:' + data);
}

Nun müssen wir diese beiden Funktionen in unserem Konstruktor binden:

constructor(props){
    super(props);
    this.socket = SocketIOClient('http://server:3000');

    //bind the functions
    this._sendPing = this._sendPing.bind(this);
    this._getReply = this._getReply.bind(this);
}

Danach müssen wir auch die _getReply-Funktion mit dem Socket verknüpfen, um die Nachricht vom Socket-Server zu erhalten. Dazu müssen wir unsere _getReply-Funktion mit dem Socket-Objekt verknüpfen. Fügen Sie unserem Konstruktor die folgende Zeile hinzu:

this.socket.on('dong', this._getReply);

Immer wenn Socket-Server mit dem 'Dong' emittiert, kann Ihre Anwendung dies jetzt empfangen.

HTTP mit Axios

Konfigurieren

Für die Webanfrage können Sie auch Bibliotheks- Axios verwenden .

Es ist einfach zu konfigurieren. Zu diesem Zweck können Sie beispielsweise die Datei axios.js erstellen:

import * as axios from 'axios';

var instance = axios.create();
instance.defaults.baseURL = serverURL;
instance.defaults.timeout = 20000;]
//...
//and other options

export { instance as default };

und dann in einer beliebigen Datei verwenden.

Anfragen

Um zu vermeiden, dass das Muster "Schweizer Messer" für jeden Dienst in Ihrem Backend verwendet wird, können Sie eine separate Datei mit Methoden für diesen Ordner im Ordner für die Integrationsfunktionalität erstellen:

import axios from '../axios';
import { 
    errorHandling
} from '../common';

const UserService = {
        getCallToAction() {
        return axios.get('api/user/dosomething').then(response => response.data)
            .catch(errorHandling);
    },
}
export default UserService;

Testen

Es gibt eine spezielle Bibliothek zum Testen von Axios: Axios-Mock-Adapter .

Mit dieser Bibliothek können Sie jede Antwort festlegen, die Sie zum Testen benötigen. Sie können auch einige spezielle Fehler für Ihre axois'es-Methoden konfigurieren. Sie können es zu Ihrer im vorherigen Schritt erstellten Datei axios.js hinzufügen:

import MockAdapter from 'axios-mock-adapter';

var mock = new MockAdapter(instance);
mock.onAny().reply(500);

zum Beispiel.

Redux Store

In manchen Fällen müssen Sie den Autorisierungs-Token, die Sie wahrscheinlich in Ihrem Redux-Store speichern, den Header hinzufügen.

In diesem Fall benötigen Sie eine andere Datei, interceptors.js mit dieser Funktion:

export function getAuthToken(storeContainer) {
    return config => {
        let store = storeContainer.getState();
        config.headers['Authorization'] = store.user.accessToken;
        return config;
    };
}

Als Nächstes können Sie im Konstruktor Ihrer Stammkomponente Folgendes hinzufügen:

axios.interceptors.request.use(getAuthToken(this.state.store));

und dann werden alle Ihre Anforderungen mit Ihrem Autorisierungstoken verfolgt.

Wie Sie sehen, ist axios eine sehr einfache, konfigurierbare und nützliche Bibliothek für Anwendungen, die auf React-Native basieren.



Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow