为什么我无法从JSON.stringify POST数据中获得$ this-> post()值

时间:2019-12-09 05:36:21

标签: json rest codeigniter post stringify

我在CodeIgniter框架中创建了一个简单的RESTful Web服务,作为我学生的示例项目。

我的API函数之一出现问题,如下所述:

  public function newmember_post()
  {
    $data = json_decode($this->post()[0], true);     // <-- point of my problem

    $ok = $this->guests_model->insertMember($data);

    if( $ok ) {
      $this->response( ['status'=>'OK', 'member_ID'=> $ok ], 200 );
    } else {
      $this->response( ['status'=>'Failed'], 500 );
    }
  }

当我尝试获取POST数据项时

  $nama = $this->post('nama);
  $alamat = $this->post('alamat');
  ...

我对所有数据项都有null值。

当我尝试var_dump( $this->post() )时,我已经知道了:

array(1) {
  [0]=>
  string(139) "{"nama":"Devi Chung","alamat":"Jl. Baji Ateka 20","kota":"Makassar","negara":"ID","kodepos":"90131","telepon":"871555","hp":"081234567890"}"
}

// it's a fake identity, no problem

POST数据变成一个数组,所以我获取POST数据的解决方案是这样的

$data = json_decode($this->post()[0], true);

我正在处理的问题是什么,所以我无法使用$this->post()

正常获取POST数据。

在前端,我使用JavaScript Promise进行数据POST的API请求

const endpoint_url = 'http://my.services.web/api';

function newMemberSave(){
  var new_member = {
    'nama': document.getElementById("nama").value,
    'alamat': document.getElementById("alamat").value,
    'kota': document.getElementById("kota").value,
    'negara': document.getElementById("negara").value,
    'kodepos': document.getElementById("kodepos").value,
    'telepon': document.getElementById("telepon").value,
    'hp': document.getElementById("handphone").value
  }

  fetch( endpoint_url + "/guests/newmember", {
    method: 'POST',
    body: JSON.stringify(new_member)      // <-- point of my problem
  } )
    .then(status)
    .then(json)
    .then(function(data) {
      console.log(data);
      if( data.status == 'OK' ){
        alert( "New member saved");
      } else {
        alert( "Save data failed, try again");
      }
    })
    .catch(error);
}

为了使我更容易处理API响应,我做了这些功能

function status(response) {
  if (response.status !== 200) {
    console.log("Error : " + response.status);
    return Promise.reject(new Error(response.statusText));
  } else {
    return Promise.resolve(response);
  }
}

function json(response) {
  return response.json();
}

function error(error) {
  console.log("Error : " + error);
}

如果我不使用JSON.stringify,则后端的POST数据为空。

如果我添加一个Content-Type: application/json标头,也会收到错误405(不允许使用方法)

1 个答案:

答案 0 :(得分:0)

您需要在两者之间输入“ input”,请尝试以下操作

    $nama = $this->input->post('nama);
    $alamat = $this->input->post('alamat');