2011-10-26 13 views
6

Tengo problemas para encontrar la mejor forma de codificar los parámetros POST para una llamada al servidor. Escribo un cliente C# que será atendido por un servidor PHP. Quiero permitir una gran flexibilidad en los parámetros, por lo que mi plan actual es tener un único parámetro que use JSON para codificar. Por ejemplo:Cómo codificar los parámetros HTTP POST (cliente C# a servidor PHP)?

params = {"object":"Main","function":"doecho","params":["echothis...."]} 

estoy usando el objeto C# WebRequest y contentType de "application/x-www-form-urlencoded; charset = UTF-8". Los datos llegan al servidor y todo funciona como se espera hasta que agregue caracteres JSON ilegales en los datos.

Por ejemplo, si uso los siguientes datos, no puedo hacer un json_decode en el servidor. El servidor parece girar automáticamente el 40% en una comilla doble (") cuando lo leí con $ this-> getRequest() -> getParams();. (Zend_Framework)

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

¿Cuál es la mejor ¿Practico aquí? ¿Necesito base64 para codificar los datos? ¿Hay algo obvio que me falta con el tipo de contenido o una configuración de php?

Tengo control total sobre el cliente y el servidor, por lo que me gustaría saber cuál es la mejor/mejor que hacer.

Respuesta

8

Aunque potencialmente a cualquier tipo de contenido puede ser utilizado para cargar a HTTP, hay tres que se utilizan en la práctica:

  1. un conjunto específicamente por la documentación de un servicio determinado.
  2. application/x-www-form-urlencoded: el valor predeterminado utilizado por los formularios HTML.
  3. multipart/form-data: el otro formulario utilizado por los formularios HTML, obligatorio cuando incluye la carga de formularios.

Debido a que los 2 y 3 son tan comunes (ya que son compatibles con todos los navegadores para enviar formularios), casi todos los técnicos del lado del servidor tienen cosas para manejar. Entonces, a menos que la parte de PHP haga algo extraño, debería poder usar cualquiera.

application/x-www-form-urlencoded no es apropiado para algunos datos, pero es el más simple para lo que se usa. Es prácticamente lo mismo que la forma en que se crean las cadenas de consulta para las solicitudes de formularios GET, pero como contenido POST.

Por lo tanto usted quiere que su contenido sea:

"params=" + Uri.EscapeDataString(paramData) 

A medida que la primera se convierte en tales:

params=%7B%22object%22%3A%22Main%22%2C%22function%22%3A%22doecho%22%2C%22params%22%3A%5B%22echothis....%22%5D%7D 

Y la segunda:

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 

Ambos de los cuales construidos-ins de PHP volverá a los formularios en su pregunta.

+0

Sí, esto tiene sentido para mí. ¡Gracias! – Jeff

+0

Debido a que nit-picking puede prevenir errores, tenga en cuenta que "params" (pero no el "=") también debe estar codificado por URI. Como sé que "params" cuando URI-encoded sigue siendo "params", no lo hago como un atajo, pero si era "párams" o "los params" entonces tendría que serlo. –

1

Mi primer pensamiento fue codificarlo como base64. Creo que esta debería ser la manera más simple.

De arcanecode.com:

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

Si el primer ejemplo funcionó, esto no puede ser correcto, ya que el primer ejemplo no fue Base-64. –

+0

Jon Hanna, la función EncodeTo64 (respuesta de hichaeretaqua) es solo para codificar la cadena en una representación Heximal de los Bytes ASCII. –