php://input 질문드립니다

php://input 질문드립니다

QA

php://input 질문드립니다

본문

allow_url_fopen = on 으로 설정 되어 있으며 PHP Version 7.4.24 입니다

서버는 데비안 10 , nginx 로 설치되어 있네요

 

도메인/shop/state  라는 폴더 내에 index.php 가 있습니다

 

index.php 내용은 

 


$json = file_get_contents("php://input");
$POST = json_decode($json, true);
sql_query(" insert into xxx_test ( xx_time, cm ) values ( '".G5_TIME_YMDHIS."', '".$_SERVER['CONTENT_TYPE']."' ) ");
 
sql_query(" insert into xxx_test ( xx_time, cm ) values ( '".G5_TIME_YMDHIS."', '".$_POST."' ) ");

위처럼 확인 후 업체에서 데이터를 보낸 후 db를 확인 하면 

$_SERVER['CONTENT_TYPE']  == > "application/json;charset=UTF-8""

$POST  ==> ""  

 

위처럼 $_POST 값은 공란 입니다

 

요청을 받아야 하는 json 데이터는

{
   "StoreId": "T0022",    
}

이런식 이어야 합니다

 

그런데 업체에서 보낸  로그 값을 보면 

요청 값이

2022/02/16 07:00:51.290 [DEBUG] [05177] [apis/spiderOutApi.go:225 (OLIF/apis.SPORequestAPI)] [카드] Converted API. Path[도메인/shop/state], Body[{"StoreId":"T0022"}]

이렇게 로그가 있다는데 

 

왜 POST 에는 아무 값도 없는걸로 나올까요

 

저쪽 업체에서 이쪽으로 데이터가 아무것도 인넘어 온거던지

아니면 제쪽에서 데이터를 못읽는 거든지 어쨌든 둘중 하난데 ...

 

위 아이디를 통해

 

회원정보 검증 후

 


$body_data = array(
    "ResultCode" => "0000",
    "ResultMessage" => "성공",
    "StoreId" => "T0022",
    "Name" => "홍길동",
    "UseYN" => "Y"
);
$output_data = json_encode($body_data, JSON_UNESCAPED_UNICODE);
Header('Content-Type: application/json');
print_r($output_data);

 

위 처럼만 동일페이지에서 아이디 받고 회원 검증만 해주고 출력만 해주면 끝 입니다.

 

임의로 회원검증 데이터를 처리 해주면 문제가 없는데

json으로 아이디를 받고 해당 회원이 정상 적인 회원인지 쿼리 처리 후

데이터 반환을 해야 하는데 아이디가 안들어 오는건지 읽지를 못하는건지 ..

 

몇시간째 돌겠네요 ㅜㅜ;;;

 

 

어떤 문제일까요??

그리고 혹시 로그나 다른 데이터가 들어가 있는지 확인해 볼수 있는 방법이 있을까요?

 

 

///////////////////////////////////////////////////////////////

 

아무래도 받는 쪽.. 제쪽에서 문제가 있는것 같습니다..

다른 사이트에서 curl 로

해당 url .. 그러니까 

url = '도메인/shop/state'; 로 id를 전송할 때

도메인/shop/state/index.php  에서 

$json = file_get_contents("php://input");

 

이 부분이 동작을 안하는것 같습니다;;

 

혹시 이유를 알수 있을까요...;;

 

혹시 서버 설정 에서 뭔가를 더 해줘야 하는건가요? -->

확인해 보니 이건 아닌것 같습니다;;

해당 동일 서버의 다른 사이트에서

리턴 값을 php://input 로 받는 사이트가 있는데 여기는 동작을 잘 하고 있네요;;

 

흠 .. 뭐가 문제인지...

 

 

 

////////////////////////////////////////////

 

혹시 테스트가 가능하신 분들은  테스트 부탁 드립니다

 


function get_cm_curl($data){
    
    global $g5, $config;
    $method = "POST";
    $url = 'https://sp.cmake.work/shop/state/';// 
    
    $headers = array( 
        "content-type: application/json", 
        "accept-encoding: gzip" 
    );    
    $ch = curl_init($url); 
    $timeout = 900; // 900 Seconds = 15 Minutes     
    curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);   
    curl_setopt($ch, CURLOPT_HEADER, 0); 
    curl_setopt($ch, CURLOPT_TIMEOUT, 30); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_CUSTOMREQUEST, $method);
    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $data);      // POST DATA
    curl_setopt($ch, CURLOPT_POST, true);     
    
    $response = curl_exec($ch);
    $code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    $error = curl_error($ch);
    curl_close($ch);
    return $response;
}
 
 
 
$body_data = array(
    "StoreId" => "T0022"
);
$json = get_cm_curl($body_data);
$_POST = json_decode($json, true);
 
print_r($json);
   

 

print_r에서 {"StoreId":null} NULL 이 나오면 안됩니다 ;;

해당서버에서 왜 값을 못받는지 이유를 알려 주시면 감사하겠습니다 ㅜㅜ;;

 

 

이 질문에 댓글 쓰기 :

답변 4

index.php에서 json처리를 하려면 보내는 쪽에서 json데이터를 보내야죠

 

$body_data = json_encode($body_data); //<---추가
$json = get_cm_curl($body_data);

https://sp.cmake.work/shop/state/ 에 직접 접속, 아래처럼 출력됩니다.


{"StoreId":null}<br>{"ResultCode":"0000","ResultMessage":"성공","StoreId":"T0022","StoreName":"테스트매장","UseYN":"Y"}

애초에 잘못된 결과값이라 json_decode()가 되지 않으니 CMAKE에 요청해야겠네요.

업체에서 본인들은 문제 없다, 로그 잘 찍힌다, 수정할 것 없다 그러면 그냥 아래처럼 잘라쓰면 되겠네요.


$json = get_cm_curl($body_data);
list(, $json) = explode('<br>', $json, 2);
$res = json_decode($json, true);
print_r($res);

아.. 밑에 성공 값은 file_get_contents('php://input'); 으로 상점 아이디가 넘어 왔을 때 회원정보에서
아이디를 확인 후 정보가 확인되면 성공값이 그렇게 나와야 한다는 예제 값입니다 ^^;
헷갈리실것 같아 https://sp.cmake.work/shop/state/ 내용을 수정했습니다

테스트 하시면서 헷갈리실것 같아 https://sp.cmake.work/shop/state/ 의 내용을 다시 수정했습니다

 


$json = file_get_contents('php://input');
$data = json_decode($json, true);
$StoreId = 'NULL';
if(isset($data['StoreId'])){
    $StoreId = $data['StoreId'];
}
sql_query(" insert into xxx_test ( xx_time, cm, type, ip ) values ( '".G5_TIME_YMDHIS."', '".$_SERVER['CONTENT_TYPE']."', '아이디 json type', '".$_SERVER["REMOTE_ADDR"]."' ) ");
sql_query(" insert into xxx_test ( xx_time, cm, type, ip ) values ( '".G5_TIME_YMDHIS."', '".print_r($data, true)."' , '아이디 array - {$StoreId}', '".$_SERVER["REMOTE_ADDR"]."' ) ");
/* $body_id = array(
    "StoreId" => $StoreId
); */
/* $output_id = json_encode($body_id, JSON_UNESCAPED_UNICODE);
sql_query(" insert into xxx_test ( xx_time, cm ) values ( '".G5_TIME_YMDHIS."', '{$output_id}' ) "); */
if($StoreId == 'NULL'){
    $body_data = array(
        "ResultCode" => "400",
        "ResultMessage" => "실패",
        "StoreId" => $StoreId,
        "StoreName" => "회원정보없음",
        "UseYN" => "N"
    );
}else{
    $body_data = array(
        "ResultCode" => "0000",
        "ResultMessage" => "성공",
        "StoreId" => $StoreId,
        "StoreName" => "테스트매장",
        "UseYN" => "Y"
    );
}
/* $body_data = array(
    "StoreId" => "T00022"
);  */
$output_data = json_encode($body_data, JSON_UNESCAPED_UNICODE);
sql_query(" insert into xxx_test ( xx_time, cm ) values ( '".G5_TIME_YMDHIS."', '{$output_data}' ) ");
Header('Content-Type: application/json');
print_r($output_data);

받는 쪽이면 아래처럼 데이터 저장해서 파일 살펴보세요.

file_put_contents('./log.txt', file_get_contents('php://input').PHP_EOL, FILE_APPEND);

 

* 참고로 enctype="multipart/form-data"와 같이 사용 불가.

- https://www.php.net/manual/en/wrappers.php.php#wrappers.php.input

빈 값으로 들어 오고 있는것 같습니다..ㅜㅜ
줄바꿈만 있고 아이디 값은 하나도 없습니다.. ㅜㅜ
아.. 이해를 못하겠네요..
폴더권한도 755 707 777 로 다 줘 봤고 ...
서버에 포트도 열어줄건 다 열어 놓은것 같은데..
도대체 뭐가 문제인지 모르겠습니다 ^^;;;

답변을 작성하시기 전에 로그인 해주세요.
전체 123,531 | RSS
QA 내용 검색

회원로그인

(주)에스아이알소프트 / 대표:홍석명 / (06211) 서울특별시 강남구 역삼동 707-34 한신인터밸리24 서관 1404호 / E-Mail: admin@sir.kr
사업자등록번호: 217-81-36347 / 통신판매업신고번호:2014-서울강남-02098호 / 개인정보보호책임자:김민섭(minsup@sir.kr)
© SIRSOFT