php://input 질문드립니다 채택완료
allow_url_fopen = on 으로 설정 되어 있으며 PHP Version 7.4.24 입니다
서버는 데비안 10 , nginx 로 설치되어 있네요
도메인/shop/state 라는 폴더 내에 index.php 가 있습니다
index.php 내용은
</p>
<p>$json = file_get_contents("php://input");
$POST = json_decode($json, true);</p>
<p>sql_query(" insert into xxx_test ( xx_time, cm ) values ( '".G5_TIME_YMDHIS."', '".$_SERVER['CONTENT_TYPE']."' ) ");</p>
<p> </p>
<p>sql_query(" insert into xxx_test ( xx_time, cm ) values ( '".G5_TIME_YMDHIS."', '".$_POST."' ) ");</p>
<p>
위처럼 확인 후 업체에서 데이터를 보낸 후 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 에는 아무 값도 없는걸로 나올까요
저쪽 업체에서 이쪽으로 데이터가 아무것도 인넘어 온거던지
아니면 제쪽에서 데이터를 못읽는 거든지 어쨌든 둘중 하난데 ...
위 아이디를 통해
회원정보 검증 후
</p>
<p>$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');</p>
<p>print_r($output_data);</p>
<p>
위 처럼만 동일페이지에서 아이디 받고 회원 검증만 해주고 출력만 해주면 끝 입니다.
임의로 회원검증 데이터를 처리 해주면 문제가 없는데
json으로 아이디를 받고 해당 회원이 정상 적인 회원인지 쿼리 처리 후
데이터 반환을 해야 하는데 아이디가 안들어 오는건지 읽지를 못하는건지 ..
몇시간째 돌겠네요 ㅜㅜ;;;
어떤 문제일까요??
그리고 혹시 로그나 다른 데이터가 들어가 있는지 확인해 볼수 있는 방법이 있을까요?
///////////////////////////////////////////////////////////////
아무래도 받는 쪽.. 제쪽에서 문제가 있는것 같습니다..
다른 사이트에서 curl 로
해당 url .. 그러니까
url = '도메인/shop/state'; 로 id를 전송할 때
도메인/shop/state/index.php 에서
$json = file_get_contents("php://input");
이 부분이 동작을 안하는것 같습니다;;
혹시 이유를 알수 있을까요...;;
혹시 서버 설정 에서 뭔가를 더 해줘야 하는건가요? -->
확인해 보니 이건 아닌것 같습니다;;
해당 동일 서버의 다른 사이트에서
리턴 값을 php://input 로 받는 사이트가 있는데 여기는 동작을 잘 하고 있네요;;
흠 .. 뭐가 문제인지...
////////////////////////////////////////////
혹시 테스트가 가능하신 분들은 테스트 부탁 드립니다
</p>
<p>function get_cm_curl($data){
global $g5, $config;</p>
<p> $method = "POST";
$url = '<a href="https://sp.cmake.work/shop/state/';// " target="_blank" rel="noopener noreferrer">https://sp.cmake.work/shop/state/';// </a>
$headers = array(
"content-type: application/json",
"accept-encoding: gzip"
); </p>
<p> $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); </p>
<p>
$response = curl_exec($ch);
$code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
$error = curl_error($ch);
curl_close($ch);</p>
<p> return $response;
}</p>
<p> </p>
<p> </p>
<p> </p>
<p>$body_data = array(
"StoreId" => "T0022"
);
$json = get_cm_curl($body_data);
$_POST = json_decode($json, true);</p>
<p> </p>
<p>print_r($json);</p>
<p> </p>
<p>
print_r에서 {"StoreId":null} NULL 이 나오면 안됩니다 ;;
해당서버에서 왜 값을 못받는지 이유를 알려 주시면 감사하겠습니다 ㅜㅜ;;
답변 4개
index.php에서 json처리를 하려면 보내는 쪽에서 json데이터를 보내야죠
$body_data = json_encode($body_data); //<---추가
$json = get_cm_curl($body_data);
답변에 대한 댓글 1개
댓글을 작성하려면 로그인이 필요합니다.
받는 쪽이면 아래처럼 데이터 저장해서 파일 살펴보세요.
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
답변에 대한 댓글 3개
줄바꿈만 있고 아이디 값은 하나도 없습니다.. ㅜㅜ
아.. 이해를 못하겠네요..
폴더권한도 755 707 777 로 다 줘 봤고 ...
서버에 포트도 열어줄건 다 열어 놓은것 같은데..
도대체 뭐가 문제인지 모르겠습니다 ^^;;;
댓글을 작성하려면 로그인이 필요합니다.
테스트 하시면서 헷갈리실것 같아 https://sp.cmake.work/shop/state/" target="_blank">https://sp.cmake.work/shop/state/ 의 내용을 다시 수정했습니다
</p>
<p>$json = file_get_contents('php://input');
$data = json_decode($json, true);</p>
<p>$StoreId = 'NULL';
if(isset($data['StoreId'])){
$StoreId = $data['StoreId'];
}</p>
<p>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"]."' ) ");</p>
<p>/* $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}' ) "); */</p>
<p>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}' ) ");</p>
<p>Header('Content-Type: application/json');
print_r($output_data);</p>
<p>
댓글을 작성하려면 로그인이 필요합니다.
https://sp.cmake.work/shop/state/ 에 직접 접속, 아래처럼 출력됩니다.
{"StoreId":null}
{"ResultCode":"0000","ResultMessage":"성공","StoreId":"T0022","StoreName":"테스트매장","UseYN":"Y"}</p>
<p>
애초에 잘못된 결과값이라 json_decode()가 되지 않으니 CMAKE에 요청해야겠네요.
업체에서 본인들은 문제 없다, 로그 잘 찍힌다, 수정할 것 없다 그러면 그냥 아래처럼 잘라쓰면 되겠네요.
</p>
<p>$json = get_cm_curl($body_data);
list(, $json) = explode('
', $json, 2);
$res = json_decode($json, true);
print_r($res);</p>
<p>
답변에 대한 댓글 1개
아이디를 확인 후 정보가 확인되면 성공값이 그렇게 나와야 한다는 예제 값입니다 ^^;
헷갈리실것 같아 https://sp.cmake.work/shop/state/ 내용을 수정했습니다
댓글을 작성하려면 로그인이 필요합니다.
답변을 작성하려면 로그인이 필요합니다.
로그인