Całe żądanie HTTP jako string z użyciem HttpClient

0

Witam!

Przed wysłaniem żądania HTTP potrzebuję mieć w stringu cały request, bo muszę podpisać ten request hashem.
Mógłbym zestawiać połączenie TCP zklecać taki request ręcznie, ale nie o to chodzi. Wolałbym korzystać z dobrodziejstw HttpClient.

Czy spotkał się ktoś z takim problemem?

0

Co rozumiesz poprzez cały request(?) body + headers? Bo jak samo body to przecież wiesz co chcesz wysłać? :)
Korzystałem kiedyś z rest api które wymagało takiego hasha (body + apiKey + apiSecret) w nagłówku. Stworzyłem wtedy klasę która dziedziczyła po HttpClient (podkokszonego Install-Package Microsoft.AspNet.WebApi.Client) i stworzyłem konstruktor w którym podawałem apiKey/Secret, opakowałem metody HttpClienta we własne które przed wywołaniem metod bazowych liczyły hasha i dodawały nowy nagłówek przed wysłaniem.

0

No właśnie to samo mam do zrobienia. Czyli to nie był System.Net.Http.HttpClient ?

0

Był tylko Package Microsoft.AspNet.WebApi.Client zawiera zestaw extension methods które pomagają przy pracy z Jsonem/XML itp. ale wciąż to jest System.Net.Http.HttpClient.

0

Źle odczytałem. Ja mam podobny problem tyle że ja muszę podpisać cały request łącznie z nagłówkami i urlem. Do tego potrzebuję jakoś dobrać się do requesta w formie stringa

0

To ja innej metody niż zrobienie takiego stringa samemu nie widzę, ale jak znajdziesz jakąś metodę która przed wysłaniem zwróci takiego stringa z automatu to daj znać. :)

0

Może to Ci się przyda/ parametry dane jakie ja wysyłam, kod to komenda jaka ma się na api wykonać ;)

public string apiCommandSS(IDictionary<string, string> parametry, string kod)
        {
            string sendParams = "";
            try
            {
                LinkerIICommand.AplicationComand.DirectoryFiles.WriteLogs_ApiCommandSS(kod, parametry);  // Zapis logów do wysyłanych api

                HttpWebRequest requestPing = WebRequest.Create(ApiConfig.ApiSettings.apiLink + "/api/" + kod) as HttpWebRequest;  // Tworzymy Http Requesta
                if (requestPing != null)                                                                                          // Sprawdzenie czy jest połaczenie 
                {
                    requestPing.Method = "POST";                                                      // Ustawienie metody komunikacji
                    requestPing.ContentType = "application/json";                                     // Ustawienie rodzaju komunikacji

                    sendParams = new JavaScriptSerializer().Serialize(parametry);                    // Serializacja słownika 
                    _apiSign = _apiKey + "/api/" + kod + sendParams + ApiConfig.ApiSecret;           // Szyfrowanie danych poprzez dodanie apikey kodu zapytania słownika oraz ApiSecretu
                    _apiSign = sha1HashStringForUtf8String(_apiSign);                                // Zaszyfrowanie danych wysłanych do 

                    requestPing.Headers.Add("X-Rest-ApiKey", _apiKey);                               // Dołożenie apiKey
                    requestPing.Headers.Add("X-Rest-ApiSign", _apiSign);                             // Dołożenie apiSing informacji do wysłania

                    using (var streamWriter1 = new StreamWriter(requestPing.GetRequestStream()))     // Otwarcie danych do zapisu
                    {
                        streamWriter1.Write(sendParams);                                             // ustawienie informacji do wysłania
                        streamWriter1.Flush();                                                       // wysłanie danych
                        streamWriter1.Close();                                                       // zamkniecie wysyłania

                        var httpResponse = (HttpWebResponse)requestPing.GetResponse();               // ustawienie czekania na odpowiedz

                        string result;                                                                // stworzenie zmiennej ktora przyjmie wiadomosc zwrocna z serwera
                        using (var streamReader = new StreamReader(httpResponse.GetResponseStream())) // czekanie na odpowiedz z serwera
                        {
                            result = streamReader.ReadToEnd();                                        // zapisanie odpowiedzi do zmiennej
                        }

                        return result;                                                                      // Zwrócenie informacji z serwera
                    }
                }
                return "exception";                                                                                                                  // w przypadku jak nie ma połaczenia zwracamy expectiona
            }
            catch (WebException ex)                                                                                                                  // W przypadku jak powstał problem podczas komunikacji z API
            {

                LinkerIICommand.AplicationComand.DirectoryFiles.WriteLogs_ToLogsFile("[Api][Error][Comunikat]");                                     // Zapisanie Logu do main pliku iż coś się wydazyło 
                LinkerIICommand.AplicationComand.DirectoryFiles.WriteLogs_ApiError("[ApiCommand][Error] apiCommandSS  :  " + Convert.ToString(ex));  // Zapisanie Logu do ApiError informacji w jakiej komencie oraz zapis ex do pliku

                LinkerIICommand.AplicationComand.DirectoryFiles.WriteLogs_ApiError("[ApiCoomand][Error][Send] " + sendParams);

                return "exception" + Convert.ToString(ex);      // zwrócenie informacji o błedzie oraz ex

            }
        }
0

Niestety u mnie w pracy mój kierownik takiego komentowania wymaga. Mówi iż on to musi rozmieć, a niestety z .Net nie ma w ogóle nic wspólnego.


using System;
using System.Collections.Generic;
using System.Net.Http;

class Program
{
    static void Main()
    {
        using (var client = new HttpClient())
        {
            client.BaseAddress = new Uri("http://localhost:6740");
            var content = new FormUrlEncodedContent(new[] 
            {
                new KeyValuePair<string, string>("", "login")
            });
            var result = client.PostAsync("/api/Membership/exists", content).Result;
            string resultContent = result.Content.ReadAsStringAsync().Result;
            Console.WriteLine(resultContent);
        }
    }
}

 
 
StringContent content = new StringContent(HttpUtility.UrlEncode(action.Body), Encoding.UTF8, "application/x-www-form-urlencoded");
HttpResponseMessage sResponse = await sClient.PostAsync(action.URL, content ).ConfigureAwait(false);

Proszę metoda Clinet i wysyłanie stringa.

0

Dzięki za odpowiedź, ale nadal to jako string jest sam content, a nie cały request. Tak to ja też umiem ;P.

1 użytkowników online, w tym zalogowanych: 0, gości: 1