개발 Q&A

제목 json curl 통신 중 해더를 붙이면 상대 서버에서 데이터를 받지 못합니다.
카테고리 PHP
글쓴이 g901 작성시각 2022/03/24 09:48:28
댓글 : 6 추천 : 0 스크랩 : 0 조회수 : 6777   RSS

PHP 7.x / CI 3.x

 

cUrl 통신으로 JSON 데이터를 POST로 주고 받는 시스템을 만들고 있습니다.

[보내는 서버]에서 JSON 데이터를 생성하고 cUrl을 통해 [받는 서버]로 전송을 하는데

[받는 서버]에서 데이터를 빈 Array 로 받습니다.

무엇이 문제인지 파악하지 못하여,

이것 저것 코드를 만져보다 보니,

[보내는 서버]에서

$headers = array(

        "Content-Type: application/json; charset=UTF-8",

        );

curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);

위 코드를 삭제하면 [받는 서버]에서 데이터를 받습니다.

다만, 받는 데이터가 Array로 받아지는데 이상한 형태로 받아집니다.

아래 코드를 첨부하오니

예상되는 문제점을 집어 주시길 부탁드립니다. ㅠㅠ

 

[보내는 서버 CODE]

$post = array(           
    'order' => 'login',           
    'data'  => array(               
        'code'     => 1234567,
        'id'       => 1234,
        'password' => 5678
    ), 
);



$url = 'https://받는서버API';
$postData = json_encode($post,JSON_UNESCAPED_UNICODE);

$headers = array(
        "Content-Type: application/json; charset=UTF-8",
);



$ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 1);
        curl_setopt($ch, CURLOPT_HEADER, 1);
        curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
        curl_setopt($ch, CURLOPT_ENCODING, 'UTF-8');
        curl_setopt($ch, CURLOPT_POST, 1);
        curl_setopt($ch, CURLOPT_POSTFIELDS, "{$postData}");
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$response = curl_exec($ch);       

curl_close($ch);

 

[받는 서버 CODE]

$str    = $this->input->post();

log_message('error','$str = '.json_encode($str,JSON_UNESCAPED_UNICODE)); // 1번

$str = json_decode($str,TRUE); // 2번


foreach ($str as $key => $var) {           
    log_message('error','$key = '.$key);           
    log_message('error','$var = '.$var);           
    $switch[$key] = (string) $var;       

}

[받는 서버]가 원래 받아야 되는 DATA 형태

{"order":"login","data":{"code":"1234567","id":"1234","password":"5678"}}

 

[받는 서버] 보내는 서버에서 CURLOPT_HTTPHEADER를 안보낼 경우 전송받은 DATA 형태

1번 log_message

log_message('error','$str = '.json_encode($str,JSON_UNESCAPED_UNICODE));
$str = {"{\"order\":\"login\",\"data\":{\"code\":\"1234567\",\"id\":\"1234\",\"password\":\"5678\"}}":"","0":""}

 

2번 에러 발생

json_decode() expects parameter 1 to be string, array given

 

[받는 서버] 보내는 서버에서 CURLOPT_HTTPHEADER를 보낼 경우

특별한 에러 발생 없이 데이터 전송 안됨

태그 JSON,CURL,HEADER
 다음글 ci-3.1.9버전에 PHP8.0 에서 에러 (7)
 이전글 다른 브라우저는 이상 없는데 ie에서 안되는 경우 (2)

댓글

변종원(웅파) / 2022/03/24 10:27:38 / 추천 1
g901 / 2022/03/24 10:33:09 / 추천 0

아... 

받을때 $this->input->post(); 가 아니라

file_get_contents('php://input'); 로 하니까 되는군요!!!

전 파일로 생성해서 보낼때만 file_get_contents를 써야 한다고 생각해버렸네요.

 

추천 주신 페이지가 이미 봤던거라 실망했었는데,

추천 주신 이유가 있겠지 하고

믿음으로 그냥 써넣어보니 바로 되네요!!

 

감사합니다!!!

복받으세요!!

 

수정내용

[받는 서버 CODE]

$str    = $this->input->post();

$str    = file_get_contents('php://input');

로 수정

'php://input' 는 뭐 다른 데이터로 안바꾸고 그대로 넣으면 됨

 

한대승(불의회상) / 2022/03/24 11:12:42 / 추천 0

ci3는 'php://input' 에 대해 

$this->input->raw_input_stream

라는 랩퍼를 제공하고 있습니다.

g901 / 2022/03/24 13:20:30 / 추천 0

한대승(불의회상) //

$this->input->raw_input_stream

음... 죄송합니다만 어떻게 사용하는 건가요? ^^;;;;;

 

g901 / 2022/03/24 13:27:58 / 추천 0

한대승(불의회상) //

 

아~ 혹시,

$str    = file_get_contents('php://input');

대신에 

$str  =  $this->input->raw_input_stream;

이렇게 사용하면 되는게 맞나요?

 

위처럼 하니 에러 없이 잘 작동하고 있습니다!!!

감사합니다!!!

한대승(불의회상) / 2022/03/24 13:45:48 / 추천 0
네 맞습니다.