Как отправить незашифрованные данные формы с помощью C # HttpClient - PullRequest
1 голос
/ 31 октября 2019

Я пытаюсь «переназначить» сторонний API, используемый настольным приложением. Я обнаружил, что приведенный ниже код позволяет мне очень близко сопоставить пакеты, отправленные приложением:

var formData = new FormUrlEncodedContent(new[]
{
    new KeyValuePair<string, string>(JsonConvert.SerializeObject(myPayload), "")
});

var response = Client.PostAsync(myURL, formData).Result;
var json = response.Content.ReadAsStringAsync().Result;

Это дает мне почти точно такую ​​же полезную нагрузку, отправленную приложением, за исключением того, что кодирует данные (язнаете, "закодировано" прямо в названии). Мне нужно получить точно такой же запрос, но без кодирования данных, но я не могу найти правильный объект (ы) для его выполнения. Как сохранить этот полезный груз от закодированного URL?

Редактировать:

Это запрос на вход в систему, полученный от Wireshark, исходящий из приложения:

POST /Login HTTP/1.1
Content-Type: application/x-www-form-urlencoded
Host: 1.1.1.1
Content-Length: 161
Expect: 100-continue
Connection: Close

{"username":"myuser","auth-id":"0a0a140f81a2ce0c303386e93cec41bf04660c22a881be9a"}

Эточто сгенерирует вышеприведенное:

POST /Login HTTP/1.1
Expect: 100-continue
Connection: Close
Content-Type: application/x-www-form-urlencoded
Content-Length: 221
Host: 1.1.1.1

%7B%22user-name%22%3A%22myuser%22%2C%22auth-id%22%3A%220a0a140f81a2ce0c303386e93cec41bf04660c22a881be9a%22%7D=

Я отредактировал их для краткости, поэтому Content-Length неверен. Я понимаю, что это может быть не лучший способ отправки этих данных, но я не могу контролировать, как они потребляются.

1 Ответ

2 голосов
/ 31 октября 2019

Поскольку вы на самом деле пытаетесь отправить JSON, я думаю, вам нужно заключить JSON в объект StringContent, а не в объект FormOrlEncoded. Данные в кодировке формы и данные JSON - это два разных способа форматирования полезной нагрузки (например, другим распространенным форматом может быть XML). Использование их вместе не имеет никакого смысла.

Я думаю, что-то вроде этого должно работать:

var content = new StringContent(JsonConvert.SerializeObject(myPayload), Encoding.UTF8, "application/json");
var response = Client.PostAsync(myURL, content).Result;
var json = response.Content.ReadAsStringAsync().Result;

(PS Заголовок Content-Type: application/x-www-form-urlencoded, отправленный приложением, кажется вводящим в заблуждение,поскольку тело запроса явно содержит JSON. Предположительно, принимающий сервер терпит эту чепуху или просто игнорирует ее, потому что всегда ожидает JSON.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...