So gelangen Sie bei einem Guzzle-Anruf über den Anmeldebildschirm hinaus
Frage
Ich muss Informationen über cURL an eine externe Website senden.Ich habe Guzzle in meiner Laravel-Anwendung eingerichtet.Ich habe die Grundlagen eingerichtet, aber laut der Dokumentation der Website ist eine Aktion für den Benutzernamen und das Passwort erforderlich.Wie kann ich die „Aktion“ zusammen mit den Anmeldeinformationen übergeben, die für die Anmeldung und den Zugriff erforderlich sind?
Auf der Website heißt es:
curl [-k] –dump-header <header_file> -F “action=login” -F “username=<username>” -F “password=<password>” https://<website_URL>
Mein Controller:
$client = new \GuzzleHttp\Client();
$response = $client->get('http://website.com/page/login/', array(
'auth' => array('username', 'password')
));
$xml = $response;
echo $xml;
Die Website wird geladen echo
, aber es wird nur der Anmeldebildschirm angezeigt.Ich benötige diese Anmeldeinformationen, um den Anmeldebildschirm (bei erfolgreicher Anmeldung) zu umgehen und zu den Informationen zu gelangen, die ich für cURL benötige.
Lösung
curl -F
sendet eine POST-Anfrage anstelle einer GET-Anfrage.Sie müssen Ihren Code also entsprechend ändern, etwa
$client = new \GuzzleHttp\Client();
$response = $client->post('http://website.com/page/login/', [
'body' => [
'username' => $username,
'password' => $password,
'action' => 'login'
],
'cookies' => true
]
);
$xml = $response;
echo $xml;
Sehen http://guzzle.readthedocs.org/en/latest/quickstart.html#post-requests, http://curl.haxx.se/docs/manpage.html#-F
Bearbeiten:
Einfach hinzufügen ['cookies' => true]
auf Anfragen, um das damit verbundene Auth-Cookie zu verwenden GuzzleHttp\Client()
. http://guzzle.readthedocs.org/en/latest/clients.html#cookies
$response2 = $client->get('http://website.com/otherpage/', ['cookies' => true]);
Andere Tipps
Ich hatte Probleme damit, die Antwort von @JeremiahWinsley auf einer neueren Version von Guzzle zum Laufen zu bringen, also habe ich ihren Code so aktualisiert, dass er ab Guzzle 5.x funktioniert.
Drei wesentliche Änderungen sind erforderlich
- Benutzen
form_params
anstattbody
um den Fehler zu verhindern: „Die Übergabe der Anforderungsoption „body“ als Array zum Senden einer POST-Anfrage ist veraltet.“ - Ändern der Cookies, um die zu verwenden
CookieJar
Objekt - Verwenden
->getBody()->getContents()
um das zu bekommen Hauptteil der Anfrage
Hier ist der aktualisierte Code:
$client = new \GuzzleHttp\Client();
$cookieJar = new \GuzzleHttp\Cookie\CookieJar();
$response = $client->post('http://website.com/page/login/', [
'form_params' => [
'username' => $username,
'password' => $password,
'action' => 'login'
],
'cookies' => $cookieJar
]
);
$xml = $response->getBody()->getContents();
echo $xml;
Und um in zukünftigen Anfragen weiterhin Cookies zu verwenden, geben Sie Folgendes ein cookieJar
zur Anfrage:
$response2 = $client->get('http://website.com/otherpage/', ['cookies' => $cookieJar]);
Ich hatte Probleme, die Antwort von @JeremiahWinsley und @Samsquanch für die Arbeit an einer neueren Version von Guzzle zu bekommen.Daher habe ich den Code so aktualisiert, dass er ab Guzzle 6.x funktioniert.
Guzzle 6.x.Unterlagen: http://docs.guzzlephp.org/en/stable/index.html
Hier ist der aktualisierte Code:
use GuzzleHttp\Client;
use GuzzleHttp\Cookie\CookieJar;
try {
$client = new Client();
$cookieJar = new CookieJar();
$response = $client->request('POST', 'http://website.com/page/login/', [
'form_params' => [
'username' => 'test@example.com',
'password' => '123456'
],
'cookies' => $cookieJar
]);
$response2 = $client->request('GET', 'http://website.com/otherpage/', [
'cookies' => $cookieJar
]);
if ($response2->getStatusCode() == 200) {
return $response2->getBody()->getContents();
} else {
return "Oops!";
}
} catch (\Exception $exception) {
return 'Caught exception: ', $exception->getMessage();
}