Получение следующего ответа кода 500 при вызове моего API: PUT https://my-site.com/wp/wp-json/contact/v1/send 500
В functions.php
мой пользовательский маршрут WP определяется следующим образом:
function sendContactMail(WP_REST_Request $request) {
}
add_action('rest_api_init', function () {
register_rest_route( 'contact/v1', 'send', array(
'methods' => 'PUT',
'callback' => 'sendContactMail'
));
});
Вот как я делаю вызов API:
formData.append('contact_name', this.contactName)
formData.append('contact_email', this.contactEmail)
formData.append('contact_message', this.contactMessage)
this.$axios.$put('https://my-site.com/wp/wp-json/contact/v1/send', formData)
.then((res) => {
this.ApiResponse = res
})
.catch((err) => {
this.$toast.error(err.response)
})
Почему я получаю ошибку 500?
Что будет, если вместо https://my-site.com/wp/wp-json/contact/v1/send
вызвать https://my-site.com/wp-json/contact/v1/send
(без папки /wp/)? Есть ли у вас переадресация .htaccess или что-то подобное?
Откройте эту ссылку (my-site.com/wp/wp-json) в браузере и убедитесь, что contact/v1
находится в пространстве имен.
timur У меня есть доступ к журналу веб-сервера, при отправке контактной формы ошибок нет. JP.Aulet Я получаю 404, если я это сделаю. SagarBahadurTamang это так, my-site.com/wp/wp-json/contact/v1 отлично работает
@ drake035, ваш код выглядит нормально, поэтому, вероятно, ваш обратный вызов (sendContactMail()
) вызывает внутреннюю ошибку сервера (с кодом состояния 500). Попробуйте что-нибудь вроде function sendContactMail() { return array( 'foo' => 'bar' ); }
для тестирования — ошибка 500 по-прежнему возникает? Попробуйте также отладку в WordPress и проверьте наличие соответствующих ошибок.
Функция обновления, подобная этой
function sendContactMail(WP_REST_Request $request) {
}
add_action('rest_api_init', function () {
register_rest_route( 'contact/v1', '/send', array(
'methods' => 'PUT',
'callback' => 'sendContactMail'
));
});
Функция обновления, подобная этой
formData.append('contact_name', this.contactName)
formData.append('contact_email', this.contactEmail)
formData.append('contact_message', this.contactMessage)
this.$axios.$put('https://my-site.com/wp-json/contact/v1/send', formData)
.then((res) => {
this.ApiResponse = res
})
.catch((err) => {
this.$toast.error(err.response)
})
ничего не меняет
Вероятно, проблема в том, что функция обратного вызова ожидает значение return
. В конце вашего function sendContactMail(WP_REST_Request $request) { }
вы захотите вернуть WP_REST_Response или WP_Error, чтобы отправить ответ обратно.
Я привел небольшой пример здесь: https://xhynk.com/content-mask/65451758-answer/
Кнопки «Click Me (Bad)» и «Click Me (Good)» делают то же самое, за исключением изменения отправляемых данных. Единственная разница в функции sendContactMail()
заключается в следующем:
function sendContactMail(WP_REST_Request $request) {
if ( $request->get_body() == 'return=true' ){
return new WP_REST_Response(
array(
'status' => 200,
'response' => 'Did the thing'
);
);
}
}
«Истинное» условие срабатывает только при нажатии кнопки «Хорошо», когда обрабатывается блок .done()
, а кнопка «Плохо» запускает блок .catch
.
Таким образом, вы сможете решить свою проблему, выполнив X, Y, Z с вашими данными и убедившись, что вы возвращаете правильный ответ.
Также убедитесь, что вы не сталкиваетесь с ошибкой PHP (например, при прямом доступе к свойствам $request
, поскольку они являются свойствами protected
, и выполнение чего-то вроде if ( $request->body == 'something' )
вызовет «Неустранимая ошибка PHP: невозможно получить доступ к защищенному свойству» и обработает 500 ошибка.
Это правда, что обратный вызов конечной точки должен что-то возвращать, но я не думаю, что это проблема. И на самом деле, в руководстве по REST API говорится: «Начиная с WordPress 5.5, выдается _doing_it_wrong
уведомление, если wp_send_json()
семейство функций используется во время запроса REST API». Таким образом, можно было бы просто вернуть значение, которое затем будет автоматически закодировано в формате JSON.
Хороший улов на wp_send_json()
, похоже, у меня действительно есть код для обновления! Отсутствие возврата чего-либо всегда приводило к срабатыванию блока catch для меня и, конечно же, к фатальной ошибке в функции. Единственный способ, которым я смог воспроизвести аналогичные проблемы с OP, - это вообще не возвращать значение или делать что-то незаконное, например, обращаться к защищенному свойству/неопределенной функции.
«Не возвращая что-то, я всегда запускал бы блок catch» — я думаю, что если вы попробуете с Axios, чем с jQuery.ajax() , этого не произойдет. Вы можете попробовать ничего не возвращать и протестировать здесь.. :)
Так что на самом деле if ($request->get_body() == 'return=true')
никогда не бывает правдой в моем случае, есть идеи, почему? Но если я уберу это условие, оно сработает. Проблема заключалась в моем возврате: return json_decode(json_encode($response));
Эта строка вызвала ошибку, заменив ее на ваш возврат return new WP_REST_Response(...
исправила проблему, спасибо!
if ($request->get_body() == 'return=true')
— это данные, которые передал только мой пример (чтобы помочь отличить «хорошую» кнопку от «плохой», ту, которая возвращает ответ, и ту, которая нет. Рад помочь!
Ошибка заключается в том, что мой API вызывает JS-скрипт
Итак, удалите лишний wp из URL-адреса, и URL-адрес обновления будет выглядеть так
https://my-site.com/wp-json/contact/v1/send
Обновленный скрипт будет выглядеть следующим образом
formData.append('contact_name', this.contactName)
formData.append('contact_email', this.contactEmail)
formData.append('contact_message', this.contactMessage)
this.$axios.$put('https://my-site.com/wp-json/contact/v1/send', formData)
.then((res) => {
this.ApiResponse = res
})
.catch((err) => {
this.$toast.error(err.response)
});
у вас есть доступ к логам сервера? Журналы ошибок WP?