Реализовать корректное получение данных с формы
This commit is contained in:
parent
2e12ff31a5
commit
36b379e8ed
@ -11349,7 +11349,7 @@ Material:
|
||||
- _ClipRect: {r: -32767, g: -32767, b: 32767, a: 32767}
|
||||
- _EnvMatrixRotation: {r: 0, g: 0, b: 0, a: 0}
|
||||
- _FaceColor: {r: 1, g: 1, b: 1, a: 1}
|
||||
- _GlowColor: {r: 0, g: 1, b: 0.991272, a: 1}
|
||||
- _GlowColor: {r: 0, g: 0.12699413, b: 1, a: 1}
|
||||
- _MaskCoord: {r: 0, g: 0, b: 32767, a: 32767}
|
||||
- _OutlineColor: {r: 0.554717, g: 0.554717, b: 0.554717, a: 1}
|
||||
- _ReflectFaceColor: {r: 0, g: 0, b: 0, a: 1}
|
||||
|
||||
@ -1,11 +1,21 @@
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using System.Globalization;
|
||||
using System.Security.Cryptography;
|
||||
using System.Text;
|
||||
using UnityEngine;
|
||||
|
||||
public class SettingsToHtml : MonoBehaviour
|
||||
{
|
||||
|
||||
const string FORM_GROUP_STYLE = "style=\"border: 2px solid black;border-radius: 5px;\"";
|
||||
|
||||
|
||||
public static string GetSettingsPage(List<Setting> settings)
|
||||
{
|
||||
return Decorate(GetSettingsString(settings));
|
||||
}
|
||||
|
||||
public static string GetSettingsString(List<Setting> settings)
|
||||
{
|
||||
StringBuilder sb = new StringBuilder();
|
||||
@ -15,21 +25,25 @@ public class SettingsToHtml : MonoBehaviour
|
||||
sb.AppendLine("<form action=\"/upd\" method=\"POST\">");
|
||||
foreach (Setting setting in settings)
|
||||
{
|
||||
string view = string.Empty;
|
||||
|
||||
if(setting.Type== SettingType.Bool)
|
||||
{
|
||||
string boolView = GetBoolView(setting);
|
||||
sb.AppendLine(boolView);
|
||||
view = GetBoolView(setting);
|
||||
}
|
||||
else if(setting.Type == SettingType.Float)
|
||||
{
|
||||
string view = GetFloatView(setting);
|
||||
sb.AppendLine(view);
|
||||
view = GetFloatView(setting);
|
||||
}
|
||||
else if(setting.Type == SettingType.String)
|
||||
{
|
||||
view = GetStringView(setting);
|
||||
}
|
||||
else
|
||||
{
|
||||
sb.AppendLine($"<p>{setting.Alias}: {GetStringSettingValue(setting)}</p>");
|
||||
view = $"<p>{setting.Alias}: {setting.IntValue.ToString()}</p>";
|
||||
}
|
||||
sb.AppendLine(view);
|
||||
}
|
||||
sb.AppendLine("<input type=\"submit\">");
|
||||
sb.AppendLine("</form>");
|
||||
@ -38,39 +52,18 @@ public class SettingsToHtml : MonoBehaviour
|
||||
}
|
||||
|
||||
|
||||
private static string GetStringSettingValue(Setting setting)
|
||||
{
|
||||
if (setting.Type == SettingType.Bool)
|
||||
{
|
||||
return setting.BoolValue ? "true" : "false";
|
||||
}
|
||||
else if (setting.Type == SettingType.String)
|
||||
{
|
||||
return setting.StringValue;
|
||||
}
|
||||
else if (setting.Type == SettingType.Int)
|
||||
{
|
||||
return setting.IntValue.ToString();
|
||||
}
|
||||
else if (setting.Type == SettingType.Float)
|
||||
{
|
||||
return setting.FloatValue.ToString();
|
||||
}
|
||||
else
|
||||
{
|
||||
return "Непонятый гений...";
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
private static string GetBoolView(Setting setting)
|
||||
{
|
||||
string name = setting.Id;
|
||||
string id = name + "ID";
|
||||
|
||||
|
||||
string res = string.Empty;
|
||||
res += "<div class=\"form-group\" style=\"border: 2px solid black;border-radius: 5px;\">";
|
||||
res += $"<label for=\"{setting.Id}\">{setting.Alias}</label>";
|
||||
res += $"<div class=\"form-group\" {FORM_GROUP_STYLE}>";
|
||||
res += $"<label for=\"{id}\">{setting.Alias}</label>";
|
||||
string ischecked = setting.BoolValue ? "checked" : "";
|
||||
res += $"<input type=\"checkbox\" name=\"Голосовые реплики\" id=\"{setting.Id}\" {ischecked}>";
|
||||
res += $"<input type=\"checkbox\" name=\"{name}\" id=\"{id}\" {ischecked}>";
|
||||
res += "</div>";
|
||||
|
||||
return res;
|
||||
@ -78,15 +71,81 @@ public class SettingsToHtml : MonoBehaviour
|
||||
|
||||
private static string GetFloatView(Setting setting)
|
||||
{
|
||||
string name = setting.Id;
|
||||
string id = name + "ID";
|
||||
string res = string.Empty;
|
||||
res += "<div class=\"form-group\" style=\"border: 2px solid black;border-radius: 5px;\">";
|
||||
res += $"<label for=\"{setting.Id}\">{setting.Alias}</label>";
|
||||
//res += $"<input type=\"range\" name=\"{setting.id}\" id=\"{setting.Id}\" >";
|
||||
res += $"<input id=\"{setting.Id}\" type=\"range\" min=\"{setting.FloatMin.ToString(CultureInfo.InvariantCulture)}\" max=\"{setting.FloatMax.ToString(CultureInfo.InvariantCulture)}\" value=\"{setting.FloatValue.ToString(CultureInfo.InvariantCulture)}\" step=\"{setting.FloatStep.ToString(CultureInfo.InvariantCulture)}\">";
|
||||
|
||||
string min = setting.FloatMin.ToString(CultureInfo.InvariantCulture);
|
||||
string max = setting.FloatMax.ToString(CultureInfo.InvariantCulture);
|
||||
string value = setting.FloatValue.ToString(CultureInfo.InvariantCulture);
|
||||
string step = setting.FloatStep.ToString(CultureInfo.InvariantCulture);
|
||||
|
||||
res += $"<div class=\"form-group\" {FORM_GROUP_STYLE}>";
|
||||
res += $"<label for=\"{id}\">{setting.Alias}</label>";
|
||||
res += $"<input id=\"{id}\" type=\"range\" min=\"{min}\" max=\"{max}\" value=\"{value}\" step=\"{step}\" name=\"{name}\">";
|
||||
res += "</div>";
|
||||
|
||||
return res;
|
||||
|
||||
}
|
||||
|
||||
private static string GetStringView(Setting setting)
|
||||
{
|
||||
string res = string.Empty;
|
||||
|
||||
res += $"<div class=\"form-group\" {FORM_GROUP_STYLE}>";
|
||||
res += $"<p>{setting.Alias}</p>";
|
||||
|
||||
for (int i = 0; i < setting.AllowedValues.Count; i++)
|
||||
{
|
||||
string stringValue = setting.AllowedValues[i];
|
||||
|
||||
string name = setting.Id;
|
||||
string id = name + "ID";
|
||||
|
||||
|
||||
bool isChecked = setting.StringValue == stringValue;
|
||||
string Checked = isChecked ? "checked" : "";
|
||||
|
||||
|
||||
|
||||
res += "<div>";
|
||||
|
||||
res += $"<label for=\"ID\">{stringValue}</label>";
|
||||
res += $"<input type=\"radio\" id=\"{id}\" name=\"{name}\" value=\"{stringValue}\" {Checked}>";
|
||||
|
||||
|
||||
res += "</div>";
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
res += "</div>";
|
||||
|
||||
|
||||
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
private static string GetIntView(Setting setting)
|
||||
{
|
||||
|
||||
return string.Empty;
|
||||
}
|
||||
|
||||
private static string Decorate(string content)
|
||||
{
|
||||
string res = "<!DOCTYPE html>\r\n<html lang=\"ru\">\r\n<head>\r\n <meta charset=\"UTF-8\">\r\n <title>Настройки Фишки</title>\r\n</head>\r\n<body>";
|
||||
|
||||
res += content;
|
||||
|
||||
res += "</body>\r\n</html>";
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
@ -1,15 +0,0 @@
|
||||
public static class TestHTML
|
||||
{
|
||||
|
||||
public const string HTMLTEST =
|
||||
"<html>" +
|
||||
"<body>" +
|
||||
"<h1>Привет.</h1>" +
|
||||
"Это сообщение из юнити.<br>" +
|
||||
"Если вы это читаете то фишка что то отправила<br>" +
|
||||
"Разраб морально устал.<br>" +
|
||||
"Конец связи" +
|
||||
"</body>" +
|
||||
"</html>";
|
||||
|
||||
}
|
||||
@ -1,11 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: ab705deb32565dc4b82350ec6b2e03c0
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@ -1,11 +1,12 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Net;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using UnityEngine;
|
||||
|
||||
// Класс для сериализации в JSON
|
||||
//Зависит от SettingsManager
|
||||
[System.Serializable]
|
||||
public class ServerResponse
|
||||
{
|
||||
@ -20,7 +21,7 @@ public class WebServer : MonoBehaviour
|
||||
|
||||
async void Start()
|
||||
{
|
||||
SettingsManager.Initialize();
|
||||
SettingsManager.Initialize();//надо будет убирать
|
||||
await StartWebServerAsync();
|
||||
}
|
||||
|
||||
@ -90,7 +91,8 @@ public class WebServer : MonoBehaviour
|
||||
|
||||
var stopwatch = System.Diagnostics.Stopwatch.StartNew();
|
||||
var htmlTask = Task.Run(() =>
|
||||
SettingsToHtml.GetSettingsString(SettingsManager.Container.Settings));
|
||||
SettingsToHtml.GetSettingsPage(SettingsManager.Container.Settings));
|
||||
//SettingsToHtml.GetSettingsString(SettingsManager.Container.Settings));
|
||||
|
||||
if (htmlTask.Wait(TimeSpan.FromSeconds(5)))
|
||||
{
|
||||
@ -119,68 +121,262 @@ public class WebServer : MonoBehaviour
|
||||
});
|
||||
}
|
||||
|
||||
/*
|
||||
async Task HandlePostUpdateAsync(HttpListenerContext context)
|
||||
{
|
||||
try
|
||||
{
|
||||
// Читаем тело POST-запроса
|
||||
string requestBody;
|
||||
using (var reader = new StreamReader(context.Request.InputStream, context.Request.ContentEncoding))
|
||||
{
|
||||
requestBody = await reader.ReadToEndAsync();
|
||||
}
|
||||
|
||||
Debug.Log($"Получен POST запрос на /upd");
|
||||
Debug.Log($"Тело запроса: {requestBody}");
|
||||
|
||||
// Здесь вы можете обработать данные формы
|
||||
// Обычно данные формы приходят в формате: key1=value1&key2=value2
|
||||
// Вы можете их разобрать:
|
||||
var formData = System.Web.HttpUtility.ParseQueryString(requestBody);
|
||||
|
||||
// Пример: если у вас есть поле "action" в форме
|
||||
string action = formData["action"];
|
||||
string buttonValue = formData["submit"]; // для input type="submit"
|
||||
|
||||
Debug.Log($"Action: {action}, Button value: {buttonValue}");
|
||||
|
||||
// Пример обработки разных кнопок:
|
||||
// Если у вас несколько кнопок с разными именами/значениями
|
||||
if (!string.IsNullOrEmpty(formData["save"]))
|
||||
{
|
||||
await HandleSaveAction(formData);
|
||||
}
|
||||
else if (!string.IsNullOrEmpty(formData["reset"]))
|
||||
{
|
||||
await HandleResetAction(formData);
|
||||
}
|
||||
|
||||
// Отправляем ответ обратно
|
||||
string responseHtml = @"
|
||||
<html>
|
||||
<head><title>Обновлено</title></head>
|
||||
<body>
|
||||
<h1>Данные успешно получены!</h1>
|
||||
<p>Сервер обработал ваш запрос.</p>
|
||||
<a href='/'>Вернуться назад</a>
|
||||
<script>
|
||||
// Через 3 секунды возвращаемся назад
|
||||
setTimeout(function() {
|
||||
window.location.href = '/';
|
||||
}, 3000);
|
||||
</script>
|
||||
</body>
|
||||
</html>";
|
||||
|
||||
SendHtmlResponse(context, responseHtml);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Debug.LogError($"Error handling POST /upd: {ex.Message}");
|
||||
SendHtmlResponse(context, $"<h1>Error: {ex.Message}</h1>", 500);
|
||||
}
|
||||
}
|
||||
*/
|
||||
|
||||
async Task HandlePostUpdateAsync(HttpListenerContext context)
|
||||
{
|
||||
try
|
||||
{
|
||||
// Определяем кодировку из Content-Type или используем UTF-8 по умолчанию
|
||||
Encoding encoding = Encoding.UTF8;
|
||||
string contentType = context.Request.ContentType?.ToLower() ?? "";
|
||||
|
||||
if (contentType.Contains("charset="))
|
||||
{
|
||||
try
|
||||
{
|
||||
string charset = contentType.Split("charset=")[1].Trim().Split(';')[0];
|
||||
encoding = Encoding.GetEncoding(charset);
|
||||
Debug.Log($"Определена кодировка из Content-Type: {charset}");
|
||||
}
|
||||
catch
|
||||
{
|
||||
encoding = Encoding.UTF8;
|
||||
Debug.Log($"Не удалось определить кодировку из Content-Type, используем UTF-8");
|
||||
}
|
||||
}
|
||||
|
||||
// Читаем тело POST-запроса
|
||||
string requestBody;
|
||||
using (var reader = new StreamReader(context.Request.InputStream, context.Request.ContentEncoding))
|
||||
using (var reader = new StreamReader(context.Request.InputStream, encoding))
|
||||
{
|
||||
requestBody = await reader.ReadToEndAsync();
|
||||
}
|
||||
|
||||
Debug.Log($"Получен POST запрос на /upd");
|
||||
Debug.Log($"Тело запроса: {requestBody}");
|
||||
Debug.Log($"Content-Type: {contentType}");
|
||||
Debug.Log($"Используемая кодировка: {encoding.WebName}");
|
||||
Debug.Log($"Тело запроса (сырое): {requestBody}");
|
||||
|
||||
// Здесь вы можете обработать данные формы
|
||||
// Обычно данные формы приходят в формате: key1=value1&key2=value2
|
||||
// Вы можете их разобрать:
|
||||
var formData = System.Web.HttpUtility.ParseQueryString(requestBody);
|
||||
// Ручное декодирование данных формы
|
||||
Debug.Log("\n=== Декодированные данные формы ===");
|
||||
var decodedValues = new Dictionary<string, string>();
|
||||
|
||||
// Пример: если у вас есть поле "action" в форме
|
||||
string action = formData["action"];
|
||||
string buttonValue = formData["submit"]; // для input type="submit"
|
||||
|
||||
|
||||
Debug.Log($"Action: {action}, Button value: {buttonValue}");
|
||||
|
||||
// Пример обработки разных кнопок:
|
||||
// Если у вас несколько кнопок с разными именами/значениями
|
||||
if (!string.IsNullOrEmpty(formData["save"]))
|
||||
// Также можно использовать ParseQueryString для сравнения
|
||||
try
|
||||
{
|
||||
await HandleSaveAction(formData);
|
||||
var formData = System.Web.HttpUtility.ParseQueryString(requestBody, encoding);
|
||||
Debug.Log("\n=== Данные через ParseQueryString ===");
|
||||
foreach (string key in formData.AllKeys)
|
||||
{
|
||||
if (key != null)
|
||||
{
|
||||
string value = formData[key] ?? "";
|
||||
Debug.Log($" {key} = {value}");
|
||||
|
||||
// Если ParseQueryString не декодировал ключ, делаем это вручную
|
||||
if (key.Contains("%"))
|
||||
{
|
||||
string decodedKey = Uri.UnescapeDataString(key);
|
||||
Debug.Log($" Декодированный ключ: {decodedKey}");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (!string.IsNullOrEmpty(formData["reset"]))
|
||||
catch (Exception parseEx)
|
||||
{
|
||||
await HandleResetAction(formData);
|
||||
Debug.LogWarning($"ParseQueryString ошибка: {parseEx.Message}");
|
||||
}
|
||||
|
||||
// Получаем action из декодированных данных
|
||||
string action = decodedValues.ContainsKey("action") ? decodedValues["action"] :
|
||||
(decodedValues.ContainsKey("action") ? decodedValues["action"] : null);
|
||||
|
||||
Debug.Log($"\nAction: {action}");
|
||||
|
||||
// Обработка разных действий
|
||||
if (!string.IsNullOrEmpty(action))
|
||||
{
|
||||
if (action == "save")
|
||||
{
|
||||
await HandleSaveAction(decodedValues);
|
||||
}
|
||||
else if (action == "reset")
|
||||
{
|
||||
await HandleResetAction(decodedValues);
|
||||
}
|
||||
else
|
||||
{
|
||||
Debug.Log($"Неизвестное действие: {action}");
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
Debug.Log("Action не указан, проверяем наличие отдельных кнопок...");
|
||||
|
||||
// Проверяем наличие других кнопок
|
||||
if (decodedValues.ContainsKey("save") && !string.IsNullOrEmpty(decodedValues["save"]))
|
||||
{
|
||||
await HandleSaveAction(decodedValues);
|
||||
}
|
||||
else if (decodedValues.ContainsKey("reset") && !string.IsNullOrEmpty(decodedValues["reset"]))
|
||||
{
|
||||
await HandleResetAction(decodedValues);
|
||||
}
|
||||
}
|
||||
|
||||
// Отправляем ответ обратно
|
||||
string responseHtml = @"
|
||||
<html>
|
||||
<head><title>Обновлено</title></head>
|
||||
<body>
|
||||
<h1>Данные успешно получены!</h1>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset='UTF-8'>
|
||||
<title>Обновлено</title>
|
||||
<style>
|
||||
body { font-family: Arial, sans-serif; padding: 20px; }
|
||||
.success { color: green; font-weight: bold; }
|
||||
.info { margin: 20px 0; padding: 10px; background: #f0f0f0; }
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<h1 class='success'>✓ Данные успешно получены!</h1>
|
||||
<div class='info'>
|
||||
<p>Сервер обработал ваш запрос.</p>
|
||||
<a href='/'>Вернуться назад</a>
|
||||
<script>
|
||||
// Через 3 секунды возвращаемся назад
|
||||
setTimeout(function() {
|
||||
window.location.href = '/';
|
||||
}, 3000);
|
||||
</script>
|
||||
</body>
|
||||
</html>";
|
||||
<p>Полученные данные:</p>
|
||||
<ul>";
|
||||
|
||||
// Добавляем список полученных данных в ответ
|
||||
foreach (var kvp in decodedValues)
|
||||
{
|
||||
responseHtml += $"<li><strong>{kvp.Key}</strong>: {kvp.Value}</li>";
|
||||
}
|
||||
|
||||
responseHtml += @"
|
||||
</ul>
|
||||
</div>
|
||||
<a href='/' style='display: inline-block; margin-top: 20px; padding: 10px 20px; background: #007bff; color: white; text-decoration: none; border-radius: 5px;'>
|
||||
Вернуться к настройкам
|
||||
</a>
|
||||
<script>
|
||||
// Через 5 секунд возвращаемся назад
|
||||
setTimeout(function() {
|
||||
window.location.href = '/';
|
||||
}, 5000);
|
||||
</script>
|
||||
</body>
|
||||
</html>";
|
||||
|
||||
SendHtmlResponse(context, responseHtml);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Debug.LogError($"Error handling POST /upd: {ex.Message}");
|
||||
SendHtmlResponse(context, $"<h1>Error: {ex.Message}</h1>", 500);
|
||||
Debug.LogError($"Ошибка обработки POST /upd: {ex.Message}");
|
||||
Debug.LogError($"StackTrace: {ex.StackTrace}");
|
||||
SendHtmlResponse(context,
|
||||
$"<html><head><meta charset='UTF-8'><title>Ошибка</title></head><body>" +
|
||||
$"<h1 style='color:red;'>Ошибка: {ex.Message}</h1>" +
|
||||
$"<pre>{ex.StackTrace}</pre>" +
|
||||
$"<a href='/'>Вернуться назад</a></body></html>",
|
||||
500);
|
||||
}
|
||||
}
|
||||
|
||||
// Обновленный HandleSaveAction для работы с Dictionary
|
||||
async Task HandleSaveAction(Dictionary<string, string> formData)
|
||||
{
|
||||
Debug.Log("\n=== Обработка сохранения настроек ===");
|
||||
|
||||
foreach (var kvp in formData)
|
||||
{
|
||||
string key = kvp.Key;
|
||||
string value = kvp.Value;
|
||||
|
||||
Debug.Log($"Поле формы: '{key}' = '{value}'");
|
||||
|
||||
// Пропускаем служебные поля
|
||||
if (key == "action" || key == "_charset_" || key == "submit")
|
||||
continue;
|
||||
|
||||
// TODO: Здесь логика обновления SettingsManager
|
||||
// Например:
|
||||
// var setting = SettingsManager.Container.Settings.FirstOrDefault(s => s.Id == key);
|
||||
// if (setting != null) { ... }
|
||||
}
|
||||
|
||||
Debug.Log("Сохранение настроек завершено");
|
||||
await Task.CompletedTask;
|
||||
}
|
||||
|
||||
async Task HandleResetAction(Dictionary<string, string> formData)
|
||||
{
|
||||
Debug.Log("\n=== Обработка сброса настроек ===");
|
||||
// TODO: Реализовать сброс настроек
|
||||
await Task.CompletedTask;
|
||||
}
|
||||
|
||||
async Task HandleSaveAction(System.Collections.Specialized.NameValueCollection formData)
|
||||
{
|
||||
// Здесь обрабатываем сохранение настроек
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user