Запись данных, полученных из API с использованием JavaScript, на хост-сервер

#javascript #php #xmlhttprequest #form-data

#javascript #php #xmlhttprequest #форма-данные

Вопрос:

Редактировать: Обновление — решение

Итак, я добился того, что мне нужно было сделать: записать данные в файл на сервере. Я не совсем уверен, как все работает, но кажется, что:

 xhttp.send(data);
  

отправляет не все данные в переменной FormData, а только данные с «ключом» «data». (Извините, если я неправильно использую терминологию.) Итак, что я сделал, я взял свой объект «userData» и применил следующее:

 userStringData = JSON.stringify(userData);
  

Затем я помещаю userStringData в переменную FormData следующим образом:

 var data = new FormData();
data.append("data" , userStringData);
  

Затем это успешно записывается в файл на сервере. В файле у меня были только userStringData, а не «ключевые» «данные».

В моем PHP-файле я также включал новую строку после каждой записи, чтобы данные каждой пользовательской строки были в новой строке:

 if(!empty($_POST['data'])){
    $data = $_POST['data'];
    $fname = "users.txt";
    $file = fopen("./AJG_Data/".$fname, 'a');
    fwrite($file, $data);
    fwrite($file, "rn");
    fclose($file);
  

Так что это работает для меня сейчас. Спасибо тем, кто предлагал советы и помощь.

Редактировать: Обновить:

Цель: записать данные на сервер с использованием AJAX и PHP. (Пожалуйста, при необходимости обратитесь к исходному вопросу ниже)

Благодаря комментариям Адисона я добился большого прогресса. Я узнал, что XMHHttprequest — это способ сделать AJAX-запрос на сервер. У меня есть этот код:

     var xhttp = new XMLHttpRequest();
    xhttp.onreadystatechange = function() {
        if (this.readyState == 4 amp;amp; this.status == 200) {
            let successString = `Thank you ${userData.athlete.firstname} you have successfully granted permission to read your data.`
            document.querySelector("#message-0").innerHTML = successString;
        }
    };
    xhttp.open("POST","/path_to_my_php_file/file_write.php", true);
    xhttp.send(data);
}
  

На стороне сервера у меня есть это в моем php-файле:

 <?php

$dir = 'AJG_Data';

// create new directory with 744 permissions if it does not exist yet
// owner will be the user/group the PHP script is run under
if ( !file_exists($dir) ) {
     mkdir ($dir, 0744);
}

file_put_contents ($dir.'/test1.txt', 'Hello File');


if(!empty($_POST['data'])){
    $data = $_POST['data'];
    $fname = "users.txt";
    $file = fopen("./AJG_Data/".$fname, 'w');
    fwrite($file, $data);
    fclose($file);
}
?>
  

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

Вышеуказанное работает отлично, если я отправляю простые FormData, созданные следующим образом:

 var data = new FormData();
data.append("data" , "the_text_you_want_to_save");
  

Проблема, с которой я сталкиваюсь, заключается в том, что когда я пытаюсь отправить более сложные FormData. Это не работает. Он не распознает мои FormData и не проходит мимо этого оператора if:

 if(!empty($_POST['data']))
  

Я проверил свои FormData, используя этот код:

 for (var pair of data.entries()) {
    console.log(pair[0]  ', '   pair[1]); 
}
  

Приведенный выше код возвращает следующее:

 token_type, Bearer
expires_at, 12345678910
expires_in, 1234
refresh_token, 1234567890abcefg...
access_token, 1234567890abcdefg...
athlete[id], 1234567
athlete[username], joe_soap
athelete[resouce_state], 2
athlete[firstname], Joe
...
...
athelete[created_at], 2017,01-03T16:07:37Z
...
...
athlete[profile], https://some.web.address/larg.jpg
  

Итак, насколько я могу судить, у меня хорошие FormData, но на стороне сервера ничего не записывается.

Как я могу это исправить?

Спасибо.

Исходный вопрос следует ниже.

Я успешно извлек данные из API Strava, используя код JavaScript. У меня есть данные, хранящиеся в переменной как объект JavaScript. Я хочу записать данные в файл на сервере.

Я потратил часы на поиск в Интернете и не могу найти решение. Кажется, это может быть возможно с помощью ajax или jQuery, но я не могу найти простого пошагового объяснения того, как это сделать.

Итог: мне нужен простой способ записи данных в файл на сервере с использованием JavaScript или чего-то, связанного с JavaScript, который был бы быстрым и простым в реализации. Предполагая, что я могу успешно выполнить запись в файл, я позже захочу прочитать из файла.

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

1. Этот JavaScript запущен в браузере, да? Для хранения данных на сервере вам действительно нужно сделать HTTP-запрос к вашему серверу — использование AJAX было бы разумным выбором (примечание: jquery не является альтернативным выбором, хотя он предоставляет другой синтаксис для использования функций AJAX). Затем на стороне сервера вам нужно запустить некоторый код (например, написанный с использованием PHP, ASP.NET , NodeJS или что-либо еще, что вы выберете и что поддерживается на вашем хосте), который может принимать данные и записывать их в файл. По сути, это базовая архитектура веб-приложения.

2. PS Вы не можете записать файл на сервер с помощью Javascript, потому что Javascript запускается в браузере пользователя сайта на компьютере пользователя. Он не находится на сервере и не имеет к нему прямого доступа. (Он также не имеет доступа к файловой системе на компьютере, на котором он запущен). Вместо этого браузер и сервер взаимодействуют друг с другом с помощью HTTP-запросов.

3. Конечно, другой альтернативой этому является написание некоторого серверного кода, который напрямую отправляет запрос в Strava, извлекает данные, которые затем уже находятся на сервере, и сохраняет их на диске. Затем у вас может быть простая веб-страница, которая позволяет запускать эту операцию (опять же, используя HTTP-запрос из вашего браузера)

4. Спасибо за комментарий, АДисон. Знаете ли вы, где, например, я мог бы найти некоторую информацию о настройке этого, скажем, с помощью PHP на стороне сервера и AJAX в JavaScript. JavaScript запускается в браузере. Спасибо.

5. Я бы попробовал Google. Вы можете найти буквально десятки руководств по AJAX / PHP, предыдущие вопросы SO и т. Д. Просто введите «учебник по php ajax» или аналогичный.

Ответ №1:

Вам понадобится другой файл на серверной части, который фактически выполнит запись. Я предполагаю, что PHP. Я бы рекомендовал кодировать данные в base64 и сохранять их в зашифрованном виде для экономии времени.

Javascript:

 if (window.XMLHTTPRequest) {
    var xhttp = new XMLHTTPRequest();
} else {
    var xhttp = new ActiveXObject("Microsoft.XMLHTTP");
}
xhttp.onreadystatechange = function() {
    if (this.readyState == 4 amp;amp; this.status == 200) {
        //Process output, get result text with this.responseText, decode base64, and parse JSON
        alert(JSON.parse(window.atob(this.responseText)));
    }
}
xhttp.open("POST", "file-load.php?key="   window.btoa(JSON.stringify(value)), true);
xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
xhttp.send();
  

PHP:

 <?php
$key = $_POST['key'];
file_put_contents("storage.txt", $key); //Set file contents
  

Или, если вы хотите добавить его:

 <?php
$key = $_POST['key'];
$current = file_get_contents("storage.txt");
file_put_contents("storage.txt", $current . "n" . $key);
  

Чтобы прочитать файл, просто используйте ту же настройку, что и раньше для javascript, но вместо file-load.php , используйте file-read.php :

 echo file_get_contents("storage.txt");
  

Используйте onreadystatechange для чтения выходных данных.

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

1. Спасибо Redwolf Programs. Я обновлял свой вопрос с учетом прогресса, достигнутого на сегодняшний день, пока вы отвечали. Я использовал очень похожий подход к вашему предложению. Кажется, вы передаете данные для записи в переменную с именем «key». Данные, которые я хочу передать, представляют собой относительно большой «вложенный» объект. Смогу ли я передать столько данных с помощью key? Я попробовал FormData и столкнулся с проблемами, описанными в моем отредактированном вопросе. Спасибо.

2. @AdrianJG Звучит так, как будто post было бы лучше. Может быть хорошей идеей преобразовать данные в JSON перед сохранением.

3. Спасибо Redwolf Programs. Согласно информации здесь: developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/send с помощью XMLHttpRequest.send можно использовать только следующее: — Blob, BufferSource, FormData, URLSearchParams, ReadableStream или USVString. Я искал вокруг, и кажется, что FormData — это то, что использует большинство людей. Кажется, я не могу использовать JSON. Я полагаю, что я начинаю с JSON перед преобразованием в FormData.

4. @AdrianJG О, забыл об этом. Да, я привык получать запросы.