developer tip

PHP를 사용하여 JSON POST 읽기

copycodes 2021. 1. 6. 08:31
반응형

PHP를 사용하여 JSON POST 읽기


나는이 질문을 게시하기 전에 많이 둘러 보았으므로 다른 게시물에 있으면 사과하고 이것은 여기에 대한 두 번째 질문 일뿐 이므로이 질문의 형식을 올바르게 지정하지 않으면 사과드립니다.

게시물 값을 가져와 JSON 인코딩 배열을 반환해야하는 정말 간단한 웹 서비스가 있습니다. 콘텐츠 유형의 application / json으로 양식 데이터를 게시해야한다는 말을 들었을 때까지 모두 잘 작동했습니다. 그 이후로 웹 서비스에서 값을 반환 할 수 없으며 게시물 값을 필터링하는 방법과 확실히 관련이 있습니다.

기본적으로 로컬 설정에서 다음을 수행하는 테스트 페이지를 만들었습니다.

$curl = curl_init();
curl_setopt($curl, CURLOPT_CUSTOMREQUEST, "POST");                                                                     
curl_setopt($curl, CURLOPT_POSTFIELDS, $data);                                                                  
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);                                                                      
curl_setopt($curl, CURLOPT_HTTPHEADER, array(                                                                          
    'Content-Type: application/json',                                                                                
    'Content-Length: ' . strlen($data))                                                                       
);
curl_setopt($curl, CURLOPT_URL, 'http://webservice.local/');  // Set the url path we want to call
$result = curl_exec($curl);

//see the results
$json=json_decode($result,true);
curl_close($curl);
print_r($json);

웹 서비스에서 나는 이것을 가지고 있습니다 (일부 기능을 제거했습니다)-

<?php

header('Content-type: application/json');

/* connect to the db */
$link = mysql_connect('localhost','root','root') or die('Cannot connect to the DB');
mysql_select_db('webservice',$link) or die('Cannot select the DB');

if(isset($_POST['action']) && $_POST['action'] == 'login') {
    $statusCode = array('statusCode'=>1, 'statusDescription'=>'Login Process - Fail');
    $posts[] = array('status'=>$statusCode);
    header('Content-type: application/json');
    echo json_encode($posts);

    /* disconnect from the db */
}
@mysql_close($link);

?>

기본적으로 $ _POST 값이 설정되지 않았기 때문이라는 것을 알고 있지만 $ _POST 대신 넣어야하는 것을 찾을 수 없습니다. json_decode ($ _ POST), file_get_contents ( "php : // input") 및 기타 여러 가지 방법을 시도했지만 어둠 속에서 촬영했습니다.

어떤 도움이라도 대단히 감사하겠습니다.

고마워, 스티브

도움을 주셔서 감사합니다. Michael은 확실히 한 걸음 나아갔습니다. 이제 게시물을 반향 할 때 최소한 답변을 받았습니다.

업데이트 된 CURL-

  $curl = curl_init();
  curl_setopt($curl, CURLOPT_HTTPHEADER, array('Content-Type: application/json')); 
  curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST"); 
  curl_setopt($curl, CURLOPT_URL, 'http://webservice.local/');  
  curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
  curl_setopt($curl, CURLOPT_POSTFIELDS, json_encode($data));

데이터가 게시 된 페이지의 PHP 업데이트-

$inputJSON = file_get_contents('php://input');
$input= json_decode( $inputJSON, TRUE ); //convert JSON into array

print_r(json_encode($input));

내가 적어도 말했듯이 나는 빈 페이지를 반환하기 전에 지금 응답을 봅니다.


비어 $_POST있습니다. 웹 서버에서 json 형식의 데이터를 보려면 원시 입력을 읽은 다음 JSON 디코딩으로 구문 분석해야합니다.

다음과 같은 것이 필요합니다.

$json = file_get_contents('php://input');
$obj = json_decode($json);

또한 JSON 통신 테스트를위한 잘못된 코드가 있습니다.

CURLOPT_POSTFIELDS지시 curl대로 매개 변수를 인코딩합니다 application/x-www-form-urlencoded. 여기에 JSON 문자열이 필요합니다.

최신 정보

테스트 페이지의 PHP 코드는 다음과 같아야합니다.

$data_string = json_encode($data);

$ch = curl_init('http://webservice.local/');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
curl_setopt($ch, CURLOPT_POSTFIELDS, $data_string);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
        'Content-Type: application/json',
        'Content-Length: ' . strlen($data_string))
);

$result = curl_exec($ch);
$result = json_decode($result);
var_dump($result);

또한 웹 서비스 페이지에서 라인 중 하나를 제거해야합니다 header('Content-type: application/json');. 한 번만 호출해야합니다.


안녕하세요 이것은 curl을 사용하여 json 형식으로 응답하는 일부 무료 IP 데이터베이스 서비스에서 IP 정보를 얻는 이전 프로젝트의 스 니펫입니다. 도움이 될 것 같아요.

$ip_srv = array("http://freegeoip.net/json/$this->ip","http://smart-ip.net/geoip-json/$this->ip");

getUserLocation($ip_srv);

함수:

function getUserLocation($services) {

        $ctx = stream_context_create(array('http' => array('timeout' => 15))); // 15 seconds timeout

        for ($i = 0; $i < count($services); $i++) {

            // Configuring curl options
            $options = array (
                CURLOPT_RETURNTRANSFER => true, // return web page
                //CURLOPT_HEADER => false, // don't return headers
                CURLOPT_HTTPHEADER => array('Content-type: application/json'),
                CURLOPT_FOLLOWLOCATION => true, // follow redirects
                CURLOPT_ENCODING => "", // handle compressed
                CURLOPT_USERAGENT => "test", // who am i
                CURLOPT_AUTOREFERER => true, // set referer on redirect
                CURLOPT_CONNECTTIMEOUT => 5, // timeout on connect
                CURLOPT_TIMEOUT => 5, // timeout on response
                CURLOPT_MAXREDIRS => 10 // stop after 10 redirects
            ); 

            // Initializing curl
            $ch = curl_init($services[$i]);
            curl_setopt_array ( $ch, $options );

            $content = curl_exec ( $ch );
            $err = curl_errno ( $ch );
            $errmsg = curl_error ( $ch );
            $header = curl_getinfo ( $ch );
            $httpCode = curl_getinfo ( $ch, CURLINFO_HTTP_CODE );

            curl_close ( $ch );

            //echo 'service: ' . $services[$i] . '</br>';
            //echo 'err: '.$err.'</br>';
            //echo 'errmsg: '.$errmsg.'</br>';
            //echo 'httpCode: '.$httpCode.'</br>';
            //print_r($header);
            //print_r(json_decode($content, true));

            if ($err == 0 && $httpCode == 200 && $header['download_content_length'] > 0) {

                return json_decode($content, true);

            } 

        }
    }

json을 헤더에 넣는 대신 매개 변수에 json을 넣고 보낼 수 있습니다.

$post_string= 'json_param=' . json_encode($data);

//open connection
$ch = curl_init();

//set the url, number of POST vars, POST data
curl_setopt($ch,CURLOPT_POST, 1);
curl_setopt($ch,CURLOPT_POSTFIELDS, $post_string);
curl_setopt($curl, CURLOPT_URL, 'http://webservice.local/');  // Set the url path we want to call

//execute post
$result = curl_exec($curl);

//see the results
$json=json_decode($result,true);
curl_close($curl);
print_r($json);

서비스 측에서는 json 문자열을 매개 변수로 가져올 수 있습니다.

$json_string = $_POST['json_param'];
$obj = json_decode($json_string);

그런 다음 변환 된 데이터를 개체로 사용할 수 있습니다.

참조 URL : https://stackoverflow.com/questions/19004783/reading-json-post-using-php

반응형