php
  • sockets
  • variables
  • post
  • fsockopen
  • 2010-11-09 21 views 1 likes 
    1

    Comment obtenir et publier des données via le même socket avec PHP? J'ai ce code:PHP GET et les données POST avec fsockopen

    $fp = fsockopen("ssl://ovi.rdw.nl", 443, $errno, $errstr, 30); 
    if(!$fp){ 
        echo $errstr; 
    }else{ 
    $post_data = 'ctl00$cntMaincol$btnZoeken=Zoeken&ctl00$cntMaincol$txtKenteken=83FHVN'; 
    
    $out = "GET /Default.aspx HTTP/1.0\r\n"; 
    $out .= "Host: ovi.rdw.nl\r\n"; 
    $out .= "Connection: Close\r\n\r\n"; 
    fwrite($fp, $out); 
    
    while(!feof($fp)){ 
        $data = fgets($fp); 
        $view_state = getViewState($data); 
        if($view_state != ""){ 
         echo $view_state."<br />"; 
         break; 
        } 
    } 
    
    $post_data = "__VIEWSTATE={$view_state}&".$post_data; 
    
    $out = "POST /Default.aspx HTTP/1.0\r\n"; 
    $out .= "Host: ovi.rdw.nl\r\n"; 
    $out .= "Content-type: application/x-www-form-urlencoded\r\n"; 
    $out .= "Content-length: " . strlen($post_data) . "\r\n"; 
    $out .= "Connection: Close\r\n\r\n"; 
    fwrite($fp, $out); 
    fwrite($fp, $post_data); 
    while(!feof($fp)){ 
        echo fgets($fp); 
    } 
    } 
    

    Il obtient les données correctes, mais l'affichage ne va pas bien. Qu'est-ce que je mords?

    Répondre

    0

    n'oubliez pas fflush()

    +0

    Pour quelle utilisation serait-ce? –

    +0

    il vide toutes les données mises en mémoire tampon à travers le flux. –

    1

    Vous faites un GET et POST dans la même connexion, ce n'est pas valide pour HTTP/1.0 que vous avez spécifié et re-assuré via une connexion: près. Commentez votre partie get et faites le post.

    Vous pouvez récupérer des données avec un post, vous n'avez donc pas besoin de faire un get et un post. Ou si vous avez besoin de faire un get et un post, fermez le socket, puis rétablissez le socket pour le post.

    +0

    J'ai besoin de faire la première fois pour obtenir la valeur $ view_state, sinon elle serait vide. Lorsque je rétablirais une nouvelle connexion, $ view_state serait différent, ce qui ne serait d'aucune utilité. –

    +0

    Ensuite, après le GET, fermez le socket et ouvrez une autre connexion pour le POST. La connexion devrait être supprimée après que votre tampon d'obtention se vide, et votre message est ignoré. – superfro

    +0

    Oups, relisez votre déclaration. Eh bien, si vous devez avoir la même connexion, vous devez passer à http 1.1, et utiliser des connexions persistantes via Connection: Keep-Alive au lieu de connexion: fermer – superfro

    0

    Curl est trop lourd dans certains cas, d'utiliser post_to_host():

    //GET: 
    $str_rtn=post_to_host($str_url_target, array(), $arr_cookie, $str_url_referer, $ref_arr_head, 0); 
    
    //POST: 
    $arr_params=array('para1'=>'...', 'para2'=>'...'); 
    $str_rtn=post_to_host($str_url_target, $arr_params, $arr_cookie, $str_url_referer, $ref_arr_head); 
    
    //POST with file: 
    $arr_params=array('para1'=>'...', 'FILE:para2'=>'/tmp/test.jpg', 'para3'=>'...'); 
    $str_rtn=post_to_host($str_url_target, $arr_params, $arr_cookie, $str_url_referer, $ref_arr_head, 2); 
    
    //raw POST: 
    $tmp=array_search('uri', @array_flip(stream_get_meta_data($GLOBALS[mt_rand()]=tmpfile()))); 
    $arr_params=array('para1'=>'...', 'para2'=>'...'); 
    file_put_contents($tmp, json_encode($arr_params)); 
    $arr_params=array($tmp); 
    $str_rtn=post_to_host($str_url_target, $arr_params, $arr_cookie, $str_url_referer, $ref_arr_head, 3); 
    
    //get cookie and merge cookies: 
    $arr_new_cookie=get_cookies_from_heads($ref_arr_head)+$arr_old_cookie;//don't change the order 
    
    //get redirect url: 
    $str_url_redirect=get_from_heads($ref_arr_head, 'Location'); 
    

    poste à l'hôte emplacement du projet php: http://code.google.com/p/post-to-host/

     Questions connexes

    • Aucun problème connexe^_^