A WordPress egyéni API végpont POST-kérése a Reactban sikertelen

szavazat
4

Nekem van egy WordPress háttérrendszer, ahol hozzáadtam saját egyedi végpontjaimat az API-hoz:

// retrieve countries
register_rest_route( $namespace, '/countries',
    array(
        'methods'  => 'GET',
        'callback' => array( $this, 'get_countries' ),
    )
);

// check answer
register_rest_route( $namespace, '/check_answer',
    array(
        'methods'  => 'POST',
        'callback' => array( $this, 'check_answer' ),
    )
);

Így állítottam fel a környezetem: https://example.com itt található a React alkalmazás, a WordPress pedig egy alkönyvtárban található, a https://example.com/wp oldalon.

A React alkalmazás POST és GET kéréseket küld a fenti végpontokhoz. Van egy termelési környezeti változó, ahol beállíthatom az API alap URL-jét, azaz https://example.com/wp/wp-json/game (a „játék” a névtér), így kéréseket tehetek az Axios-szal a következőhöz: https://example.com/wp/wp-json/game/countries és https://example.com/wp/wp-json/game/check_answer és itt jön a kérdés.

A szerver úgy van beállítva, hogy kiszolgálja a React alkalmazást, anélkül, hogy anélkül is www . Tehát a https://example.com és a https://www.example.com egyaránt ugyanazt az alkalmazást szolgálják.

De ez érdekes kérdést vet fel az egyedi végpontjaim számára: a GET kérés mindig működik. de a POST kérés csak akkor működik, ha a https://example.com webhelyről próbálom, nem a https://www.example.com webhelyről . Ez utóbbi esetben egyszerűen megmutatja nekem a sikertelen kérelmet. Nincs válasz, semmi.

Megnéztem, és úgy tűnik, hogy kapcsolódik a CORS-hez, de nem tudtam megjavítani. Van itt ötleted?

A kérdést 09/05/2020 11:32
a forrás felhasználó
Más nyelveken...                            


2 válasz

szavazat
0

Mindenekelőtt szeretném rámutatni, hogy az Ön Get kérések működnek, mert azokhoz a kategóriához tartoznak, amelyek nem indítanak el előzetes repülési kérelmet. Amíg a Post A kérelem valószínűleg valamilyen fejlécet használ, amely eltávolítja azt a kategóriából, ezért előzetes repülést igényel. Ha többet szeretne olvasni, itt található a dokumentációs link.

https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS#Simple_requests

Most, a megjegyzésed szerint, a hibát kapja

Az előzetes repülési kérésre adott válasz nem haladja meg a hozzáférés-ellenőrzést: A kért erőforráson nincs „Hozzáférés-vezérlés-engedélyez-származás” fejléc.

A fejlécek beállításához használt módszer, amint azt egy megjegyzésben említette, nem működik a többi kérésnél. Használhatja az alábbi funkciót a functions.php vagy egy plugin fájlt az eredet beállítására * .

function sr_rest_send_cors_headers( $value ) 
{   
    header( 'Access-Control-Allow-Origin: *' );
    header( 'Access-Control-Allow-Methods: OPTIONS, GET, POST, PUT, PATCH, DELETE' );
    header( 'Access-Control-Allow-Credentials: true' );
    header( 'Vary: Origin', false );

    return $value;
}
add_filter( 'rest_pre_serve_request', 'sr_rest_send_cors_headers', 11 );

Noha azt javaslom, amit alapértelmezés szerint a WordPress csinál. Ha ellenőrzi wp-includes/rest-api.php meg fogja találni az eredeti funkciót, amelyet az Ön céljára módosítottam. Ha érdekli a pillantást, itt található a trac link.

https://core.trac.wordpress.org/browser/tags/5.4/src/wp-includes/rest-api.php#L574

Válaszolt 17/05/2020 10:38
a forrás felhasználó

szavazat
0

Megtaláltam a problémáját, amelyet el kell távolítania az URL-ből wp és működnie kell. Például:

https://example.com/wp/wp-json/game/countries

Kellene:

https://example.com/wp-json/game/countries

Emellett ellenőrizheti ezt az oktatóprogramot . Remélem, hogy segít.

Válaszolt 14/05/2020 09:23
a forrás felhasználó

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more