2017-02-20 48 views
1

PHP cURLを使用してREST API経由でJSONデータを取得します。この記事ではPHPのコードを使用してPHP cURLを使用してREST API経由でJSONを取得

、私はURLと春のセキュリティページをバイパスすることができました:

https://<host>/appserver/j_spring_security_check 

しかし、JSONはこのURL内に存在し、私はそれを取得したい:

https://<host>/appserver/portal/api/1.0/apps 

これは私が自動的にログインするのに使ったPHPコードですが、file_get_contents(url)を使ってみましたが、失敗しました。以下のコードだけがログインを確認するために働いていました。

<?php 
function login(){ 
    $headers[]  = "Accept: */*"; 
    $headers[]  = "Connection: Keep-Alive"; 
    $headers[]  = "Content-type: application/x-www-form-urlencoded;charset=UTF-8"; 
    $data   = "j_username=admin&j_password=demoserver"; 
    $data   = rtrim($data, "&"); 
    global $sessionid; 
    $sessionid  = dirname(__FILE__).'/cookie2.txt' 
    $ch     = curl_init(); 
    $options = array(
     CURLOPT_REFERER    => "https://<host>/appserver/portal/login", 
     CURLOPT_HTTPHEADER   => $headers, 
     CURLOPT_COOKIEFILE   => $sessionid, 
     CURLOPT_COOKIEJAR   => $sessionid, 
     CURLOPT_URL     => "https://<host>/appserver/j_spring_security_check", 
     CURLOPT_SSL_VERIFYHOST  => 0, 
     CURLOPT_SSL_VERIFYPEER  => false, 
     CURLOPT_POST    => true, 
     CURLOPT_POSTFIELDS   => $data, 
     CURLOPT_HEADER    => true, 
     CURLOPT_USERAGENT   => 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:51.0) Gecko/20100101 Firefox/51.0'); 
    curl_setopt_array($ch, $options); 
    $content   = curl_exec($ch); 
    curl_close($ch); 
} 
login(); 
$text = file_get_contents($sessionid); 
preg_match('/\w{32}/u', $text, $match); 
$jsession = implode($match); 

    $headers1[]   = "Accept: */*"; 
    $headers1[]   = "Connection: Keep-Alive"; 
    $headers1[]   = "Content-type: application/json"; 
    $headers1[]   = "Cookie: JSESSIONID=".$jsession; 
$url = 'https://<host>/appserver/portal/api/1.0/apps'; 
$ch2 = curl_init(); 
curl_setopt($ch2, CURLOPT_URL, $url); 
curl_setopt($ch2, CURLOPT_HTTPHEADER, $headers1); 
curl_setopt($ch2, CURLOPT_RETURNTRANSFER, 1); 
curl_setopt($ch2, CURLOPT_COOKIEFILE, $sessionid); 
curl_setopt($ch2, CURLOPT_COOKIEJAR, $sessionid); 
curl_setopt($ch2, CURLOPT_HTTPGET, 1); 
$result = curl_exec($ch2); 
curl_close($ch2); 
// var_dump(json_decode($result, true)); 
$output = json_decode ($result); 

これは、PHPコードの実行後に結果である:

HTTP/1.1 302 Found Date: Fri, 17 Feb 2017 03:59:00 GMT 
Server: Apache/2.2.26 (Unix) mod_ssl/2.2.25 OpenSSL/1.0.1e mod_jk/1.2.37 
Set-Cookie: JSESSIONID=DB7139F7B8EE30F868A8392A4BF15523; Path=/appserver/; HttpOnly 
Location: https://192.168.100.100:444/appserver/portal/welcome 
Content-Length: 0 
Access-Control-Allow-Origin: * 
Keep-Alive: timeout=5, max=100 
Connection: Keep-Alive 
Content-Type: text/plain 

私は上記のcURLオプション与えられたJSONを取得するにはどうすればよいですか?

+0

"result"と言うと、これは '$ result'から取得したものですか? –

+0

はい、それは私のコードで$ resultの出力でした。私はちょうど他のソースからそれを活用した。 –

答えて

1

cookieとcookiejarを使用しているときに、なぜ手動でクッキーヘッダーを設定していますか?それは必要ではありません。

また、setcookieヘッダーを受け取った疑いがあります。おそらく、サーバーが送信しているセッションCookieを受け入れていない可能性があります。

また、2番目のリクエストで無効なSSLを無視しないのはなぜですか?

最後に、2番目のリクエストで同じユーザーエージェントを送信しないのはなぜですか?

これらの問題を修正すると、予想される動作が表示されるようです。

+0

私はそれをアドバイスしていない、トラブルシューティングに役立つ。最初のリクエストは機能し、2番目のリクエストは機能しません。最初のものはSSLを無視しているので、これを試してみることをお勧めします。質問では、彼はこれを192.168.100.100で実行していますが、IMHOは有効なSSL証明書を持っていない可能性があります。 – mevdschee

+0

私はそれをいくつかの微調整の後に働かせました。 JSESSIONIDを取得するには、CURLOPT_COOKIESESSIONをtrueに設定する必要があります。そして古いjsessionidがcookie2.txtに保存されているので、私はrefererサイトのIDとして再度それを呼び出しました。 –

+0

コミュニティの皆様のおかげで、あなたのソリューションを追加し、それを答えとして受け入れてください。ありがとうございました。 – mevdschee

関連する問題