Соединение react native с django, получение данных

Я просто пытаюсь соединить нативное приложение react с бэкендом django.

В Django я установил django.cors.headers. И я сделал конфигурацию в настройках.

Я использую android studio. И я использую эмулятор. И это работает нормально.

И у меня есть настройки для корсов в django:

MIDDLEWARE = [
    "django.middleware.security.SecurityMiddleware",
    "django.contrib.sessions.middleware.SessionMiddleware",
    "corsheaders.middleware.CorsMiddleware",
    "django.middleware.common.CommonMiddleware",
    "django.middleware.csrf.CsrfViewMiddleware",
    "django.contrib.auth.middleware.AuthenticationMiddleware",
    "django.contrib.messages.middleware.MessageMiddleware",
    "django.middleware.clickjacking.XFrameOptionsMiddleware",
]


CORS_ORIGIN_ALLOW_ALL = False
CORS_ORIGIN_WHITELIST = [
    "http://localhost:8081",
    "http://localhost:19006",
    "http://localhost:19002",
    "http://192.168.1.69:19000",
]

и react native

useEffect(() => {
        fetch("http://127.0.0.1:8000/animalGroups/group/", {
            method: "GET",
            headers: {
                Accept: "application/json",
                "Content-Type": "application/json",
            },
        })
            .then((res) => res.json())
            .then((jsonres) => setAnimalGroup(jsonres))
            .catch((error) => console.error(error));
    }, []);

В postman он работает нормально:

Я получаю правильный ответ:

[
    {
        "group_name": "zoogdieren",
        "description": "Dit zijn zoogdieren"
    },
    {
        "group_name": "vissen",
        "description": "Dit is de hoofgroep vissen"
    }
]

и это сообщения в react native:

 Opening on Android...
› Opening exp://192.168.1.69:19000 on MY_ANDROID
› Press ? │ show all commands
› Reloading apps
Android Bundling complete

Но я все еще получаю эту ошибку:

Network request failed
at node_modules\whatwg-fetch\dist\fetch.umd.js:null in setTimeout$argument_0
at node_modules\react-native\Libraries\Core\Timers\JSTimers.js:null in _allocateCallback$argument_0
at node_modules\react-native\Libraries\Core\Timers\JSTimers.js:null in _callTimer
at node_modules\react-native\Libraries\Core\Timers\JSTimers.js:null in callTimers
at node_modules\react-native\Libraries\BatchedBridge\MessageQueue.js:null in __callFunction
at node_modules\react-native\Libraries\BatchedBridge\MessageQueue.js:null in __guard$argument_0
at node_modules\react-native\Libraries\BatchedBridge\MessageQueue.js:null in __guard
at node_modules\react-native\Libraries\BatchedBridge\MessageQueue.js:null in callFunctionReturnFlushedQueue

Так что же я должен изменить?

Спасибо

Салют,

Ваша проблема заключается в url. Ваш эмулятор и ваш сервер должны быть подключены к одной сети. Мобильные эмуляторы, такие как Android studio или даже Xcode, не делают вызовов на localhost(127.0.0.1)

<<< Для этого необходимо подключить компьютер к сети (доступ в Интернет не требуется).

Вы запрашиваете ip-адрес вашей машины в сети (в windows это ipconfig, в Linux - ip address)

В конце запускает сервер django на ip-адресе. пример:

python manage.py runserver 125.568.97.65:8000

Вы возвращаетесь в react native и заменяете:

useEffect(() => {
    fetch("http://125.568.97.65:8000/animalGroups/group/", {
        method: "GET",
        headers: {
            Accept: "application/json",
            "Content-Type": "application/json",
        },
    })
        .then((res) => res.json())
        .then((jsonres) => setAnimalGroup(jsonres))
        .catch((error) => console.error(error));
}, []);

Боннский шанс

Ваша проблема заключается в url. Ваш эмулятор и сервер должны быть подключены в одной сети. Мобильные эмуляторы, такие как Android studio или даже Xcode, не делают вызовы в localhost(127.0.0.1)

Для этого необходимо подключить компьютер к сети (доступ в Интернет не требуется).

Вы запрашиваете ip-адрес вашей машины в сети (под windows это ipconfig, под Linux - ip address)

В конце запустите сервер django на ip-адресе. пример:

python manage.py runserver 125.568.97.65:8000

Вы возвращаетесь к родной реакции и заменяете:

useEffect(() => {
    fetch("http://125.568.97.65:8000/animalGroups/group/", {
        method: "GET",
        headers: {
            Accept: "application/json",
            "Content-Type": "application/json",
        },
    })
        .then((res) => res.json())
        .then((jsonres) => setAnimalGroup(jsonres))
        .catch((error) => console.error(error));
}, []);

Удачи

Вернуться на верх