Požadavek na POST koncového bodu uživatelského rozhraní API WordPress selže v React

hlasů
16

Mám backend WordPress, kde jsem do API přidal své vlastní koncové body:

// 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' ),
    )
);

Nastavil jsem své prostředí takto: https://example.com je místo, kde žije aplikace React a WordPress je v podadresáři na https://example.com/wp

Moje aplikace React provádí POST a GET požadavky na výše uvedené koncové body. Mám proměnnou produkčního prostředí, kde jsem nastavil základní URL API, což je https://example.com/wp/wp-json/game ('hra' je můj jmenný prostor), a tak mohu s Axios požádat https://example.com/wp/wp-json/game/countries a https://example.com/wp/wp-json/game/check_answer a tady přichází problém.

Můj server je nakonfigurován tak, aby obsluhoval aplikaci React jak s, tak bez www . Https://example.com a https://www.example.com tedy slouží stejné aplikaci.

Ale to generuje zajímavý problém pro mé vlastní koncové body: požadavek GET vždy funguje. ale POST požadavek funguje, pouze pokud to zkouším z https://example.com , NE z https://www.example.com . V případě posledně jmenovaného mi to jednoduše ukáže neúspěšný požadavek. Žádná odpověď, nic.

Jsem googled a zdá se, že to souvisí s CORS, ale nedokázal jsem to opravit. Máte nějaké nápady?

Položena 09/05/2020 v 11:32
zdroj uživatelem
V jiných jazycích...                            


2 odpovědí

hlasů
0

Nejprve bych chtěl zdůraznit, že vaše Get požadavky fungují, protože patří do kategorie, která nespouští požadavek na předlet. Zatímco vaše Post žádost pravděpodobně používá nějakou hlavičku, která ji odebere z kategorie, takže vyžaduje předletovou kontrolu. Pokud vás zajímá více, zde je odkaz na dokumentaci.

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

Podle vašeho komentáře je nyní chyba, kterou dostáváte

Reakce na žádost o kontrolu před výstupem neprochází kontrolou řízení přístupu: Na požadovaném prostředku není žádná záhlaví 'Access-Control-Allow-Origin'.

Metoda, kterou používáte pro nastavení záhlaví, jak jste uvedli v komentáři, nefunguje u požadavků na odpočinek. Můžete použít níže funkce ve vašem functions.php nebo soubor pluginu pro nastavení původu * .

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 );

I když doporučuji, co WordPress ve výchozím nastavení dělá. Pokud to zkontrolujete wp-includes/rest-api.php najdete původní funkci, kterou jsem pro váš účel upravil. Pokud máte zájem se podívat, zde je odkaz na trac.

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

Odpovězeno 17/05/2020 v 10:38
zdroj uživatelem

hlasů
0

Našel jsem váš problém, který potřebujete odstranit z adresy URL wp a mělo by to fungovat. Například:

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

Mělo by:

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

Také si můžete prohlédnout tento tutoriál . Doufám, že vám to pomůže.

Odpovězeno 14/05/2020 v 09:23
zdroj uživatelem

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