Добавить параметры в httpclient - PullRequest
0 голосов
/ 30 июня 2019

Я написал HTTP-запрос в Почтальоне и хочу написать тот же запрос в своем приложении. У почтальона есть возможность увидеть код запроса на C #. В почтальоне он показывает запрос, используя RestSharp , так как я не хочу использовать внешние пакеты NuGet в своем проекте, я пытаюсь написать тот же запрос с объектами из .NET Framework.

Код RestSharp выглядит следующим образом:

var client = new RestClient("https://login.microsoftonline.com/04xxxxa7-xxxx-4e2b-xxxx-89xxxx1efc/oauth2/token");
var request = new RestRequest(Method.POST);       
request.AddHeader("Host", "login.microsoftonline.com");            
request.AddHeader("Content-Type", "application/x-www-form-urlencoded");
request.AddParameter("undefined", "grant_type=password&client_id=6e97fc60-xxx-445f-xxxx-a9b1bbc9eb2d&client_secret=4lS*xxxxxYn%5BENP1p%2FZT%2BpqmqF4Q&resource=https%3A%2F%2Fgraph.microsoft.com&username=myNameHere%402comp.onmicrosoft.com&password=xxxxxxxxxx6", ParameterType.RequestBody);
IRestResponse response = client.Execute(request);

enter image description here

Я пытался написать тот же запрос с HttpWebRequest:

HttpWebRequest request = (HttpWebRequest)WebRequest.Create("https://login.microsoftonline.com/0475dfa7-xxxxxxxx-896cf5e31efc/oauth2/token");
request.Method = "GET";
request.Referer = "login.microsoftonline.com";
request.ContentType = "application/x-www-form-urlencoded";

request.Headers.Add("grant_type", "password");
request.Headers.Add("client_id", "6e97fc60-xxxxxxxxx-a9bxxxxxb2d");
request.Headers.Add("client_secret", "4lSxxxxxxxxxxxmqF4Q");
request.Headers.Add("resource", "https://graph.microsoft.com");
request.Headers.Add("username", "xxxx@xxxxx.onmicrosoft.com");
request.Headers.Add("password", "xxxxxxxxxxxxx");

HttpWebResponse response = (HttpWebResponse)await request.GetResponseAsync();

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

1 Ответ

1 голос
/ 30 июня 2019

Я бы не стал использовать WebRequest, если вы можете, скорее используйте HttpClient:

HttpResponseMessage resp;

using (var httpClient = new HttpClient())
{
    var req = new HttpRequestMessage(HttpMethod.Get, "https://login.microsoftonline.com/0475dfa7-xxxxxxxx-896cf5e31efc/oauth2/token");
    req.Headers.Add("Referer", "login.microsoftonline.com");
    req.Headers.Add("Accept", "application/x-www-form-urlencoded");
    req.Headers.Add("Content-Type", "application/x-www-form-urlencoded");

    // This is the important part:
    req.Content = new FormUrlEncodedContent(new Dictionary<string, string>
    {
        { "grant_type", "password" },
        { "client_id", "6e97fc60-xxxxxxxxx-a9bxxxxxb2d" },
        { "client_secret", "4lSxxxxxxxxxxxmqF4Q" },
        { "resource", "https://graph.microsoft.com" },
        { "username", "xxxx@xxxxx.onmicrosoft.com" },
        { "password", "xxxxxxxxxxxxx" }
    });

    resp = await httpClient.SendAsync(req);
}

// Work with resp

Если вы решите использовать этот код, обратите внимание, что я просто использую using и избавляюсь от HttpClient для примера. Обычно вы бы этого не делали.

...