Добавить флаг в UnityWebRequest - PullRequest
0 голосов
/ 24 февраля 2020

Я пытаюсь сделать POST-запрос к веб-странице, которая ожидает, что поле --data будет заполнено некоторыми данными для обработки. Я в значительной степени пытаюсь воссоздать этот curl запрос, но с UnityWebRequest.

curl -X POST http://localhost:8000/clic/say?text=Make+the+gene+set  --data '{"geneSetMembers":["UST"],"geneSetName":"selection0"}'

В документации UnityWebRequest упоминается, что запросы GET не устанавливают никаких флагов, кроме URL, но это не так. снимите флажок, если для сообщений не существует других пользовательских параметров. Есть ли какой-нибудь способ отформатировать WWWform или что-то, что будет хранить данные так, чтобы сервер распознал их?

var form = new WWWForm();
// some way to plug in the jsonified data to the form
webRequest = UnityWebRequest.Post(url + route + to_say, form);
webRequest.downloadHandler = new DownloadHandlerBuffer();
webRequest.SetRequestHeader("Content-Type", "application/json");
webRequest.SendWebRequest();
// etc etc

Я пытался просто дать форме поле с именем "данные" а-ля

form.AddField("data", "{ \"geneSetMembers\":[\"UST\"],\"geneSetName\":\"selection0\"}");

но серверу это не нравится, он говорит, что "получил ошибку Invalid JSON буквальное имя: данные" Так что это явно неверный синтаксис для него

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

1 Ответ

0 голосов
/ 24 февраля 2020

Возможно, вашему серверу не нравится получать данные в виде поля с именем data.

Этот курс полностью зависит от кода PHP, который мы не видим, так как вы не поделились этим часть. b

Но, по крайней мере, я могу вам сказать, что --data или просто -d в curl относится ко всему разделу данных и не является полем с именем data.


Вместо этого можно попробовать использовать MultiPartFormDataSection, передавая только сами данные без указания c имени поля

var data = "{\"geneSetMembers\":[\"UST\"],\"geneSetName\":\"selection0\"}";
var form = new List<IMultiFormPart>{ new MultiPartFormDataSection(data) };
webRequest = UnityWebRequest.Post(url + route + to_say, form);
yield return webRequest.SendWebRequest();

, которое теперь отправляется как тип содержимого multipart/form-data хотя ...


Другой вариант, если вашему серверу действительно нужно получить тип контента application/json, может заключаться в том, чтобы "вручную" составлять запрос, например, как

var data = "{\"geneSetMembers\":[\"UST\"],\"geneSetName\":\"selection0\"}";
var request = new UnityWebRequest(url + route + to_say, "POST");
var bodyRaw = Encoding.UTF8.GetBytes(data);
request.uploadHandler = (UploadHandler) new UploadHandlerRaw(bodyRaw);
request.downloadHandler = (DownloadHandler) new DownloadHandlerBuffer();
request.SetRequestHeader("Content-Type", "application/json");
yield return request.SendWebRequest();

Хотя сейчас вы смотрите внимательно, похоже, на самом деле это не так, поскольку если вы читаете man curl

(HTTP) Отправляет указанные данные в POST-запрос к HTTP-серверу так же, как браузер, когда пользователь заполнил форму HTML и нажал кнопку отправки. Это заставит curl передавать данные на сервер, используя тип контента application / x- www-form-urlencoded

, который фактически является типом контента по умолчанию, используемым простым string версия UnityWebRequest.Post.

Так что подумать об этом на самом деле должно быть так же просто, как использовать чистую string версию UnityWebRequest.Post:

var data = "{\"geneSetMembers\":[\"UST\"],\"geneSetName\":\"selection0\"}";
var request = UnityWebRequest.Post(url + route + to_say, data);
yield return request.SendWebRequest();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...