C# Unity-如何在HttpWebRequest中使用参数字典而不是字符串
我对C#没有太多经验,无论如何,我使用以下函数将数据发布到我自己的API中:C# Unity-如何在HttpWebRequest中使用参数字典而不是字符串,c#,php,dictionary,unity3d,C#,Php,Dictionary,Unity3d,我对C#没有太多经验,无论如何,我使用以下函数将数据发布到我自己的API中: public static JSONNode SaveObject(List<String> parameters){ var request = (HttpWebRequest)WebRequest.Create("http://example.com/query.php?"); var data = Encoding.ASCII.GetBytes(String.Join(&q
public static JSONNode SaveObject(List<String> parameters){
var request = (HttpWebRequest)WebRequest.Create("http://example.com/query.php?");
var data = Encoding.ASCII.GetBytes(String.Join("",parameters));
request.Method = "POST";
request.ContentType = "application/x-www-form-urlencoded";
request.ContentLength = data.Length;
using (var stream = request.GetRequestStream()){ stream.Write(data, 0, data.Length); }
var response = (HttpWebResponse)request.GetResponse();
var responseString = new StreamReader(response.GetResponseStream()).ReadToEnd();
// Debug.Log("RESPONSE: " + responseString);
// JSONNode object
var obj = JSON.Parse(responseString);
return obj;
}
publicstaticjsonnode SaveObject(列出参数){
var request=(HttpWebRequest)WebRequest.Create(“http://example.com/query.php?");
var data=Encoding.ASCII.GetBytes(String.Join(“,参数));
request.Method=“POST”;
request.ContentType=“application/x-www-form-urlencoded”;
request.ContentLength=data.Length;
使用(var stream=request.GetRequestStream()){stream.Write(data,0,data.Length);}
var response=(HttpWebResponse)request.GetResponse();
var responseString=newstreamreader(response.GetResponseStream()).ReadToEnd();
//Log(“响应:+responseString”);
//JSONNode对象
var obj=JSON.Parse(responseString);
返回obj;
}
我这样称呼它:
List<String> parameters = new List<String>();
parameters.Add("tableName=Posts"));
parameters.Add("&text=Text & more"));
parameters.Add("&number=123"));
// Save
var result = SaveObject(parameters);
Debug.Log("OBJECT SAVED: " + result.ToString());
List参数=新列表();
添加(“tableName=Posts”);
添加(“&text=text&more”);
参数。添加(“&number=123”);
//拯救
var结果=保存对象(参数);
Log(“保存的对象:+result.ToString());
我对我的SaveObject()
函数很满意,直到我发现JSON文件中的Text&more
字符串被截断为Text
,并被转换为“Text”键(我的API只是编辑JSON文件)
我知道为什么会发生这种情况,因为String.Join(“,parameters)生成一个URL字符串,看起来像“tableName=Posts&text=text&more&number=123”
,因此文本
和更多
之间的&字符无效,因为我的PHP代码认为它与其他&字符一样是一个分隔符
因此,我不知道如何将我的SaveObject()
函数转换为使用参数字典而不是字符串。如果我使用类似于
字典的东西,我想我会解决我的字符问题,很好,我正在为调用我的API的iOS代码使用字典,你应该使用第四个重载
public static Networking.UnityWebRequest Post(string uri, Dictionary<string,string> formFields);
所以您可以像这样调用它(假设此代码位于monobhavior
脚本中)
然后,在处理参数之前,PHP接收器端的一个参数将以相反的方式替换(当然更容易出错)
$search=array(“\u SPACE”、“\u和””);
$replace=数组(“,”和“);
$escapedValue=$\u POST[“参数”];
$value=str_replace($search,$replace,$escapedValue);
注意:在智能手机上输入,但我希望想法变得清晰看看这个例子,它展示了如何收集HTTP表单值以及如何将它们格式化为“x-www-form-urlencoded”查询:好的,但我不能让它工作,有太多错误,甚至“www”不存在,我想我们一定是“uwr”,对吗?此外,我还得到了:'非静态字段、方法或属性'MyClass.SendSaveRequest(Dictionary,Action)'@FrankEno yup需要对象引用,修复了这些问题。对不起,我在智能手机上写了这个所以是的^^
public static void SaveObject(MonoBehaviour behaviour, Dictionary<string, string> parameters, Action<JSONNode> resultHandler)
{
behaviour.StartCoroutine(SendSaveRequest(parameters, resultHandler));
}
private static IEnumerator SendSaveRequest(Dictionary<string, string> parameters, Action<JSONNode> resultHandler)
{
using(var uwr = UnityWebRequest.Post("http://example.com/query.php?", parameters)
{
yield return uwr.SendWebRequest();
if (uwr.isNetworkError || www.isHttpError)
{
Debug.Log(www.error);
}
else
{
Debug.Log("Form upload complete!");
var responseString = uwr.downloadHandler.text;
// Debug.Log("RESPONSE: " + responseString);
// JSONNode object
var obj = JSON.Parse(responseString);
resultHandler?.Invoke(obj);
}
}
}
var parameters = new Dictioary<string,string>
{
{"tableName","Posts"},
{"text","Text & more"},
{"number","123"}
};
// Save
var result = SaveObject(this, parameters, OnSaveDone);
...
private void OnSaveDone(JSONNode result)
{
Debug.Log("OBJECT SAVED: " + result.ToString());
}
var data = Encoding.ASCII.GetBytes(String.Join("",parameters));
data = data.Replace(" ", "_SPACE_").Replace("&", "_AND_");