2017-02-20 5 views
1

Я хочу получить данные JSON через REST API с помощью PHP cURL.Извлечь JSON через REST API с помощью PHP cURL

Использование PHP кода в этой должности, я смог обойти страницу Spring Security с 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 

Как я могу принести JSON, учитывая вышеуказанные варианты Curl?

+0

Когда вы говорите «результат», вы имеете в виду, что это то, что вы извлекаете из '$ result'? –

+0

Да, это результат результата $ result в моем коде. Я только что использовал его из других источников. –

ответ

1

Почему вы настраиваете заголовок файла cookie вручную, когда уже используете файл cookie и cookiejar? Это не нужно.

Также подозрительно, что вы получаете заголовок setcookie, возможно, сервер не принимает файл cookie сеанса, который вы отправляете.

Кроме того, почему вы не игнорируете недействительный SSL по второму запросу?

И, наконец, почему вы не отправляете одного и того же агента пользователя по второму запросу?

Я думаю, что если вы устраните эти проблемы, вы увидите ожидаемое поведение.

+0

Я не советую, просто помогая устранять неполадки. Обратите внимание, что первый запрос работает, а второй - нет. Первый - игнорирование SSL, поэтому я предлагаю попробовать это. В вопросе вы можете прочитать, что он запускает это на 192.168.100.100, у которого IMHO вряд ли будет иметь действительный сертификат SSL. – mevdschee

+0

Я получил его, чтобы работать после нескольких настроек. Чтобы получить JSESSIONID, вам нужно что-то вроде CURLOPT_COOKIESESSION, установленное в true. И так как старый jsessionid сохраняется в файле cookie2.txt, я снова вызывал его как идентификатор на сайт-референт. –

+0

Из-за любезности сообщества, пожалуйста, добавьте свое решение и примите его в качестве ответа. Спасибо. – mevdschee

Смежные вопросы