jquery ajax Ошибка при получения json-а в ответ на загрузку файла (formdata) ajax-ом
Primary tabs
Без конкретного сообщения об ошибке вызывается секция catch() для обработки исключения, хотя приходит корректный json-ответ.
Возможная причина
В моем случае был неправильно выставлен атрибут formData - ведь в случае с файлами запрос идет в одном формате (formdata), а ответ получается в формате json.
Пример исправленного метода (можно использовать как функцию для отправки запросов разного типа):
class ApiRequest { constructor() { this.apiToken = ''; this.baseUrl = baseApiUrl; } /** * * @param {srting} $token */ setToken($token) { this.apiToken = $token; } /** * Обобщенный метод для отправки запроса. Его должны использовать уже конкретные методы, напр. post() * * @param {string} type тип запроса (GET, POST и т.д.) * @param {string} url url отностельно базового (this.baseUrl), например вместо '/api/v1/user/login' передавайте просто 'user/login' * @param {mixed} data данные которые хотим передать * @param {string} requestDataType Опционально: формат тела запроса по умолчаню json. * @param {string} responseDataType Опционально: ожидаемый формат тела ответа по умолчаню json. * @param {object} headers Опционально: нестандартные заголовки */ send(type, url, data = null, requestDataType = 'json', responseDataType = 'json', headers = {}) { if (!jswl.isEmpty(this.apiToken)) { // если токен установлен, добавив его в заголовки headers = {...headers, ...{"X-AUTH-TOKEN": this.apiToken}} } if ((type !== 'GET')) { // если это не GET if (requestDataType === 'json') { // если ождиается отправка json data = JSON.stringify(data), headers = {...headers, ...{"Content-Type": "application/json"}} } else if (requestDataType === 'formdata') { // если ождиается отправка formdata let formdata = new FormData(); for (let key in data) { formdata.append(key, data[key]) } data = formdata } } var Request = { type: type, // метод url: this.baseUrl + url, // адрес отправки (url) dataType: responseDataType, // тип возвращаемого значения headers, ... requestDataType === 'formdata' && { contentType: false, processData: false, } }; Request = {...Request, data: data}; // console.log(type, Request, 'Request'); return $.ajax(Request); } //.......
- Log in to post comments
- 1096 reads