我无法找出将POST参数编码为服务器调用的最佳方法。我编写了一个由PHP服务器提供服务的C#客户端。我想在参数中允许很大的灵活性,所以我目前的计划是使用一个参数,我使用JSON进行编码。例如:
params = {"object":"Main","function":"doecho","params":["echothis...."]}
我正在使用C#WebRequest对象和contentType“application / x-www-form-urlencoded; charset = UTF-8”。数据到达服务器,一切都按预期工作,直到我在数据中添加非法的JSON字符。
例如,如果我使用以下数据,那么我就不能在服务器端对它执行json_decode。当我用$ this-> getRequest() - > getParams();(Zend_Framework)读取时,服务器似乎会自动将%40变为双引号(“)。
params = {"object":"Main","function":"doecho","params":["echothis%25%5d%22%40%3d%26...."]}
这里的最佳做法是什么?我需要base64编码数据吗?是否有一些明显的内容类型或php设置缺少?
我完全控制客户端和服务器,所以我想知道什么是正确/最好的事情。
答案 0 :(得分:12)
虽然可以使用任何内容类型上传到HTTP,但实际使用了三种:
由于2和3是如此常用(因为所有浏览器都支持提交表单),几乎所有服务器端技术都有处理它们的东西。因此,除非PHP部分做了一些奇怪的事情,否则你应该能够使用它们。
application / x-www-form-urlencoded不适合某些数据,但对于它的用途最简单。它与为GET表单请求创建查询字符串的方式基本相同,但与POST内容相同。
因此,您希望自己的内容为:
"params=" + Uri.EscapeDataString(paramData)
因此,第一个成为:
params=%7B%22object%22%3A%22Main%22%2C%22function%22%3A%22doecho%22%2C%22params%22%3A%5B%22echothis....%22%5D%7D
第二个:
params=%7B%22object%22%3A%22Ccmes_Main%22%2C%22function%22%3A%22doecho%22%2C%22params%22%3A%5B%22echothis%2525%255d%2522%2540%253d%2526....%22%5D%7D
PHP的内置插件将转回到您问题中的表单。
答案 1 :(得分:1)
我的第一个想法是将其编码为base64。我认为这应该是简化方式。
static public string EncodeTo64(string toEncode)
{
byte[] toEncodeAsBytes = System.Text.ASCIIEncoding.ASCII.GetBytes(toEncode);
string returnValue = System.Convert.ToBase64String(toEncodeAsBytes);
return returnValue;
}