UnityWebRequest.Put не отправляет строку JSONC#

Место общения программистов C#
Ответить
Anonymous
 UnityWebRequest.Put не отправляет строку JSON

Сообщение Anonymous »

Я хочу отправить запрос PUT или POST к API, который я развернул в Vercel и созданному с помощью NEXT JS. Он делает и другие вещи, помимо API, но это не важно...
Итак, у меня есть проект Unity, в котором я хотел бы регистрировать время, когда мой игрок завершил уровень, на котором он находится.
Изначально я хотел использовать Firebase, но обнаружил, что не могу, поскольку сборки Windows Unity не поддерживают его, поэтому в итоге я просто создал API, который отправляет данные в MongoDB и снова делает некоторые другие вещи. не важно.
Итак, приступаем к сути проблемы:
У меня есть IEnumerator для отправки запроса:

Код: Выделить всё

IEnumerator logPlayerTime()
{
string url = "http://some-vercel-cloud-function/api/new";
var requestBody = new PlayerRequestBody();
requestBody.firstName = "John";
requestBody.lastName = "Doe";
requestBody.email = "email@email.com";
requestBody.marketing = false;
requestBody.time = 200000;  // this actually come from somewhere else but for now this is fine

string json = JsonUtility.ToJson(requestBody);

UnityWebRequest request = UnityWebRequest.Put(url, json);
request.SetRequestHeader("Content-Type", "application/json");
request.SetRequestHeader("Accept", "*/*");
request.SetRequestHeader("Accept-Encoding", "gzip, deflate, br");
request.SetRequestHeader("Connection", "keep-alive");
request.useHttpContinue = false;
yield return request.SendWebRequest();

if (request.result != UnityWebRequest.Result.Success)
{
Debug.Log(request.error);
}
else
{
Debug.Log("Time Logged! " + json);
}
}
Согласно документации, у меня должно быть два аргумента: первый — мой URL-адрес, а второй — мои данные.
Что касается JSON, который мне нужен для отправки я сделал эту структуру

Код: Выделить всё

[Serializable]
private struct PlayerRequestBody
{
public string firstName;
public string lastName;
public string email;
public bool marketing;
public float time;
}
Затем я использую JsonUtiltiy.ToJson, чтобы превратить переменную json в строку JSON, и это работает.
Все это говорит о том, что независимо от того, что я меняю в запросе, даже ввод строки JSON вручную экранируется. Он просто отправляет тело запроса пустого объекта JSON следующим образом: Итак, если мы посмотрим, что получает API, журналы будут выглядеть следующим образом:

Код: Выделить всё

[PUT] /api/new    01:44:25:13    {}
Я уверен, что это что-то незначительное, но у меня просто недостаточно опыта работы с Unity или C#, чтобы найти проблему (и я хочу пойти спать).Что касается того, как это вызывается, то в одном из моих сценариев, управляющих игрой, у меня есть метод обработчика, который подписан на изменения GameState, поэтому, когда мой GameState === GameState.Victory, я запускаю обработчик. . Итак, код для этого, с удаленными для удобства чтения битами, выглядит следующим образом:

Код: Выделить всё

// ...
private void Awake()
{
GameManager.OnGameStateChanged += GameManager_OnGameStateChanged;
}
// ...
private void GameManager_OnGameStateChanged(GameState state)
{

if (state == GameState.Victory)
{
handleVictory();
}

}
Этот метод handleVictory в данный момент просто запускает StartCoroutine в IEnumerator

Подробнее здесь: https://stackoverflow.com/questions/723 ... son-string
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»