将标志添加到UnityWebRequest



我正在尝试向网页发出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之外的任何标志,但尚不清楚是否没有其他针对帖子的自定义选项。是否有某种方法可以格式化WWW表单或保存数据的东西,以便服务器能够识别它?

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

我试着给表单一个名为"data"的字段一个la

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

但服务器不喜欢它,说它"出错了无效的JSON字面名称:data"很明显,这是的错误语法

EDIT:将行按与原始代码中相同的顺序排列。对不起,我已经评论了他们之间的行

也许您的服务器不喜欢将数据作为一个名为data的字段来接收。

当然,这完全取决于我们没有看到的PHP代码,因为您并没有分享那个部分。b

但至少我可以告诉你,--datacurl中的-d指的是整个数据部分,而不是一个名为data的字段。


您可以尝试使用MultiPartFormDataSection只传递数据本身,而不使用特定的字段名

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();

其现在作为内容类型CCD_ 10发送。。。


如果您的服务器确实需要接收内容类型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();

虽然你现在看起来很接近,但事实似乎并非如此,因为如果你阅读了人curl

(HTTP(将POST请求中的指定数据发送到HTTP服务器,方法与用户填写HTML表单并按下提交按钮时浏览器所做的相同。这将导致curl使用应用程序/x-www-form-urlencoded的内容类型将数据传递到服务器

这实际上正是UnityWebRequest.Post的简单string版本所使用的默认内容类型。

因此,考虑一下它实际上应该像使用UnityWebRequest.Post的纯string版本一样简单:

var data = "{"geneSetMembers":["UST"],"geneSetName":"selection0"}";
var request = UnityWebRequest.Post(url + route + to_say, data);
yield return request.SendWebRequest();

最新更新