Конференция "Сети" » POST запрос через TClientSocket [WinXP]
 
  • alekseyi © (26.02.10 10:48) [0]
    здравствуйте! У меня проблема нужно выполнить post запрос, но сервер отвечает:

    HTTP/1.1 400 Bad Request
    Date: Fri, 26 Feb 2010 20:30:48 GMT
    Server: Oracle-Application-Server-10g/10.1.2.0.0 Oracle-HTTP-Server
    Connection: close
    Content-Type: text/html; charset=iso-8859-1

    не могу найти причину помогите пожалуйста!

    вот исходник программы:

    unit postU;

    interface

    uses
     Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
     Dialogs, StdCtrls, ScktComp;

    type
     TForm1 = class(TForm)
       ClientSocket1: TClientSocket;
       Button1: TButton;
       Memo1: TMemo;
       Edit1: TEdit;
       Button2: TButton;
       procedure Button1Click(Sender: TObject);
       procedure ClientSocket1Write(Sender: TObject; Socket: TCustomWinSocket);
       procedure ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket);
       procedure Button2Click(Sender: TObject);
     private
       { Private declarations }
     public
       { Public declarations }
     end;
    const

     WebServer = 'xxx';
     WebPort = 7780;
     PostAddr = '/pls/htmldb/'; //wwv_flow.accept

      HTTP_Data =
     'Content-Type: application/x-www-form-urlencoded'+#13#10+
     'from: mymail@mail.ru'+#13#10+
     'User-Agent: IE ()'+#13#10+
     'Host: xxx'+#13#10+
     'Referer: http://xxx/pls/htmldb'+#13#10+
     'Connection: Keep-Alive'+#13#10;

    var
     Form1: TForm1;

     FContent:string;
     FResult:string;
     HTTP_POST : string;

    implementation

    {$R *.dfm}

    procedure TForm1.Button1Click(Sender: TObject);
    begin
    FContent:=
    'p_flow_id="119"'+#13#10+
    'p_flow_step_id="101"'+#13#10+
    'p_instance="329311196309813"'+#13#10+
    'p_page_submission_id="2561758"'+#13#10+
    'p_request=""'+#13#10+
    'p_arg_names="325219607430380413"'+#13#10+
    'p_t01="login xxx"'+#13#10+
    'p_arg_names="325219682021380416"'+#13#10+
    'p_t02="password xxx"'+#13#10+
    'p_md5_checksum=""'#13#10;

    FContent:=
     'Content-Length: '+IntToStr(Length(FContent))+#13#10+
      FContent;

     HTTP_POST := 'POST http:  //'+WebServer+PostAddr+
                  ' HTTP/1.0'+#13#10;

     form1.ClientSocket1.Host:=webserver;
     form1.ClientSocket1.Port:=webport;
     
     HTTP_Post := HTTP_Post + HTTP_Data;
     form1.ClientSocket1.Open;
     
    end;

    procedure TForm1.Button2Click(Sender: TObject);
    begin
    form1.ClientSocket1.Socket.SendText(form1.edit1.Text);
    form1.Memo1.Lines.Insert(0,'>>> '+form1.edit1.Text);
    end;

    procedure TForm1.ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket);
    begin
    Fresult:=Fresult+socket.ReceiveText;
    form1.Memo1.Lines.Insert(0,'MSERV>> '+FResult);
    end;

    procedure TForm1.ClientSocket1Write(Sender: TObject; Socket: TCustomWinSocket);
    begin
     form1.Memo1.Lines.Insert(0,'IWR>> '+HTTP_POST+FContent);
     Socket.SendText(HTTP_POST+FContent);
    end;

    end.

    Заранее благодарю
  • alekseyi © (26.02.10 10:54) [1]
    вот сама форма:

    <form action="wwv_flow.accept" method="post" name="wwv_flow" id="wwvFlowForm" >
     <input type="hidden" name="p_flow_id" value="119" id="pFlowId" />  <input type="hidden" name="p_flow_step_id" value="101" id="pFlowStepId" />  <input type="hidden" name="p_instance" value="4362601671021144" id="pInstance" />  <input type="hidden" name="p_page_submission_id" value="2591075" id="pPageSubmissionId" />  <input type="hidden" name="p_request" value="" id="pRequest" /><table width="100%"><tr>
    <td style="padding:0; width=100%; text-align:right"></td></tr></table>
    <table border="0" summary="" align="center" style="margin:100px auto;">
    <tr>
    <td><table summary="" cellpadding="0" cellspacing="0" border="0" class="t3RegionwithoutButtonsandTitles" id="R332326989462457958">
    <tr>
    <td class="t3Body"><table width="100%" border=0><tr><td align="center" valign="center"><center><img src="wwv_flow_file_mgr.get_file?p_security_group_id=822518234669031&p_flow_id=11 9&p_fname=logo.gif"  border=0></center></td></tr></table></td>
    </tr>
    </table>

    <table class="formlayout" summary="" ><tr><td  align="right"><a class="t3optionalwithhelp" href="javascript:popupFieldHelp('325219607430380413','4362601671021144')" tabindex="999">User Name</a></td>
    <td  colspan="2" rowspan="1" align="left"><input type="hidden" name="p_arg_names" value="325219607430380413" /><input type="text" name="p_t01" size="40" maxlength="100" value="" id="P101_USERNAME"  /></td></tr><tr><td  align="right"><a class="t3optionalwithhelp" href="javascript:popupFieldHelp('325219682021380416','4362601671021144')" tabindex="999">Password</a></td>
    <td  colspan="1" rowspan="1" align="left"><input type="hidden" name="p_arg_names" value="325219682021380416" /><INPUT TYPE="password" NAME="p_t02" SIZE="40" MAXLENGTH="100" onkeypress="return submitEnter(this,event)" id="P101_PASSWORD" >
    </td><td  align="left"></td>
    <td  colspan="1" rowspan="1" align="left"><table style="display:inline;margin-left:6px;" cellpadding="0" cellspacing="0" border="0" summary=""><tr>
    <td style="width:9px;"><a href="javascript:doSubmit('LOGIN');"><img src="/i/themes/theme_3/button_left2.gif" border="0" height="25" width="11" alt=""/></a></td>
    <td class="t3ButtonHtmlMiddle" nowrap="nowrap"><a href="javascript:doSubmit('LOGIN');" class="t3ButtonHtmlMiddle">Login</a></td>
    <td style="width:9px;"><a href="javascript:doSubmit('LOGIN');"><img src="/i/themes/theme_3/button_right2.gif" border="0" height="25" width="11" alt=""/></a></td>
    </tr></table></td></tr>
    </table>

    </td>
    </tr>
    </table>
    <input type="hidden" name="p_md5_checksum" value=""  /></form>
  • Slym © (26.02.10 11:46) [2]
    alekseyi ©   (26.02.10 10:48)
    'p_flow_id="119"'+#13#10+
    'p_flow_step_id="101"'+#13#10+

    разделитель #13#10 сам придумал? может &
    alekseyi ©   (26.02.10 10:48)
    'Content-Length: '+IntToStr(Length(FContent))+#13#10+#13#10+
     FContent;

    надо дважды интер
  • Anatoly Podgoretsky © (26.02.10 11:57) [3]
    > Slym  (26.02.2010 11:46:02)  [2]

    Как думаешь, что значит #13#10+#13#10
  • Slym © (26.02.10 12:03) [4]
    Anatoly Podgoretsky ©   (26.02.10 11:57) [3]
    фторой я допесал... оригинал:
    alekseyi ©   (26.02.10 10:48)
    FContent:=
    'Content-Length: '+IntToStr(Length(FContent))+#13#10+
     FContent;
  • alekseyi © (26.02.10 12:40) [5]
    с & тоже ничего не получается
  • alekseyi © (26.02.10 12:43) [6]
    Я пробывал и через & и через /r/n
  • Anatoly Podgoretsky © (26.02.10 13:10) [7]

    > Я пробывал и через & и через /r/n

    Это ты прочто, случайно не про СИ ли?
  • Slym © (26.02.10 13:15) [8]
    alekseyi ©   (26.02.10 12:43) [6]
    1. зачем гадать? снифером посмотреть слабо что клиент шлет? (в заменитель снифера подойдет тотже netview в режиме портмап с отображением передаваемых данных)...
    2. добейся хотябы не HTTP/1.1 400 Bad Request упростив
    FContent:='a=b'; после этого будеш уверен что заголовки правильно уходят
    3. потом мути с FContent - там мало разделитель... нужно чтоб данные были x-www-form-urlencoded (касаеца кирилицы и спецсимволов)
  • alekseyi © (26.02.10 13:18) [9]

    > Это ты прочто, случайно не про СИ ли?

    Нет не про С, Delphi ковыряю
  • alekseyi © (26.02.10 13:22) [10]
    Спасибо за внимание к моей теме
    Просто раньше небыло нужды в работе с запросами
    Внимательно слежу за этой темой
  • Anatoly Podgoretsky © (26.02.10 13:34) [11]
    > Slym  (26.02.2010 13:15:08)  [8]

    FContent не относится к URL, там надо в соответсвии с дирактивами Content...
  • alekseyi © (26.02.10 13:36) [12]

    > FContent не относится к URL, там надо в соответсвии с дирактивами
    > Content...

    все input-ы с валуями через &
  • alekseyi © (26.02.10 13:37) [13]
    name="Aleksey"&mail="mymail@mail.ru" и т. п.
  • alekseyi © (26.02.10 14:03) [14]

    >  HTTP_POST := 'POST http:  //'+WebServer+PostAddr+      
    >         ' HTTP/1.0'+#13#10;


    Вот тут вопрос! между http: и // убрал пробелы
    HTTP/1.1 400 Bad Request - а нет, и вообще никакого ответа от сервера нету
  • Anatoly Podgoretsky © (26.02.10 14:19) [15]
    > alekseyi  (26.02.2010 13:36:12)  [12]

    К "input-там" у меня претензий не было, только к Content, там наиболее актуально utf-8
  • AlekseyI © (26.02.10 14:54) [16]
    Исправил на HTTP/1.1 теперь сервер отвечает HTTP/1.1 200 OK
  • AlekseyI © (27.02.10 07:09) [17]
    Я немного переписал программу
    теперь сервер отвечает и по моему жалуется на печеньки, что не так?
    вот ответ сервера:

    HTTP/1.1 200 OK
    Date: Sat, 27 Feb 2010 16:54:42 GMT
    Server: Oracle-Application-Server-10g/10.1.2.0.0 Oracle-HTTP-Server
    Content-Length: 464
    Keep-Alive: timeout=15, max=100
    Connection: Keep-Alive
    Content-Type: text/html; charset=WINDOWS-1251

    <div class="ErrorPageMessage">Expecting p_company or wwv_flow_company cookie to contain security group id of application owner.</div><table summary=""><tr><td><img src="/i/error.gif" border="0" /></td>
    <td>Error</td>
    <td>ERR-7621 Could not determine workspace for application (:) on application accept.
    </td></tr>
    <tr><td><a href="javascript:window.history.go(-1)">OK</a></td>
    <td><br /></td></tr></table>
    <script type="text/javascript">
    <!--

    //-->
    </script>

    а вот исходник программы:

    unit postU;

    interface

    uses
     Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
     Dialogs, StdCtrls, ScktComp;

    type
     TForm1 = class(TForm)
       ClientSocket1: TClientSocket;
       Button1: TButton;
       Memo1: TMemo;
       Edit1: TEdit;
       Button2: TButton;
       procedure Button1Click(Sender: TObject);
       procedure ClientSocket1Write(Sender: TObject; Socket: TCustomWinSocket);
       procedure ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket);
       procedure Button2Click(Sender: TObject);
     private
       { Private declarations }
     public
       { Public declarations }
     end;
    const

     WebServer = 'xxxxxx';
     WebPort = 7780;
     PostAddr = '/pls/htmldb/wwv_flow.accept';

      HTTP_Data =
     'Content-Type: application/x-www-form-urlencoded'+#13#10+
     'Host: xxx'+#13#10+
     'Referer: http://xxx:7780/pls/htmldb/f?p=119:70:452025081117386::NO:::'+#13#10+
     'Cookie: income=1'+#13#10+

     'from: mymail@mail.ru'+#13#10+
     'User-Agent: IE'+#13#10+
     'Accept-Charset: windows-1251'+#13#10+

     //'Referer: http://xxx/pls/htmldb/wwv_flow.accept'+#13#10+
     'Keep-Alive: 115'+#13#10+
     'Connection: Keep-Alive'+#13#10#13#10;

    var
     Form1: TForm1;

     FContent:string;
     FResult:string;
     HTTP_POST : string;

    implementation

    {$R *.dfm}

    procedure TForm1.Button1Click(Sender: TObject);
    begin

    FContent:=

    'p_flow_id="119"&'+
    'p_flow_step_id="101"&'+
    'p_instance="329311196309813"&'+
    'p_page_submission_id="2561758"&'+
    'p_request=""&'+
    'p_arg_names="325219607430380413"&'+
    'p_t01="xxx"&'+
    'p_arg_names="325219682021380416"&'+
    'p_t02="xxx"&'+
    'p_md5_checksum=""';

    FContent:=
     'Content-Length: '+IntToStr(Length(FContent))+#13#10#13#10+
     'Content:'+#13#10+
      FContent;

     HTTP_POST := 'POST http://'+WebServer+PostAddr+
                  ' HTTP/1.0'+#13#10;

     form1.ClientSocket1.Host:=webserver;
     form1.ClientSocket1.Port:=webport;
     
     HTTP_Post := HTTP_Post + HTTP_Data;
     form1.ClientSocket1.Open;

    end;

    procedure TForm1.Button2Click(Sender: TObject);
    begin
    form1.ClientSocket1.Socket.SendText(form1.edit1.Text);
    form1.Memo1.Lines.Insert(0,'>>> '+form1.edit1.Text);
    end;

    procedure TForm1.ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket);
    begin
    Fresult:=Fresult+socket.ReceiveText;
    form1.Memo1.Lines.Insert(0,FResult);
    form1.Memo1.Lines.Insert(0,'MSERV>>');
      form1.Memo1.Lines.Insert(0,'_______________________________');
    end;

    procedure TForm1.ClientSocket1Write(Sender: TObject; Socket: TCustomWinSocket);
    begin
     form1.Memo1.lines.insert(0,HTTP_POST);
     form1.Memo1.Lines.Insert(0,'IWR>> ');
     form1.Memo1.Lines.Insert(0,'_______________________________');
     Socket.SendText(HTTP_POST);
    end;

    end.
  • имя (06.11.11 22:20) [18]
    Удалено модератором
  • имя (06.11.11 22:21) [19]
    Удалено модератором
 
Конференция "Сети" » POST запрос через TClientSocket [WinXP]
Есть новые Нет новых   [134435   +19][b:0][p:0.001]