2

同じクライアントに複数のリクエストを送信しています。サイトが JavaScript リダイレクトを提供しているため、zend_Http_Client がリダイレクトできません。そして、その JavaScript からリダイレクト URL を取得し、再度 client を呼び出すと、アクセスが拒否されます。これは、最初のクライアント リクエストからセッションを保存できないためです。

私は次のコードを使用しています..

$client = new Zend_Http_Client(
        $loginUrl, 
        array(
            'keepalive' => true,
            'timeout'   => 1000
        )
    );
$response = $client->request()->getBody();
$redirectUrl = $this->_getResponseRedirectUrl($response);

$client->resetParameters();         
$client->setUri($redirectUrl);
$response = $client->request()->getBody();

$resultUrl = $this->_getResponseRedirectUrl($response);

2 番目のリクエストのセッションを保存する方法を教えてください。

4

2 に答える 2

0

次の手順を試す前に、サーバー認証がセッションCookieに基づいていることを確認してください。

解決策は私のために働いた:

最初の休憩から2番目のリクエストにCookieを追加する必要があります。この場合、サーバーは2番目のリクエストを認証済みリクエストと見なします。サイトにログインした後の応答では、Cookieには、cookie-name、cookie-value、Expiration Date、Path、Secure、HTTPOnlyなどの値のセットが含まれます。cookie文字列からcookie-nameとcookie-valueを展開します

ログイン応答後のセッションCookieの例:

"JSESSIONID=DQl3NKXXmy3yntp3NW2GMlcn8pLn9PR9rl0lnR6vbtfdVpyHWdnq!598502565; path=/"
"CK_LanguageID_252085=1; expires=Friday, 23-Mar-2012 05:31:03 GMT; path=/; secure"
"CK_TimeZone_252085=4; expires=Friday, 23-Mar-2012 05:31:03 GMT; path=/; secure"

次のパターンで、サーバーとさらに通信するための新しいCookie文字列を作成します。

"JSESSIONID=DQl3NKXXmy3yntp3NW2GMlcn8pLn9PR9rl0lnR6vbtfdVpyHWdnq!598502565;  CK_LanguageID_252085=1; CK_TimeZone_252085=4"

zend_http_client"Set-cookie"配列からCookie文字列を作成するための便利なメソッドを追加します。

/**
 * Get clean cookie string with only name,value pair
 * This method filer all the follwoing cookie information
 * Expiration Date, Path, Secure and HTTPOnly
 * @access public
 * @param {Array} $cookies
 * @return {String} $cookieString
 */
public function getCookieString(array $cookies){
  $cookieString = null;  
  foreach($cookies as $cookie){
      $part = explode(';',$cookie);
      $cookieString = ($cookieString == null)? $part[0] : $cookieString . '; ' . $part[0];
    }
  return $cookieString;
}

連続したリクエストを行うZend_Http_Clientの使用:

 //Login
 $client = new Zend_Http_Client($loginUrl); 
 $response = $client->request();

 //Get Header from response
 $headers = $response->getHeaders();
 //Create second header 
 $header = array("Cookie" => $this->getCookieString($headers["Set-cookie"]));
 $client->setHeaders($header);

 //Second request
 $client->setUri($redirectUrl);
 $response = $client->request();  

ここでは、「$ client-> resetParameters();」を削除しています。「$client->setParameterGet()」を使用してGETパラメータを設定していないため(POSTでも同じ)

「$client->setParameterGet()」または「$ client-> setParameterPost()」を使用する場合は、「$ client-> resetParameters();」を使用します。2番目のURIを設定する前。

$ client-> resetParameters()はブール値を受け入れます:

  • FALSE:これは、POSTおよびGETパラメータのみをリセットするデフォルト値です。
  • TRUE:ヘッダー、最後の要求、最後の応答を含むすべてのパラメーターをリセットします。
于 2011-03-24T09:15:19.197 に答える
0

実際、Zend_Http_Client は、これまで行ってきたことを非常に簡単に実行できる方法を提供します。ここで車輪を再発明する必要はありません。

$client = new Zend_Http_Client(
        $loginUrl, 
        array(
            'keepalive' => true,
            'timeout'   => 1000
        )
    );

// this is the magic line...
$client->setCookieJar();

$response = $client->request()->getBody();
$redirectUrl = $this->_getResponseRedirectUrl($response);

$client->resetParameters();         
$client->setUri($redirectUrl);
$response = $client->request()->getBody();

$resultUrl = $this->_getResponseRedirectUrl($response);

詳細はこちら: http://framework.zend.com/manual/en/zend.http.cookies.html

于 2011-05-05T20:49:10.033 に答える