Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/264.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Unity-如何在HttpWebRequest中使用参数字典而不是字符串_C#_Php_Dictionary_Unity3d - Fatal编程技术网

C# Unity-如何在HttpWebRequest中使用参数字典而不是字符串

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

我对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("",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_");