Привет! У меня возникла проблема, связанная с использованием Fetch() для отправки запроса и передачи данных в формате JSON в WordPress. Я пробую два разных способа отправки данных.
Сначала я использую следующий способ, который работает корректно:
<pre><code class="javascript">let params = {
action: 'ajax_get_taxonomies',
nonce_code : _fg_object.getTaxAJAX_nonce,
params: JSON.stringify([1,2,3])
}
try {
const response = await fetch(_fg_object.ajax_url,
{
method: 'POST',
headers: {'Content-Type': 'application/x-www-form-urlencoded'},
body: new URLSearchParams(params)
})
if (response.ok) {
const data = await response.json();
console.log(data.taxonomies);
} else {
console.error("Error HTTP: " + response.status);
}
}
catch(e) {
console.error('Error occurred!')
}</code></pre>
При использовании объекта <b>new URLSearchParams(params)</b> все успешно отправляется. Однако, когда я пытаюсь использовать другой способ отправки данных с использованием JSON.stringify(), запрос завершается с ошибкой 400 (Bad Request). Вот код, где я применяю JSON.stringify():
<pre><code class="javascript">const response = await fetch(_fg_object.ajax_url,
{
method: 'POST',
headers: { "Content-Type": "application/json", },
body: JSON.stringify({
action: "ajax_get_taxonomies",
nonce_code :
</code></pre>
Можете подсказать, в чем может быть проблема при отправке данных в формате JSON?
Когда вы отправляете данные в формате JSON с помощью функции `fetch()` в WordPress, вам нужно убедиться, что сервер правильно обрабатывает запросы с типом `application/json`. Вот основные шаги, которые стоит проверить:
1. **Правильная обработка JSON на стороне сервера**:
В WordPress вам необходимо правильно обрабатывать запросы, которые приходят с заголовком `Content-Type: application/json`. Для этого вам нужно использовать функцию `file_get_contents('php://input')` для получения содержимого запроса.
2. **Проверка способа передачи данных**:
Убедитесь, что ваш обработчик AJAX в WordPress правильно обрабатывает параметры, которые вы отправляете. Вот пример, как это сделать:
```php
add_action('wp_ajax_ajax_get_taxonomies', 'ajax_get_taxonomies');
add_action('wp_ajax_nopriv_ajax_get_taxonomies', 'ajax_get_taxonomies');
function ajax_get_taxonomies() {
// Проверьте nonce для безопасности
$nonce = $_POST['nonce_code']; // или используйте file_get_contents('php://input') для получения JSON
if (!wp_verify_nonce($nonce, 'your_nonce_action')) {
wp_send_json_error('Invalid nonce');
wp_die();
}
// Если вы используете file_get_contents('php://input'):
$request_body = file_get_contents('php://input');
$data = json_decode($request_body, true);
// Используйте $data для обработки запроса
$params = $data['params']; // например
// Ваш код логики здесь
wp_send_json_success(array('taxonomies' => $taxonomies));
wp_die();
}
```
3. **Правильное использование fetch**:
Проверьте, что ваш `fetch` запрос правильно выглядит. Для отправки JSON-данных код может выглядеть так:
```javascript
const response = await fetch(_fg_object.ajax_url, {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({
action: "ajax_get_taxonomies",
nonce_code: _fg_object.getTaxAJAX_nonce,
params: [1, 2, 3] // передача массива без JSON.stringify, если он уже serialized
})
});
```
4. **Проблемы с кросс-доменными запросами**:
Убедитесь, что у вас включены подходящие заголовки для CORS (если нужно), и что ваш AJAX URL правильный.
### Важно:
Проверяйте, что ваш сервер отвечает на запросы правильно. Если после всех изменений возникает ошибка 400, добавьте отладочную информацию (например, `console.log(request_body)` или `error_log($request_body)` на сервере) для анализа содержимого запрашиваемого тела.
Эти шаги должны помочь вам правильно настроить запросы с использованием JSON в WordPress.
Здесь ты отправляешь массив: <code>JSON.stringify([1,2,3])</code> <br/> А здесь объект: <code>JSON.stringify({action: "ajax_get_taxonomies",</code> <br/> <br/> Полагаю должно быть так: <br/> <pre><code class="javascript">body: JSON.stringify([
{
action: "ajax_get_taxonomies",
nonce_code : _fg_object.getTaxAJAX_nonce,
data: {
username: "JohnDoe",
message: "Hello from fetch!"
}
}
]),</code></pre>