C# Отправка UrlEndcoded данных формы - PullRequest
0 голосов
/ 17 февраля 2020

Попытка отправить данные формы UrlEncoded в Post-запросе:

        client.BaseAddress = new Uri("myURI");

        var formContent = new MultipartFormDataContent();
        formContent.Headers.ContentType.MediaType = "application/x-www-form-urlencoded";

        formContent.Add(new StringContent("password"), "grant_type");
        formContent.Add(new StringContent("someUser"), "username");
        formContent.Add(new StringContent("somePassword"), "password");
        HttpResponseMessage response = client.PostAsync("token", formContent).Result;

По некоторым причинам заголовки запроса содержат следующее:

 somePassword
 --7e556624-1d60-4321-a4ee-a85f6ab601c6
 Content-Type: text/plain; charset=utf-8
 Content-Disposition: form-data; name=username

 someUser
 --7e556624-1d60-4321-a4ee-a85f6ab601c6
 Content-Type: text/plain; charset=utf-8
 Content-Disposition: form-data; name=password

et c ...

Наверное, Guid - это граница. Однако, так как я использовал urlencode, это должно быть '?' border.

На самом деле, если я позвоню в мой сервис с помощью Postman, используя те же параметры и application/x-www-form-urlencoded, тогда заголовки запроса будут содержать:

app_profile=freelancer&username=someUser&password=SomePassword&grant_type=password

Так как я могу добиться этого с помощью C#?

[EDIT]

Мне удалось заставить его работать так. Однако я хотел бы понять, что не так в исходном коде?

 var values = new Dictionary<string, string>
        {              
            {"username", "someUser"},
            {"password", "somePassword"},
            {"grant_type", "password"},
        };

        var formContent = new StringContent(JsonConvert.SerializeObject(values), Encoding.UTF8, "application/json");
        HttpResponseMessage response = client.PostAsync("token", new FormUrlEncodedContent(values)).Result;

1 Ответ

1 голос
/ 17 февраля 2020

Изначально вы использовали MultipartFormDataContent.

Это означает, что тип содержимого запроса будет заменен на multipart / form-data; border = {некоторый случайно сгенерированный ключ}

, и тело запроса будет разбито на куски, используя этот {некоторый случайно сгенерированный ключ}, каждый чанк будет иметь свой собственный тип контента.

multipart Тип содержимого / form-data особенно полезен при отправке файлов вместе с другими данными формы.

В отредактированном примере вы используете StringContent

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