WordPress пользовательский API конечной точки POST запрос не удается Реакция

голоса
16

У меня есть бэкэнд WordPress, где я добавил свои собственные пользовательские конечные точки в API:

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

Я настроил свое окружение следующим образом: https://example.com - это то место, где живет приложение React, а WordPress - в подкаталоге, на https://example.com/wp

Мое React приложение делает POST и GET запросы к тем конечным точкам, которые указаны выше. У меня есть переменная среды производства, где я устанавливаю базовый URL API, который (https://example.com/wp/wp-json/game'game' - мое пространство имен), и поэтому я могу делать запросы с Axios, https://example.com/wp/wp-json/game/countriesи https://example.com/wp/wp-json/game/check_answerвот тут-то и возникает проблема.

Мой сервер настроен так, что он обслуживает приложение React как с безwww, так и с без. Так что https://example.com и https://www.example.com оба служат одному и тому же приложению.

Но это создает интересную проблему для моих пользовательских конечных точек: запрос GET всегда работает. Но POST-запрос работает только в том случае, если я пытаюсь его выполнить с https://example.com, а не с https://www.example.com . В случае последнего он просто показывает мне неудачный запрос. Нет ответа, ничего

Я погуглил и, кажется, это связано с CORS, но я не смог это исправить. Есть идеи?

Задан 09/05/2020 в 11:32
источник пользователем
На других языках...                            


2 ответов

голоса
0

Прежде всего хочу отметить, что ваши Getзапросы работают, потому что они принадлежат к категории, которая не вызывает предполетного запроса. В то время как ваш Postзапрос, вероятно, использует какой-то заголовок, который удаляет его из категории, следовательно, требуется пройти предполетный запрос. Если вы хотите прочитать больше, вот ссылка на документацию.

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

Теперь, в соответствии с вашим комментарием, ошибка, которую вы получаете, заключается в следующем

Ответ на предполетный запрос не проходит проверку контроля доступа: Нет Заголовок "Access-Control-Alloww-Origin" присутствует на запрошенном.. ресурс.

Метод, который вы используете для установки заголовков, как вы упомянули в комментарии, не работает при запросах на отдых. Вы можете использовать функцию ниже в вашем functions.phpили плагинном файле, чтобы установить происхождение в *.

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

Хотя я рекомендую то, что WordPress делает по умолчанию. Если вы проверитеwp-includes/rest-api.php, то найдете оригинальную функцию, которую я изменил для ваших целей. Если Вы заинтересованы в том, чтобы посмотреть, вот ссылка trac.

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

Ответил 17/05/2020 в 10:38
источник пользователем

голоса
0

Я нашел твою проблему, которую тебе нужно удалить из урныwp, и она должна сработать. Например:

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

Должна:

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

Также вы можете проверить это руководство. Надеюсь, это вам поможет.

Ответил 14/05/2020 в 09:23
источник пользователем

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