2016-08-05 3 views
0

У меня есть конечная точка API, которую я хочу вызвать. Это кажется легкой задачей, но, к моему удивлению, это не так. Вот почему:Как сделать POST необработанные данные JSON без использования AJAX?

  • Я не могу использовать AJAX, потому что ответ этого API - это файл для загрузки. Поэтому мне, вероятно, нужно создать скрытый iframe и отправить регулярный запрос POST оттуда.
  • Мне нужны данные POST в виде строки JSON, а не в данных формы. API не принимает пары ключевых значений. Поэтому я не могу просто создать HTML-форму и отправить ее.
  • Это не мой API. Я не могу его изменить.

Теперь я застрял. Есть ли что-нибудь еще, что я могу попробовать?

+1

_ «потому что реакция этого API файл для загрузки» _, AJAX запросы могут извлекать файлы, вы просто должны выполните дополнительный шаг, чтобы сохранить файл в локальной системе пользователя. –

+0

Что такое «сырая строка JSON»? Таким образом, API «не принимает пары ключевых значений [JSON]», и вы хотите отправить JSON через HTML-форму? А? – undefined

+0

Не могли бы вы предоставить образцы данных, которые API примет, чтобы лучше понять? – Vijai

ответ

2

Вы можете сделать это с помощью AJAX или сырым XMLHttpRequest()

несколько вещей, уже упомянутых в commments на ваш вопрос, объяснить, что здесь происходит.

Сначала вам нужен объект запроса. Проводка не проблема, вы передадите полезную нагрузку JSON, которую вы должны отправить на эту последнюю строку. После успешного завершения POST вам нужно будет вернуть возвращаемый двоичный файл и создать Blob для правильного типа файла, objecctUrl и, наконец, скрытую ссылку, которую вы нажмете для пользователя. Обратите внимание на атрибут загрузки. Это позволяет современным браузерам знать, что это ссылка для загрузки, которая позволяет загружать бросок.

Я, вероятно, получил часть этого кода из StackOverflow ...

const xlsx = {}; 
    const xhr = new XMLHttpRequest(); 
    xhr.open('POST', '/data/some.ashx'); 
    xhr.responseType = 'blob'; 
    xhr.setRequestHeader('Content-Type', 'application/json'); 
    xhr.onload = function loadXLXS() { 
    let objectUrl; 
    if (this.status === 200) { 
     blob = this.response 
     csvURL = window.URL.createObjectURL(blob); 
     tempLink = document.createElement('a'); 
     tempLink.href = csvURL; 
     tempLink.setAttribute('download', workBookName); 
     tempLink.click(); 
    } 
    }; 
    xhr.send(JSON.stringify(xlsx)); 
+0

Вам следует добавить объяснение того, что вы делаете. В частности, создание и использование URL-адресов объекта как OP, а другие могут не знать о них. Также 'xhr.responseType = 'blob'', установив для' blob', 'xhr.response' уже должен быть объект blob, не нужно делать' blob = new Blob() ' –

+0

Спасибо Kosch и @PatrickEvans I' Попробуем. –

+0

Отлично работает! Большое спасибо! –

Смежные вопросы