Как закодировать параметры HTTP POST (клиент C # для PHP Server)? - PullRequest
8 голосов
/ 27 октября 2011

У меня проблемы с поиском наилучшего способа кодирования параметров 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 на стороне сервера. Похоже, что сервер автоматически превращает% 40 в двойные кавычки ("), когда я читаю его с помощью $ this-> getRequest () -> getParams (); (Zend_Framework).

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

Какая лучшая практика здесь? Нужно ли в base64 кодировать данные? Есть что-то очевидное, что мне не хватает с типом контента или настройкой php?

У меня есть полный контроль над клиентом и сервером, поэтому я хотел бы знать, что правильно / лучше всего делать.

Ответы [ 2 ]

12 голосов
/ 27 октября 2011

В то время как потенциально любой тип контента может быть использован для загрузки в 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

Оба встроенных PHP-кода превратятся в формы в вашем вопросе.

1 голос
/ 27 октября 2011

Моей первой мыслью было закодировать его как 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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...