PHP를 사용하여 JSON POST 읽기
이 질문을 올리기 전에 여러 번 둘러보았기 때문에 다른 투고에 게재되어 있다면 사과드리며, 두 번째 질문이기 때문에 이 질문의 형식이 틀렸다면 사과드립니다.
Post 값을 가져와 JSON 인코딩된 어레이를 반환해야 하는 매우 간단한 웹 서비스를 만들었습니다.컨텐츠 타입의 애플리케이션/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") 등 여러 가지 방법을 시도해 보았습니다만, 조금 어두운 곳에서 촬영하고 있었습니다.
어떤 도움이라도 주시면 감사하겠습니다.
고마워, 스티브
마이클의 도움에 감사한다.그것은 확실한 진전이었다.그 포스트를 메아리쳤을 때 나는 적어도 응답을 얻었다...아무리 그것이 무효라도.
최신 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');
. 한 번만 호출해야 합니다.
안녕하세요, 이것은 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
'programing' 카테고리의 다른 글
null로 정의된 'metaDataSourceAdvisor' 빈을 등록할 수 없습니다. (0) | 2023.03.26 |
---|---|
변수가 angularjs 약속인지 알 수 있는 방법이 있나요? (0) | 2023.03.26 |
Spring Boot 2.2.0에서의 x-forwarded 헤더에 대처하는 방법(역프록시 배후에 있는 Spring Web MVC) (0) | 2023.03.26 |
Angular 서비스가 상태를 가져야 합니까? (0) | 2023.03.21 |
아이폰의 JSON 및 코어 데이터 (0) | 2023.03.21 |