2011-10-26 7 views
6

Non riesco a trovare il modo migliore per codificare i parametri POST in una chiamata al server. Scrivo un client C# che verrà servito da un server PHP. Voglio consentire una grande quantità di flessibilità nei parametri, quindi il mio piano attuale è quello di avere un singolo parametro che utilizzo JSON per la codifica. Per esempio:Come codificare i parametri POST HTTP (client C# su server PHP)?

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

sto usando il WebRequest oggetto e contentType di C# "/ x-www-form-urlencoded domanda; charset = UTF-8". I dati arrivano al server e tutto funziona come previsto fino a quando aggiungo caratteri JSON illegali nei dati.

Ad esempio, se utilizzo i seguenti dati, non posso eseguire json_decode sul lato server. Il server appare allo spegnimento automatico del% 40 in una doppia-virgolette (") quando l'ho letto con $ this-> GetRequest() -> getparams();. (Zend_Framework)

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

Qual è la migliore Ho bisogno di base64 codificare i dati? C'è qualcosa di ovvio mi manca con il tipo di contenuto o un'impostazione php?

Ho il controllo completo sul client e sul server, quindi mi piacerebbe sapere che cosa è il diritto/cosa migliore da fare.

risposta

8

Mentre potenzialmente qualsiasi tipo di contenuto può essere utilizzato per caricare su HTTP, ci sono tre utilizzati nella pratica:

  1. uno specifico set da una documentazione di un determinato servizio.
  2. application/x-www-form-urlencoded - il valore predefinito utilizzato dai moduli HTML.
  3. multipart/form-data - l'altro modulo utilizzato dai moduli HTML, richiesto quando include i caricamenti dei moduli.

A causa del fatto che 2 e 3 sono così comunemente utilizzati (poiché sono supportati da tutti i browser per l'invio di moduli), praticamente tutta la tecnologia lato server ha le cose per gestirli. Quindi, a meno che la parte PHP non faccia qualcosa di strano, dovresti essere in grado di usarli entrambi.

application/x-www-form-urlencoded non è appropriato per alcuni dati, ma è il più semplice per quello a cui è destinato. È praticamente uguale al modo in cui le stringhe di query vengono create per le richieste di modulo GET, ma come contenuto POST.

Quindi si desidera che il contenuto di essere:

"params=" + Uri.EscapeDataString(paramData) 

Come tale la prima diventa:

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

E la seconda:

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 

Entrambi i quali built-in di PHP tornerà nelle forme nella tua domanda.

+0

Sì, questo ha senso per me. Grazie! – Jeff

+0

Poiché il nit-picking può prevenire bug, si noti che "params" (ma non il "=") dovrebbe anche essere codificato con URI. Perché so che i "param" quando codificati con URI sono ancora "params", non lo faccio come scorciatoia, ma se fosse "párams" o "i param", allora dovrebbe essere. –

1

il mio primo pensiero è stato codifica come Base64. Penso che questo dovrebbe essere il modo simplies.

Da 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

Se il primo esempio ha funzionato, questo non può essere corretto, poiché il primo esempio non era Base-64. –

+0

Jon Hanna, la funzione EncodeTo64 (risposta di hichaeretaqua) è solo per la codifica della stringa in una rappresentazione esadecimale dei byte ASCII. –