[C#] Отправить запрос, получить ответ

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by noxjoker, 30 Jan 2011.

  1. noxjoker

    noxjoker Member

    Joined:
    7 Aug 2009
    Messages:
    189
    Likes Received:
    24
    Reputations:
    0
    Добрый день стоит такая задача.

    Программе передастся HTTP запрос.
    Например такой:
    PHP:
    GET http://www.google.com.ua/ HTTP/1.1
    Acceptimage/gifimage/jpegimage/pjpegapplication/x-ms-applicationapplication/vnd.ms-xpsdocumentapplication/xaml+xmlapplication/x-ms-xbapapplication/x-shockwave-flashapplication/vnd.ms-excelapplication/vnd.ms-powerpointapplication/msword, */*
    Accept-Language: uk
    User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0; SLCC1; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET4.0C; .NET CLR 3.0.30729; InfoPath.1)
    Accept-Encoding: gzip, deflate
    Proxy-Connection: Keep-Alive
    Host: www.google.com.ua
    Cookie: lolnoob
    Программа должна отправить этот запрос на необходимый сайт (http://www.google.com.ua) и получить от него ответ.

    Хочу сделать через HttpWebRequest но:

    WebReq.Accept
    WebReq.Connection
    WebReq.ContentLength
    WebReq.ContentType
    WebReq.Expect
    WebReq.KeepAlive
    WebReq.MediaType
    WebReq.Method
    WebReq.Pipelined
    WebReq.PreAuthenticate
    WebReq.ProtocolVersion
    WebReq.Referer
    и т.д
    Это все придется парсить :mad:

    Жду вашего совета :rolleyes:

    p.s Запросы всегда меняются !
     
    #1 noxjoker, 30 Jan 2011
    Last edited: 30 Jan 2011
  2. Maccembo

    Maccembo New Member

    Joined:
    27 Jan 2011
    Messages:
    6
    Likes Received:
    0
    Reputations:
    0
    Вопрос изначально поставлен неправильно.
    На какую программу посылается HTTP запрос?
    HTTP запросы бывают разные, обычно POST/GET. Если ты делаешь клиент - серверную программу, сервер также может служить для обеих запросов, принимать и отсылать все ответы.
    А парсить будешь через регулярки или с методами стринга.

    Вот, например:

    // Подключаем спейсы
    using System.Text.RegularExpressions;
    using System.Net;

    // Создаем переменные
    private WebRequest Request;
    private WebResponse Response;
    private StreamReader Reader;

    // Переменная для кук
    private string Cook = "";

    // Страница на которую отправляется запрос
    string SendPage = "http://www.google.com";

    // Создаем запрос "POST"
    Request = WebRequest.Create(SendPage);
    Request.Method = "POST";
    Request.ContentType = "application/x-www-form-urlencoded";
    Request.Headers.Add("Accept-Language", "ru-RU,ru;q=0.9,en;q=0.8");
    Request.Headers.Add("Accept-Charset", "iso-8859-1, utf-8, utf-16, *;q=0.1");
    Request.Headers.Add("Accept-Encoding", "deflate, gzip, x-gzip, identity, *;q=0");
    ((HttpWebRequest)Request).UserAgent = "Не имеет значение, если не надо выводить в Браузер";
    ((HttpWebRequest)Request).KeepAlive = true;
    ((HttpWebRequest)Request).Proxy = null; Ставим обязательно, это также ускоряет подключение.
    ((HttpWebRequest)Request).Referer = "http://www.google.com";
    (HttpWebRequest)Request).Accept = "text/html";


    // Проверяем, если имеются куки, берем обязательно
    if (!String.IsNullOrEmpty(Cook))
    {
    Request.Headers.Add(HttpRequestHeader.Cookie, Cook);
    }


    // Здесь будут твои данные. Обычно все данные посылаются с Амперсандом указывающие на переменную присвоив значения с правой стороны.
    string Dataa =
    "&login=твой логин"
    "&pass=твой пароль" ;

    byte[] ByteArr = Encoding.GetEncoding(1251).GetBytes(Dataa);
    Request.ContentLength = ByteArr.Length;
    Request.GetRequestStream().Write(ByteArr,
    0,
    ByteArr.Length);

    Response = Request.GetResponse();
    Reader = new StreamReader(Response.GetResponseStream(),
    Encoding.GetEncoding("utf-8"));

    // Ставим true/false для перенаправления на другую страницу. Но нежелательно, т.к. могут потеряться куки, надо будет следить за каждым запросом
    ((HttpWebRequest)Request).AllowAutoRedirect = false;


    // Парсим страничку
    // Создаем переменную для страницы
    string S = Reader.ReadToEnd();

    // Для IP адресов
    string RegPattern = @"^((2[0-5]{2}|1[0-9]{2}|[0-9]{1,2})\.){3}(2[0-5]{2}|1[0-9]{2}|[0-9]{1,2})$";

    Match RegMatches = Regex.Match(S, RegPattern);

    if (RegMatches.Success)
    {
    MessageBox.Show(RegMatches.value);
    // Если значение разделилась на группы, вытаскиваем оттуда начиная с нуля.
    MessageBox.Show(RegMatches.Groups[0].value);

    }

    // Закрываем поток, освобождаем память
    Reader.Close();
    Response.Close();
     
    #2 Maccembo, 30 Jan 2011
    Last edited: 30 Jan 2011
  3. noxjoker

    noxjoker Member

    Joined:
    7 Aug 2009
    Messages:
    189
    Likes Received:
    24
    Reputations:
    0
    есть запрос (он часто меняется(меняется и GET на POST и меняется Хост)):

    PHP:
    GET http://www.google.com.ua/ HTTP/1.1 
    Acceptimage/gifimage/jpegimage/pjpegapplication/x-ms-applicationapplication/vnd.ms-xpsdocumentapplication/xaml+xmlapplication/x-ms-xbapapplication/x-shockwave-flashapplication/vnd.ms-excelapplication/vnd.ms-powerpointapplication/msword, */* 
    Accept-Language: uk 
    User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0; SLCC1; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET4.0C; .NET CLR 3.0.30729; InfoPath.1) 
    Accept-Encoding: gzip, deflate 
    Proxy-Connection: Keep-Alive 
    Host: www.google.com.ua 
    Cookie: lolnoob 
    мне надо отправить на сайт.
    после отправки получить ответ от сервера.

    В теории понятно?


    Как я уже написал HttpWebRequest использовать неудобно поскольку надо писать парсер для каждого поля (WebReq.Accept,WebReq.Connection,WebReq.ContentLength ...)

    Нужен другой вариант.
     
    #3 noxjoker, 30 Jan 2011
    Last edited: 30 Jan 2011
  4. Maccembo

    Maccembo New Member

    Joined:
    27 Jan 2011
    Messages:
    6
    Likes Received:
    0
    Reputations:
    0
    Не имею понятия о чем ты говоришь, помог как смог.
    А что еще остается, Wininet, Winsock или что-то еще?!
    Ведь ты ничего сверхсложного не делаешь, там обычные запросы которые надо парсить, вот и все.
    Или придумать свой алгоритм обработки данных - послать, получить, проверить/сверить, изменить и отправить заново. И так бесконечно в цикле пока получишь нужный тебе ответ.
     
  5. noxjoker

    noxjoker Member

    Joined:
    7 Aug 2009
    Messages:
    189
    Likes Received:
    24
    Reputations:
    0
    можно сделать через Soket.

    я сделал так но роботает криво очень.

    PHP:
    Socket s //Socket
    NetworkStream ns = new NetworkStream(s); 
    StreamWriter sw_socket = new StreamWriter(ns);
    StreamReader sr_socket = new StreamReader(ns);
    PHP:
    sw_socket.Write(request);//Отправили запрос "GET ..."
    sw_socket.Flush();
    Проблема тут
    PHP:
     Char[] readBuffer = new Char[128];
                
    int count 0;
                do
                {
                    
    count sr_socket.Read(readBuffer0128);
                    
    otvet_tmp = new string(readBuffer0count);
                    
    otvet_full += otvet_tmp;//Ответ сервера
                
    }
                while (
    count 0);
                
    sr_socket.Close();
    Роботает криво.
     
  6. wikxer

    wikxer New Member

    Joined:
    12 Nov 2010
    Messages:
    12
    Likes Received:
    1
    Reputations:
    0
    Не тестировал, первое что пришло в голову.
    Code:
    HttpWebRequest req = HttpWebRequest.Create("http://google.com");
    //Расставляем заголовки тут
    stream resp = req.GetRequestStream;
    StreamReader sr = new StreamReader(resp);
    string mypage = sr.ReadToEnd();
    //Код для парсинга страницы
    sr.Dispose();
    
     
  7. noxjoker

    noxjoker Member

    Joined:
    7 Aug 2009
    Messages:
    189
    Likes Received:
    24
    Reputations:
    0
    PHP:
    GET http://www.google.com.ua/ HTTP/1.1 
    Acceptimage/gifimage/jpegimage/pjpegapplication/x-ms-applicationapplication/vnd.ms-xpsdocumentapplication/xaml+xmlapplication/x-ms-xbapapplication/x-shockwave-flashapplication/vnd.ms-excelapplication/vnd.ms-powerpointapplication/msword, */* 
    Accept-Language: uk 
    User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0; SLCC1; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET4.0C; .NET CLR 3.0.30729; InfoPath.1) 
    Accept-Encoding: gzip, deflate 
    Proxy-Connection: Keep-Alive 
    Host: www.google.com.ua 
    Cookie: lolnoob 
    а это куда вставить ?

    Мне нужно этот запрос (в таком виде) отправить на сайт и получить ответ.
     
  8. wikxer

    wikxer New Member

    Joined:
    12 Nov 2010
    Messages:
    12
    Likes Received:
    1
    Reputations:
    0
    Ищи гдето здесь http://msdn.microsoft.com/en-us/library/8y7x3zz2.aspx
     
  9. noxjoker

    noxjoker Member

    Joined:
    7 Aug 2009
    Messages:
    189
    Likes Received:
    24
    Reputations:
    0
    в HttpWebRequest Class нельзя просто вставить запрос. Там надо прописовать в каждое свойство.

    А мне так не подходит поскольку у меня запрос целий идет. А писать парсер, для HttpWebRequest для каждого поля глупость. :mad:
     
  10. CodeSender:)

    CodeSender:) Elder - Старейшина

    Joined:
    29 Jul 2010
    Messages:
    245
    Likes Received:
    115
    Reputations:
    23
    Ну сделай класс который будет принимать только те параметры которые тебе нужны + сам дописывать то что тебе надо.
     
  11. noxjoker

    noxjoker Member

    Joined:
    7 Aug 2009
    Messages:
    189
    Likes Received:
    24
    Reputations:
    0
    причем сдесь параметры.

    Сотри. Мне надо отправить http запрос как он есть строкой и получить ответ. И все.

    мне не надо:
    Я ж код дал выше. :(
     
  12. CodeSender:)

    CodeSender:) Elder - Старейшина

    Joined:
    29 Jul 2010
    Messages:
    245
    Likes Received:
    115
    Reputations:
    23
    Да блин непонятно что ты хочешь!Если тебе просто отправлять -> принимать то юзай вебрекветс.
     
  13. noxjoker

    noxjoker Member

    Joined:
    7 Aug 2009
    Messages:
    189
    Likes Received:
    24
    Reputations:
    0
    через netcat:

    cat request.txt | netcat site.com 80 > response.txt

    при этом request.txt содержит полностью GET или POST запрос


    Мне такое на шарпе )
     
  14. noxjoker

    noxjoker Member

    Joined:
    7 Aug 2009
    Messages:
    189
    Likes Received:
    24
    Reputations:
    0
    Немного разобрался но ответ так и не нашел.

    Как с такого

    PHP:
    GET http://www.google.com.ua/ HTTP/1.1 
    Accept: [SIZE=1]image/gifimage/jpegimage/pjpegapplication/x-ms-applicationapplication/vnd.ms-xpsdocumentapplication/xaml+xmlapplication/x-ms-xbapapplication/x-shockwave-flashapplication/vnd.ms-excelapplication/vnd.ms-powerpointapplication/msword, */* [/SIZE]
    Accept-Language: uk 
    User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0; SLCC1; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET4.0C; .NET CLR 3.0.30729; InfoPath.1) 
    Accept-Encoding: gzip, deflate 
    Proxy-Connection: Keep-Alive 
    Host: www.google.com.ua 
    Cookie: lolnoob 
    Сделать

    request.Accept Взять image/gif, image/jpeg, image/pjpeg, application/x-ms-application, application/vnd.ms-xpsdocument, application/xaml+xml, application/x-ms-xbap, application/x-shockwave-flash, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*

    requset.User-Agent Взять Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0;
    requset.Accept-Encoding Взять gzip, deflate

    и т.д

    Передать Запрос в виде строчки и получить что-то что можно впихнуть в HttpWebRequest.


    Думаю правда хранится в RequestContext, HttpContex, HttpRequest просвитите :confused:
     
    #14 noxjoker, 3 Feb 2011
    Last edited: 3 Feb 2011
  15. PaCo

    PaCo Elder - Старейшина

    Joined:
    6 Feb 2008
    Messages:
    436
    Likes Received:
    138
    Reputations:
    25
    Ну так в Soket его, в Socket или в TcpClient, только если там будет gzip,chunked,Ssl придется делать еще и инкапсуляцию всего этого добра. Только зачем это надо то, непонятно.