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


How to encode HTTP POST parameters (C# client to PHP Server)?

我在找出将POST参数编码为服务器调用的最佳方法时遇到了麻烦。我正在编写一个c#客户端,它将由PHP服务器提供服务。我希望在参数中有很大的灵活性,所以我目前的计划是使用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()读取时,服务器似乎自动将%40转换为双引号(");(Zend_Framework)。

params = {"object":"Main","function":"doecho","params":["echothis%25%5d%22%40%3d%26...."]}

这里的最佳实践是什么?我需要base64编码数据吗?内容类型或php设置中是否缺少某些明显的内容?

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

虽然可能使用任何内容类型来上传到HTTP,但实际使用的有三种:

  1. 一个由给定服务文档特别设置的。
  2. application/x-www-form-urlencoded - HTML表单的默认使用。
  3. multipart/form-data - HTML表单使用的另一个表单,当它包含表单上传时需要。

由于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

我的第一个想法是将其编码为base64。我认为这应该是最简单的方法。

From arcanecode.com:

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