如何编码HTTP POST参数(C#客户端到PHP服务器)?

时间:2011-10-26 20:33:46

标签: c# php json httpwebrequest

我无法找出将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设置缺少?

我完全控制客户端和服务器,所以我想知道什么是正确/最好的事情。

2 个答案:

答案 0 :(得分:12)

虽然可以使用任何内容类型上传到HTTP,但实际使用了三种:

  1. 由给定服务的文档专门设置的一个。
  2. application / x-www-form-urlencoded - HTML表单使用的默认值。
  3. multipart / form-data - HTML表单使用的另一种表单,包含表单上传时需要。
  4. 由于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。我认为这应该是简化方式。

来自arcanecode.com

static public string EncodeTo64(string toEncode)
{
  byte[] toEncodeAsBytes = System.Text.ASCIIEncoding.ASCII.GetBytes(toEncode);
  string returnValue = System.Convert.ToBase64String(toEncodeAsBytes);
  return returnValue;
}