POST запрос на C#

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by kurz, 19 Jul 2010.

  1. kurz

    kurz New Member

    Joined:
    5 Feb 2010
    Messages:
    32
    Likes Received:
    0
    Reputations:
    0
    Проблема следующем: автоматизирую post-запрос на сайт, на котором присутствуюет форма, состоящяя как бы из 2 частей:
    первый этап: http://site.ru/script.cgi?step=registration
    тут форма <form action=''>
    ввожу некоторые данные (2 параметра), далее нажимаю кнопку:
    идет пренаправление на второй этап, адрес:
    http://site.ru/script.cgi?step=registration&param1=bla&param2=bla
    тут нужно ввести в форму <form action='srcipt.cgi' method='post'> много данных и нажать submit. руками все получается )
    теперь программа:
    делаю запрос
    HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create("http://site.ru/script.cgi");
    req.Method = "POST";
    ... итд. саму методику формирования запроса выполняю правильно.
    передаю параметры:
    string Params = "step=registration&param1=bla&param2=bla&param3=blabla&paramN=blabla";
    получаю ответ. в любых вариациях приходит не результат выполнения моего запроса, а 2 этап регистрации, т.е. страница, доступная по адресу http://site.ru/script.cgi?step=registration&param1=bla&param2=bla, без каких-либо изменений.
    Не подскажете, в чем может быть проблема, и как отправлять запросы на страницы, сформированные скриптом?
     
  2. Chrome~

    Chrome~ Elder - Старейшина

    Joined:
    13 Dec 2008
    Messages:
    936
    Likes Received:
    162
    Reputations:
    27
    Используй сниффер и полностью воспроизведи действия браузера в своей программе. Также, целиком возможно (но скорее маловероятно), что нужно сначала перейти по адресу http://site.ru/, установить кукисы, а уже потом переходить на http://site.ru/script.cgi?step=registration.
     
  3. kurz

    kurz New Member

    Joined:
    5 Feb 2010
    Messages:
    32
    Likes Received:
    0
    Reputations:
    0
    спасибо, снифер помог. я оказывается забыл один параметр передать... сделано как то хитро.
    авторизацию я прохожу нормально, через кукисы как раз-таки.
     
  4. kurz

    kurz New Member

    Joined:
    5 Feb 2010
    Messages:
    32
    Likes Received:
    0
    Reputations:
    0
    вопрос такого плана: а почему пост запрос так долго идет? инет вроде быстрый, через браузер гораздо быстрее все происходит. можно ли как нибудь ускорить ?
     
  5. Chrome~

    Chrome~ Elder - Старейшина

    Joined:
    13 Dec 2008
    Messages:
    936
    Likes Received:
    162
    Reputations:
    27
    Какой компонент используешь для передачи POST запроса? если используешь библиотеку Winsock, - то выложи свой код.

    С другой стороны, - возможно ты не используешь сжатие данных. Браузер чаще всего как раз делает запрос на получение сжатых данных от сервака, размер которых уменьшен от несжатого варианта обычно в несколько раз.
     
  6. Buffalon

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

    Joined:
    22 Mar 2008
    Messages:
    241
    Likes Received:
    34
    Reputations:
    8
    каким образом ты передаёшь параметры ?
     
  7. kurz

    kurz New Member

    Joined:
    5 Feb 2010
    Messages:
    32
    Likes Received:
    0
    Reputations:
    0
    HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create("https://www.site.ru/script.cgi");
    req.Method = "POST";
    req.ContentType = "application/x-www-form-urlencoded";
    req.CookieContainer = cookie;

    byte[] SomeBytes = null;
    string FormParams = "param1=bla&param2=blabla";
    SomeBytes = Encoding.GetEncoding(1251).GetBytes(FormParams);
    req.ContentLength = SomeBytes.Length;
    Stream newStream = req.GetRequestStream();
    newStream.Write(SomeBytes, 0, SomeBytes.Length);
    newStream.Close();
     
  8. kurz

    kurz New Member

    Joined:
    5 Feb 2010
    Messages:
    32
    Likes Received:
    0
    Reputations:
    0
    и заодно еще вопрос: как автоматизировать загрузку файла?
    имеется
    <form action="script.cgi" method="post">
    <input type="file">
    </form>
    Как имитировать программно загрузку на сервер выбранного файла?
     
  9. NullByte

    NullByte Member

    Joined:
    8 Jun 2010
    Messages:
    25
    Likes Received:
    6
    Reputations:
    0
    На сокетах и с сжатием данных сделай, в разы быстрее будет.Вот тебе примерчик:

    P.S Гугл POST запрос не обрабатывает (у него GET), написал как пример.И да, за работоспособность кода не отвечаю ибо писал в блокноте и не компилил.

    P.P.S С GET запросом там намного проще, гугли.
     
    #9 NullByte, 20 Jul 2010
    Last edited: 20 Jul 2010
  10. kurz

    kurz New Member

    Joined:
    5 Feb 2010
    Messages:
    32
    Likes Received:
    0
    Reputations:
    0
    спасибо, попробую так.
     
  11. kurz

    kurz New Member

    Joined:
    5 Feb 2010
    Messages:
    32
    Likes Received:
    0
    Reputations:
    0
    а если авторизация на сайте происходит в 3 этапа (2 раза редирект - HTTP 302, а потом только конечная ссылка), то мне надо создавать 3 сокета и кидать 3 запроса, да ?
     
  12. PaCo

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

    Joined:
    6 Feb 2008
    Messages:
    436
    Likes Received:
    138
    Reputations:
    25
    ТС не слушай эту херню с сокетами, лучше пожертвовать 10 милисекундами и получить удобство использования чем заниматься парсингом ответа на Location.
    Все что необходимо это HttpWebRequest и HttpWebResponse, для авторедиректа AllowAutoRedirect = true.
     
  13. NullByte

    NullByte Member

    Joined:
    8 Jun 2010
    Messages:
    25
    Likes Received:
    6
    Reputations:
    0
    Не только 10 милисекунд, ещё socks прокси.
     
  14. kurz

    kurz New Member

    Joined:
    5 Feb 2010
    Messages:
    32
    Likes Received:
    0
    Reputations:
    0
    у меня задача такая: сделать 2 функции. первая будет проходить авторизацию. вторая должна получить доступ к закрытым страницам.
    как мне сделать так, чтобы вызвав один раз авторизацию, я мог всегда заходить на защищенные страницы? как я понимаю, надо сохранить куки... но у меня их почему то не приходит. проверяю response.Header["Set-Cookie"] - пусто...
     
  15. kurz

    kurz New Member

    Joined:
    5 Feb 2010
    Messages:
    32
    Likes Received:
    0
    Reputations:
    0
    вроде бы сделал... надо было AllowAutoRedirect=false поставить, чтобы он кукисы ловить успевал. Сохраняю их в строку просто, и использую в других функциях...
     
  16. PaCo

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

    Joined:
    6 Feb 2008
    Messages:
    436
    Likes Received:
    138
    Reputations:
    25
    Чето я не вижу что бы ТС говорил про socks в частности и про прокси в общем.