php
  • curl
  • 2013-09-16 2 views 0 likes 
    0

    Я пытался получить json и некоторые элементы заголовка, используя этот код: И я смог распечатать нужные мне детали, но кажется, что я не могу на самом деле "взять их.Как получить json строку и элемент заголовка с помощью cURL

    $url = 'http://192.168.254.211:8080/sampleOnCurl/auth/login'; 
    $initCurl = curl_init($url); 
    curl_setopt_array($initCurl, 
        array(
         CURLOPT_URL => $url, 
         CURLOPT_POST => true, 
         // CURLOPT_NOBODY => true, 
         CURLOPT_RETURNTRANSFER => true, 
         // CURLOPT_FOLLOWLOCATION => true, 
         CURLOPT_POSTFIELDS => $loginData, 
         CURLOPT_HEADER => true, 
         CURLOPT_HTTPHEADER => array(
          'Content-Type: application/json', 
          'jrr: 7ffed684cbe1fc085b7b47dc4e508e99a5effee9', 
          'slave: 01bdfcc20777907712e97f7bd2faeb978584f317', 
          'spoil: ' .$timeStamp 
         ) 
        ) 
    ); 
    $result = curl_exec($initCurl); 
    print_r($result); 
    //prints jrr, slave, spoil 
    $result = json_decode($result); 
    // $header = curl_getinfo($initCurl); 
    curl_close($initCurl); 
    

    и это то, что я получаю

    HTTP/1.1 200 OK 
    Server: Apache-Coyote/1.1 
    jrr: 2e278657295bdfae2bc49b0bc6ad38363e9b149b 
    slave: d77985811796708b89471b4d29a904b224d41dde 
    spoil: 20130916222842701 
    Content-Type: application/json;charset=UTF-8 
    Transfer-Encoding: chunked 
    Date: Mon, 16 Sep 2013 14:28:42 GMT 
    
    {"true":null} 
    

    Я хочу, чтобы получить {"true":null} и преобразовать его в массив, чтобы проверить, если индекс true и получить jrr, slave и spoil значения .. без использования get method.

    Строка, которая напечатана, похоже, не находится в json. Я предполагаю, что проблема в моих вариантах завитка. Что я могу пропустить?

    Вот что мне нужно сделать: получить JSON {"true":null} получить заголовок ответа: Дж.Р.Р., раб, испортит избегать использования Получа

    благодаря

    +0

    Вы можете использовать 'HEAD' для получения заголовков (сервер будет интерпретировать его как' GET', но не будет отправлять контент в ответ). Но чтобы получить JSON, вы должны использовать 'GET' или' POST'. –

    +0

    Я не могу использовать его, если он «GET», потому что сервер вернет мне ошибку, только разрешен «POST». На этой заметке конкретно, что такое 'HEAD'? 'Но для того, чтобы получить JSON, вам нужно использовать GET или POST', пожалуйста, проконсультируйтесь? поскольку вы можете видеть, что ответ, который я получаю, похоже, не в формате JSON .. и я не могу получить к ним доступ, используя '$ result ['jrr']' – OneScrewLoose

    +0

    '{" true ": null}' является действительным JSON, что с этим связано? Вы также можете использовать 'json_decode ($ result, true)' для принудительного форматирования массива. 'HEAD' - это следующий метод запроса (например,' POST' или 'GET'), он получает только заголовки, но вы сказали, что разрешен только« POST », поэтому вы можете забыть об этом в этом случае. –

    ответ

    1

    Как о чем-то вроде этого:.

    list($headers, $body) = explode("\r\n\r\n", $result, 2); 
    
    function parseSimpleHeaders($headers) { 
        $lines = explode("\r\n", $headers); 
        $parsed = array(); 
        foreach($lines as $line) { 
         $colon = strpos($line, ':'); 
         if($colon !== false) { 
          $name = trim(substr($line, 0, $colon)); 
          $value = trim(substr($line, $colon + 1)); 
          $parsed[$name] = $value; 
         } 
        } 
        return $parsed; 
    } 
    
    $headers = parseSimpleHeaders($headers); 
    $json = json_decode($body); 
    
    echo $headers['jrr'], "\n"; // 2e278657295bdfae2bc49b0bc6ad38363e9b149b 
    echo $headers['slave'], "\n"; // d77985811796708b89471b4d29a904b224d41dde 
    echo $headers['spoil'], "\n"; // 20130916222842701 
    var_dump($json); // object(stdClass)#1 (1) { ["true"] => NULL } 
    

    NB Там в http_parse_headers() функции в pecl_http, но я включил свою упрощенную версию parseSimpleHeaders() в случае, если она не установлена.

    +0

    большое спасибо. Я на самом деле думал, что нет необходимости создайте функцию для синтаксического анализа заголовка и тела как 'Request :: header', но я думаю, что это не работает, когда сервер включен, так как запрашиваемый заголовок является объявлением, а не стандартным. благодаря – OneScrewLoose

    0

    Вы получаете содержание ответа и заголовок в переменном $result, поэтому вы не можете разобрать его напрямую.

    Для того, чтобы заставить его работать взорваться $result используя две новые линии.

    $result = explode("\n\n", $result); 
    

    и теперь вы можете получить доступ к заголовкам строки по $result[0] и содержанию ответа на $result[1] (и разобрать его с помощью json_decode($result[1], true)

    +0

    Я просто попытался использовать '$ result = explode ('\ n \ n', $ result);' $ result1 = json_decode ($ result [1], true); '\t' print_r ($ result1); 'но это дает мне ошибку неопределенного смещения – OneScrewLoose

    +0

    @ shin-shan Вы должны использовать' '' not '' '. Только в первом случае PHP будет интерпретировать' \ n' как новую строку. Вы должны знать, что это базовые знания –

    +0

    Извините, что моя ошибка .., но результат будет таким же 'Undefined offset' – OneScrewLoose

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