2016-11-02 6 views
4

Недавно я обнаружил, что я конвертирую функцию, которая вызывает удаленный API, от возврата обратного вызова до возврата Promise. Я думал, что это отличная возможность также заменить вызов $.ajax вызовом fetch, так как fetch уже возвращает Promise.Использование fetch вместо ajax jQuery для вызова API GET

Однако этот конкретный вызов является GET, который фактически ожидает полезную нагрузку (содержащую ключ и тип возврата). В частности, я называю это с помощью:

$.ajax({ 
    type: 'GET', 
    contentType: 'application/json; charset=utf-8', 
    url: config.serviceUrl, 
    data: { 
     apiKey: key, 
     format: 'json' 
    } 
}) 
.done(data => {...}) 
.fail((jqXHR, textStatus, errorThrown) => {...}); 

Однако fetch не имеет data свойство, и выдает сообщение об ошибке, если вы пытаетесь отправить body с GET запроса (TypeError: Failed to execute 'fetch': Request with GET/HEAD method cannot have body). И согласно Chromium forums, это ожидаемое поведение.

Имейте в виду: у меня нет абсолютно никакого контроля над внешним API, поэтому упоминание о том, что отправка полезной нагрузки с GET нарушает какой-либо протокол API или предлагает изменить основной вызов, не помогает.

В этом случае можно использовать fetch? Как?

+0

Вы можете использовать 'body' свойство fetch запрос на добавление данных, таких как объект FormData. Также обратите внимание, что 'Fetch' является очень экспериментальным на этом этапе и не очень хорошо поддерживается. Я лично буду придерживаться AJAX. Было бы также полезно, если бы вы показали нам фактический запрос «Fetch», который вы написали –

ответ

2

ajax функция JQuery просто добавляет data к URL, как URL параметры для GET запросов:

данные

данные для отправки на сервер. Он преобразуется в строку запроса, если не является уже строкой. Он добавляется к URL-адресу для запросов GET.

Source


Использование выборки, вы можете сделать это вручную, или вы можете использовать подход, аналогичный тому, что:

var url = new URL("http://youapi.com") 
var data = { 
    apiKey: key, 
    format: 'json' 
} 

Object.keys(data).forEach(key => url.searchParams.append(key, data[key])) 
fetch(url) 
+0

Не знал, что все, что он сделал, это конкатенация url Титулы! Отличная находка! Благодаря! –

+0

FYI, этот метод выше ('url.searchParams.append') не будет обрабатывать вложенные объекты или массивы правильно. – NLF

3
var headers = new Headers(); 
    headers.append("Content-Type", "application/json; charset=utf-8"); 
    fetch(config.serviceUrl + "?apiKey=" + key + "&format=json", 
    {headers:headers, method:"GET"} 
    ).then(response => response.json()) 
    .then(json => /* do stuff with `json` */) 
    .catch(err => console.error(err)); 

соответствует текущему $.ajax().

+0

Спасибо! вот что я искал. Хотел бы я отметить как ваши, так и TimoSata в качестве правильных ответов. –

+0

Похоже, мне придется отказаться от этой попытки. Я продолжаю получать «Неожиданный токен j в JSON в позиции 0» в операции 'response.json()'. Поскольку '$ .ajax' возвращает отлично сформированный json, я просто сниму выборку. :( –

+0

@TravelingTechGuy Каков ответ? Можете ли вы воспроизвести синтаксическую ошибку в jsfiddle http://jsfiddle.net или plnkr http://plnkr.co? Пробовали ли вы использовать 'response => response.text()' then ' .then (text => {json = JSON.parse (текст)} 'внутри цепочка' .then() '? – guest271314