Можно ли отправлять HTTP-запросы с помощью WebAssembly? - PullRequest
0 голосов
/ 30 августа 2018

Я пытаюсь отправить простой HTTP-запрос GET в WebAssembly. Для этого я написал эту программу (скопирован с сайта Emscripten с небольшими изменениями):

#include <stdio.h>
#include <string.h>
#ifdef __EMSCRIPTEN__
#include <emscripten/fetch.h>
#include <emscripten.h>
#endif


void downloadSucceeded(emscripten_fetch_t *fetch) {
  printf("Finished downloading %llu bytes from URL %s.\n", fetch->numBytes, fetch->url);
  // The data is now available at fetch->data[0] through fetch->data[fetch->numBytes-1];
  emscripten_fetch_close(fetch); // Free data associated with the fetch.
}

void downloadFailed(emscripten_fetch_t *fetch) {
  printf("Downloading %s failed, HTTP failure status code: %d.\n", fetch->url, fetch->status);
  emscripten_fetch_close(fetch); // Also free data on failure.
}

unsigned int EMSCRIPTEN_KEEPALIVE GetRequest() {
  emscripten_fetch_attr_t attr;
  emscripten_fetch_attr_init(&attr);
  strcpy(attr.requestMethod, "GET");
  attr.attributes = EMSCRIPTEN_FETCH_LOAD_TO_MEMORY;
  attr.onsuccess = downloadSucceeded;
  attr.onerror = downloadFailed;
  emscripten_fetch(&attr, "http://google.com");
  return 1;
}

Когда я компилирую его, используя $EMSCRIPTEN/emcc main.c -O1 -s MODULARIZE=1 -s WASM=1 -o main.js --emrun -s FETCH=1, я получаю ошибку

ERROR:root:FETCH not yet compatible with wasm (shared.make_fetch_worker is asm.js-specific)

Есть ли способ запустить HTTP-запросы от WebAssembly? Если да, как я могу это сделать?

Обновление 1: Следующий код пытается отправить запрос GET, но не удается из-за проблем с CORS.

#include <stdio.h>
#include <string.h>
#ifdef __EMSCRIPTEN__
#include <emscripten/fetch.h>
#include <emscripten.h>
#endif

unsigned int EMSCRIPTEN_KEEPALIVE GetRequest() {
  EM_ASM({
    var xhr = new XMLHttpRequest();
    xhr.open("GET", "http://google.com");
    xhr.send();
  });
  return 1;
}

Ответы [ 3 ]

0 голосов
/ 31 августа 2018

Я недавно столкнулся с этой проблемой, когда esmcripten исправил ее в: https://github.com/kripken/emscripten/pull/7010

Теперь вы сможете использовать FETCH = 1 и WASM = 1 вместе.

0 голосов
/ 08 сентября 2018

К сожалению, сделать запрос CORS на Google.com невозможно с любого веб-сайта , кроме Google.com.

От MDN:

По соображениям безопасности браузеры ограничивают перекрестные HTTP-запросы, инициируемые из скриптов. Например, XMLHttpRequest и Fetch API следуют политике одного источника. Это означает, что веб-приложение, использующее эти API-интерфейсы, может запрашивать только ресурсы HTTP из того же источника, из которого было загружено приложение, если только ответ другого источника не содержит правильных заголовков CORS.

Google не включает эти заголовки.

Поскольку JavaScript / WebAssembly работает на компьютере клиента (не на вашем), вы можете делать неприятные вещи, если этого не было, например, отправлять POST-запросы на www.mybankingwebsite.com/makeTransaction с помощью файлов cookie клиента.

Если вы хотите направить код, который вы имеете в Обновлении 1, на свой собственный сайт или запустить его на Node.js, он должен работать нормально.

0 голосов
/ 30 августа 2018

Нет, вы не можете выполнить HTTP-запрос от WebAssembly (или получить доступ к DOM или любым другим API-интерфейсам браузера). Сам по себе WebAssembly не имеет никакого доступа к своей хост-среде, поэтому у него нет встроенных возможностей ввода-вывода.

Однако вы можете экспортировать функции из WebAssembly и импортировать функции из среды хоста. Это позволит вам делать HTTP-запросы косвенно через хост.

...