Как обернуть тело запроса POST, чтобы можно было отправлять ограниченные символы - PullRequest
0 голосов
/ 09 ноября 2018

Использование powershell для получения текущего токена пользователя от внешнего сервиса У меня нет проблем:

$uri = "http://myserver/fmetoken/view"
$postParams = @{user='Myuser';password='PS78U-w&';}
$foo = Invoke-WebRequest -Uri $uri -Method Post -Body $postParams

$foo.Content

я получаю токен.

если я использую почтальон для проверки, проблема не возникает.

но если я хочу реализовать то же действие в c #, ответ будет таким: 'Удаленный сервер возвратил ошибку: (401) Не авторизован.' когда пароль содержит символы, такие как '&' и '='

var url = $"{fmeServerUrl}/fmetoken/view";
var body = $"user={settingsUserFme}&password={settingsPasswordFme}";

var byteArray = Encoding.UTF8.GetBytes(body);
var responseCode = 0;
var request = (HttpWebRequest)WebRequest.Create(url);
request.Method = "POST";
request.Credentials = CredentialCache.DefaultCredentials;
request.ContentType = "application/x-www-form-urlencoded";

request.ContentLength = byteArray.Length;
var dataStream = request.GetRequestStream();
dataStream.Write(byteArray, 0, byteArray.Length);
dataStream.Close();

WebResponse response = request.GetResponse();
using (var reader = new StreamReader(response.GetResponseStream()))
{
    responseresult = reader.ReadToEnd();
    reader.Close();
}

Я уже пытался использовать:

var bodyencoded = System.Net.WebUtility.UrlEncode(body);
var byteArray = Encoding.UTF8.GetBytes(bodyencoded);

но в этом случае я получаю неверный запрос

1 Ответ

0 голосов
/ 09 ноября 2018

Если вы UrlEncode целиком body, символы & и = в теле, предназначенные для помощи в разборе, отбрасываются, поэтому ваш запрос превратился бы в нечто вроде этого:

user=Myuser&password=PS78U-w&
user=Myuser%26password=PS78U-w%26 // post UrlEncode

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

Чтобы избежать этого, вы можете отдельно кодировать параметр пароля Url, а затем поместить его в переменную body.

var passencoded = System.Net.WebUtility.UrlEncode(pass)
var body = $"user={settingsUserFme}&password={passencoded}";

Который должен иметь результат: user=Myuser&password=PS78U-w%26, отмечая, что амперсанд перед password значим и сохранен.

...