source

$_POST에서 읽을 수 없는 Axios 게시 매개 변수

nicesource 2023. 4. 4. 21:26
반응형

$_POST에서 읽을 수 없는 Axios 게시 매개 변수

그래서 코드가 있어요.

axios({
    method: 'post',
    url,
    headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
    data: {
        json,
        type,
    }   
})  

원래 나는 보통을 가지고 있었다.axios.post헤더의 문제인 것 같아서 바꿨어요.하지만 아직 아무것도 검출되지 않았습니다.$_REQUEST도 아니다$_POST다만, 다음의 장소에서 데이터를 수신하고 있습니다.file_get_contents("php://input").

뭐가 잘못됐는지 알아?

편집

그래, 뭐가 문제인지 알 것 같아요json 객체로 게시하고 있기 때문에 php://input에서만 읽을 수 있습니다.Axios에서 일반 문자열로 변경하려면 어떻게 해야 합니까?

매뉴얼에서 (인용된 자료에 링크를 보존하지 않았습니다)

응용 프로그램/x-www-form-urlencoded 형식 사용

기본적으로는 악시오는 JavaScript 개체를 JSON에 직렬화합니다.

PHP는 JSON을 채우는 데이터 형식으로 지원하지 않습니다.$_POST.

HTML 양식에서 기본적으로 지원되는 기계 처리 가능한 형식만 지원합니다.

  • application/x-www-form-urlencoded
  • 멀티파트/폼 데이터

대신 응용 프로그램/x-www-form-urlencoded 형식으로 데이터를 보내려면 다음 옵션 중 하나를 사용합니다.

브라우저

브라우저에서는 다음과 같이 URLearchParams API를 사용할 수 있습니다.

var params = new URLSearchParams();
params.append('param1', 'value1');
params.append('param2', 'value2');
axios.post('/foo', params); 

URLearchParams는 모든 브라우저에서 지원되는 것은 아니지만 사용 가능한 polyfill이 있습니다(글로벌 환경을 polyfill 해야 합니다).

또는 QS 라이브러리를 사용하여 데이터를 인코딩할 수 있습니다.

var qs = require('qs');
axios.post('/foo', qs.stringify({ 'bar': 123 }));

또는 다른 질문에 대한 이 답변에 따라 JSON을 처리할 수 있도록 PHP를 커스터마이즈할 수도 있습니다.

var params = {
    data1: 'string',
}

axios.post(url, params).then(function(response) {
    //code here 
});

또는

axios.post(url, {data1: 'string' }).then(function(response) {
    //code here 
});

API

$_POST = json_decode(file_get_contents("php://input"),true);
echo $_POST['data1'];

만약 당신이 두 회사 사이를 바꾸기로 결정한다면, 모든 것을 쉽고 보편적으로 하기 위해서.AJAX라이브러리 또는 서버 언어.와 함께axios네이티브 JS 사용FormData.
개체에 데이터가 있는 경우 다음 항목으로 변환할 수 있습니다.FormData다음과 같습니다.

var myDataObj = {id:1, name:"blah blah"}
var formData = new FormData();


for (var key in myDataObj) {
    formData.append(key, myDataObj[key])
}

그런 다음 데이터를 전송합니다.

axios.post('/sub/process.php', formData, {
    params: { action: "update-user" },
    headers: { 'Content-Type': 'multipart/form-data' },
    baseURL: 'http://localhost',
}).then(data =>
    console.log(data)
).catch(err => {
    console.log(err)
    return null
})

주의: 다음 방법으로 정보를 전송할 수도 있습니다.paramsaxios를 사용하여 취득할 수 있습니다.$_GET베이스를 사용하고 있다는 것도 주의해 주세요.웹 페이지와 API 엔드포인트에 다른 서버가 있는 경우 URL.
그리고 그 전에 알아둬야 할 것은axios실제 요구를 송신하면, 이 요구는preflight부탁한다.프리플라이트 요구는 브라우저에 의한 CORS 내의 메커니즘으로 자원 수신처가 실제 요구를 받아들일지 여부를 확인합니다. 어쨌든, 타겟호스트가 요구를 수신하려고 하지 않는데, 요구가 송신되는 이유는 무엇입니까?

서버에 Axios 요청에 적합한 헤더가 있는지 확인해야 합니다.그렇지 않으면 프리플라이트 요구는 비호환성을 검출하여 요구를 정지합니다.

//this is if you are using different different origins/servers in your localhost, * to be update with the right address when it comes to production
header('Access-Control-Allow-Origin: *');
//this is if you are specifying content-type in your axios request
header("Access-Control-Allow-Headers: Content-Type");

보낸 할 수 되었습니다.$_POST★★★★

echo "<pre>";
print_r($_POST);
echo "</pre>";

또한 Axios를 사용하면 다양한 형식으로 데이터를 전송할 수 있습니다.다음과 같이 json을 전송할 수 있습니다.

axios.post('/sub/process.php', { id: "1", name:"blablah" }, {
    params: { action: "update-item" },
    headers: { 'Content-Type': 'application/json' },
    baseURL: 'http://localhost',
}).then(data =>
    console.log(data)
).catch(err => {
    console.log(err)
    return null
})

PHP측에서는, 다음과 같이 액세스 할 수 있습니다.

$data = json_decode(file_get_contents("php://input"),true);
echo "<pre>";
print_r($data);
echo "</pre>";

PHP std 객체 사용

PHP std 객체 구조를 사용하여 게시 변수를 가져옵니다.

클라이언트:

axios.post(url, {id: 1 , Name:'My Name' }).then(function(response) {
    console.log(response.data);
});

서버상

$obj = json_decode(file_get_contents('php://input'));   
$id = $obj->id;
$Name = $obj->Name;    

//test by returning the same values
$retObj=(object)["id"=>$id,"Name"=>$Name]
echo json_encode($retObj);

jQuery와 Axios 모두 동일한 PHP 파일을 사용합니다.

axios와 jquery 양쪽에서 투고를 수신하는 파일이 있는 경우 다음을 사용할 수 있습니다.

if($_SERVER['REQUEST_METHOD']==='POST' && empty($_POST)) {
   $_POST = json_decode(file_get_contents('php://input'),true); 
}

Axios json 직렬 게시물을 $_POST 배열로 변환합니다.

이 코드는 현재 브라우저/노드 모두에서 작동합니다.이게 더 실용적인 것 같아요.이 코드를 node.js에서 테스트하고 $_POST['param1']를 사용하여 데이터 변수를 PHP8에 전달했습니다.완벽하게 동작했습니다.

function axqs(d){
    let p = new URLSearchParams();
    Object.keys(d).forEach(function(key){
        p.append(key, this[key]);
    }, d);
    return p
}

let data = {
  'param1': 'value1',
  'param2': 'value2',
}

let p = axqs(data)
axios.post('/foo', p)

단지 나의 통찰력을 공유하고 싶었을 뿐인데, 나는 비슷한 문제에 직면했고 다음 코드 세트로 그것을 해결했다.

JS

const instructions_str = {
  login: {
    "type": "devTool",
    "method": "devTool_login",
    "data": {
        "username": "test",
        "password": "Test@the9" 
    }
  },
  tables: {
    "type": "devTool",
    "method": "devTool_get_all_tables",
    "data": ""
  }
};

const body = {
    firstName: 'Fred',
    lastName: 'Flintstone',
    name: "John",
    time: "2pm",
    instructions : JSON.stringify(instructions_str)  
};

function decodeData(data) {
  const serializedData = []

  for (const k in data) {
    if (data[k]) {
      serializedData.push(`${k}=${encodeURIComponent(data[k])}`)
    }
  }

  return serializedData.join('&')
};

const body2 = decodeData(body);

axios.post('URL', body2)
  .then(response => {
    console.log("contextApi got it", response);
  }).catch(error => {
      console.log("contextApi error.response", error.response);
  });

PHP

// set content return type
header('Content-Type: application/json');

// Setting up some server access controls to allow people to get information
header("Access-Control-Allow-Origin: *");
header('Access-Control-Allow-Methods:  POST, GET');

// This way I can check and see what I sent
$postVars_array = $_POST ?? parse_str(file_get_contents("php://input"),$postVars_array) ?? [];
echo json_encode($postVars_array);

또한 이 github 페이지는 매우 도움이 되었습니다.https://github.com/axios/axios/issues/1195

언급URL : https://stackoverflow.com/questions/41457181/axios-posting-params-not-read-by-post

반응형