ошибка неправильного запроса 400 с составным HTTP-запросом

#jquery #html #json #ajax

#jquery #HTML #json #ajax

Вопрос:

Я пытаюсь попасть в 1 API, делая запрос HTTP POST с использованием составных данных, но я получаю ошибку 400 Bad Request.

 var reqPayload='{
    "param1":"value1"
}';

var ajaxOptions = {
            url: href,
            type: method_NAME,
            async: true
};
ajaxOptions.data = new FormData();
ajaxOptions.data.append("jsonInputParameters", $.parseJSON(reqPayload));

ajaxOptions.contentType = false;
ajaxOptions.processData = false;

//following will not create any problem since there is only 1 file.
$.each($('#id_NAME input[type="file"]')[0].files, function(i, file) {
    ajaxOptions.data.append('primaryFile', file);
});
  

Мой запрос выглядит следующим образом:

 ------WebKitFormBoundary9hoSobTAHgGksFST
Content-Disposition: form-data; name="jsonInputParameters"

[object Object]
Content-Disposition: form-data; name="primaryFile"; filename="example.txt"
Content-Type: text/plain

------WebKitFormBoundary9hoSobTAHgGksFST
  

Но я хочу вот чего:

 ------WebKitFormBoundary9hoSobTAHgGksFST
Content-Disposition: form-data; name="jsonInputParameters"

{
"parentID":"FB4CD874EF94CD2CC1B60B72T0000000000100000001"
}

------WebKitFormBoundary9hoSobTAHgGksFST
Content-Disposition: form-data; name="primaryFile"; filename="example.txt"
Content-Type: text/plain

<File Content>
------WebKitFormBoundary9hoSobTAHgGksFST--
  

Пожалуйста, дайте мне знать, как решить эту проблему.

Ответ №1:

Ваша reqPayload переменная представляет собой строку, поэтому вам вообще не нужно ее сериализовать; вы можете просто добавить ее FormData как есть:

 ajaxOptions.data.append("jsonInputParameters", reqPayload);
  

Тем не менее, это гораздо лучшая практика и проще в обслуживании, если вы создаете полезную нагрузку как объект, а затем используете JSON.stringify для сериализации данных перед отправкой запроса, например:

 var reqPayload = {
    param1: "value1"
};
ajaxOptions.data.append("jsonInputParameters", JSON.stringify(reqPayload));
  

Комментарии:

1. Но переменная reqPayload уже находится в строковом формате. Итак, как это может помочь?

2. Кроме того, мне нужно отправить объект вместо строки

3. Хороший момент. В этом случае просто добавьте его прямо в FormData без какой-либо кодировки.

4. Вы не можете отправить объект в HTTP-запросе, он должен быть сериализован в строку

5. Огромное спасибо, Рори. Сработала простая передача строки. Я долгое время пытался передать информацию как объект. Большое спасибо.