fleshherbal
@fleshherbal

Как передавать заголовки POST через HttpRequest?

Всем привет. Помогите примером пожалуйста. Для примера я взял сайт работы яндекса, допустим, мне нужно нажать на кнопку добавить в избранное определенную вакансию и отследить обратную связь через Response.
Запарсив заголовки я имею следующее:
5f7c6a3d87aec599033257.png
Как определить конкретный запрос за нажатие кнопки я еще не понял, ну ладно, пусть будет 1: 1276757?page-url=https%3A%2F%2Frabota.yandex.ru%2F…89137%3Au%3A1584121219589671361%3App%3A3629563401
Далее мы имеем заголовки которые мне нужно передать обратно, я опять же, думаю что мне нужно смотреть на Request Headers!??
Хорошо, я их вписываю следующем образом:
string url = "https://rabota.yandex.ru/chelyabinsk/vakansii/"
var req = (HttpWebRequest)WebRequest.Create(url);
req.Method = "POST"
req.Connection = "keep-alive"

и так далее. Но после перечисления всех хедеров мне не понятно, что делать дальше.
Помимо того что нужно будет вызвать объект для HttpWebRespnce.
Пожалуйста, помогите примером, для общего понимания, в гугле не описано как передавать заголовки обратно, какую конкретно информацию например мне нужно шифровать в байты, и что конкретно передавать. Примером я пойму.
5f7c6d3f11dd0455719866.png
5f7c6d6e3c830461339624.png

Еще не понятно, какие конкретно заголовки я должен передавать вместе с куки, а какие не обязательно. Спасибо заранее.
  • Вопрос задан
  • 165 просмотров
Решения вопроса 1
@cicatrix
было бы большой ошибкой думать
В двух словах, после создания запроса, надо открыть RequestStream, записать в него все POST данные и отправить на сервер.
Вот выдернул из готового проекта отправку POST запроса:
// в data передаются параметры POST (ключ - значение)
// если надо загрузить файл - передаётся в file
internal static string Post(string url, Dictionary<string, string> data, FileUploadData file = null)
        {
            string ServerResponse = null;
            HttpWebRequest wrq = (HttpWebRequest)HttpWebRequest.Create(url);
            wrq.Method = WebRequestMethods.Http.Post;
            wrq.UserAgent = System.Reflection.Assembly.GetExecutingAssembly().GetName().Name + 
                            System.Reflection.Assembly.GetExecutingAssembly().GetName().Version.ToString();
            wrq.Timeout = 600000;
            try
            {
                // Это на случай использования прокси, можно выкинуть
                if (Config.UseProxy)
                {
                    WebProxy proxy = new WebProxy(Config.ProxyAddress, Config.ProxyPort);
                    if (Config.ProxyLogin != string.Empty || Config.ProxyPass != string.Empty)
                    {
                        proxy.Credentials = new NetworkCredential(Config.ProxyLogin, Config.ProxyPass);
                        proxy.UseDefaultCredentials = false;
                    }
                    else
                    {
                        proxy.UseDefaultCredentials = true;
                    }
                }

                if (null == file) // проверяем, надо ли загружать файл на сервер
                {
                    wrq.ContentType = "application/x-www-form-urlencoded";
                    Stream requestStream = wrq.GetRequestStream();
                    List<string> keydata = new List<string>();
                    foreach (string key in data.Keys)
                    {
                        keydata.Add($"{HttpUtility.UrlEncode(key)}={HttpUtility.UrlEncode(data[key])}");
                    }
                    WriteToStream(requestStream, string.Join("&", keydata));
                    requestStream.Flush();
                }
                else
                {
                    // Формируем multipart/form-data (отправка данных с формы)
                    string boundary = "----------" + DateTime.Now.Ticks.ToString("x");
                    wrq.ContentType = "multipart/form-data; boundary =" + boundary;
                    Stream requestStream = wrq.GetRequestStream();
                    WriteMultipartForm(requestStream, boundary, data, file);
                }
                // Посылаем данные на сервер и ждём ответа
                wrq.BeginGetResponse(a =>
                {
                    try
                    {
                        WebResponse resp = wrq.EndGetResponse(a);
                        Stream respStr = resp.GetResponseStream();
                        using (StreamReader sr = new StreamReader(respStr))
                        {
                            ServerResponse = sr.ReadToEnd();
                        } // using sr
                } // try
                catch (Exception ex)
                    {
                        Logger.LogError("Transport.Post", Globalizer.ID_Transport_Request_executing_error, ex);
                    } // catch
            }, null);
            }  // try
            catch(Exception ex)
            {
                Logger.LogError("Transport.Post", Globalizer.ID_Transport_Could_not_connect_to_server, ex);
                return null;
            }
            return ServerResponse;
        } // Post

private static void WriteMultipartForm(Stream s, string boundary, Dictionary<string, string> data, FileUploadData file)
        {
            /// The first boundary
            byte[] boundarybytes = Encoding.UTF8.GetBytes("--" + boundary + "\r\n");
            /// the last boundary.
            byte[] trailer = Encoding.UTF8.GetBytes("\r\n--" + boundary + "--\r\n");
            /// the form data, properly formatted
            string formdataTemplate = "Content-Disposition: form-data; name=\"{0}\"\r\n\r\n{1}";
            /// the form-data file upload, properly formatted
            string fileheaderTemplate = "Content-Disposition: form-data; name=\"{0}\"; filename=\"{1}\";\r\nContent-Type: {2}\r\n\r\n";

            /// Added to track if we need a CRLF or not.
            bool bNeedsCRLF = false;

            if (data != null)
            {
                foreach (string key in data.Keys)
                {
                    /// if we need to drop a CRLF, do that.
                    if (bNeedsCRLF)
                        WriteToStream(s, "\r\n");

                    /// Write the boundary.
                    WriteToStream(s, boundarybytes);

                    /// Write the key.
                    WriteToStream(s, string.Format(formdataTemplate, key, data[key]));
                    bNeedsCRLF = true;
                }
            }

            /// If we don't have keys, we don't need a crlf.
            if (bNeedsCRLF)
                WriteToStream(s, "\r\n");

            WriteToStream(s, boundarybytes);
            WriteToStream(s, string.Format(fileheaderTemplate, file.FieldName, file.Filename, file.ContentType));
            /// Write the file data to the stream.
            WriteToStream(s, file.FileData);
            WriteToStream(s, trailer);
        }

private static void WriteToStream(Stream s, string txt)
        {
            byte[] bytes = Encoding.UTF8.GetBytes(txt);
            s.Write(bytes, 0, bytes.Length);
        } // WriteToStream
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы