| 제목 | json curl 통신 중 해더를 붙이면 상대 서버에서 데이터를 받지 못합니다. | ||
|---|---|---|---|
| 카테고리 | PHP | ||
| 글쓴이 | g901 | 작성시각 | 2022/03/24 09:48:28 |
|
|
|||
|
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
네 맞습니다.
|
참고하세요.
https://yoshikixdrum.tistory.com/188