dsfs64664 2017-12-19 12:00
浏览 68
已采纳

在Angular 4调用的CodeIgniter API中,input-> post和$ _POST是空的,在angular 4中发出post请求的正确方法是什么

This is the first time I'm making a post method request from Angular to CodeIgniter rest API.

postUsertask(Userid,TaskName)
  {
    let body ={
      userid:Userid, taskname:TaskName
    };  
    console.log(body);
    return this.http.post("http://localhost/ci-abc/api/add_task",JSON.stringify(body) )
    .map(res => res.json());
  }

API method in codeigniter:

function add_task_post()
{
    $obj=json_decode(file_get_contents('php://input'));
    $taskname = $obj->taskname;
    $userid = $obj->userid;
    if (!$taskname || !$userid) {
        $this->response("Enter taskname and userid to add", 400);
    } else

        $result = $this->todo_model->add_task($taskname, $userid);

    if ($result === 0) {
        $this->response("Task could not be added. Try again.", 404);
    } else {
        $this->response("success", 200);
    }
}

Had to include to access the data

$obj=json_decode(file_get_contents('php://input'));

Because the $this->input->post and $_POST were empty and the data recieved from angular was an object so had to be accessed with -> notation. I am curious that this is not the right and ethical way to do this. Also when I didn't put JSON.stringify it gave me Cross Origin Request blocked error so that's why I put it. How should I make POST and PUT request in angular4 to rest API in CodeIgniter?

How do I get rid of CORS error which doesn't let me call the API method, if I can get rid of CORS error then I could also remove JSON.stringify which will send the data as it is and I believe the data should be accessed via input->post or $_POST.

EDIT 2: These sort of errors while making POST PUT and DELETE API call.

Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at http://localhost/ci-abc/api/del_task?taskid=34. (Reason: CORS preflight channel did not succeed)

  • 写回答

1条回答 默认 最新

  • douzhan5058 2017-12-20 08:10
    关注

    EDIT (Perfect Solution):

    Found out that the formdata object approach was deprecated so I just included a header in options and included in the API call http.post method which works fine and is much better solution.

    constructor(public http:Http) { 
    let headers = new Headers();
        headers.append('Content-Type', 'application/json');
        let options = new RequestOptions({ headers: headers });}
    
    createUser(userName)
      {
        let body = { username:userName};
        return this.http.post("http://localhost/ci-abc/api/create_user",body,this.options)
        .map(res => res.json());
      }
    

    Deprecated approach (Works but deprecated/not usual practice):

    Took few hours but found the solution, I created body as a new formdata object, appended parameters to it as key and their values and it worked fine now I am retrieving through $this->input->post.

      let body = new FormData;
        body.append('userid', Userid);
        body.append('taskname', TaskName);
        console.log(body);
        return this.http.post("http://localhost/ci-abc/api/add_task",body)
        .map(res => res.json());
    

    Using these headers in the constructor of my codeigniters API controller

    header("Access-Control-Allow-Origin: *");
    header('Access-Control-Allow-Headers: Origin, X-Requested-With, Content-Type, Access-Control-Allow-Origin');
    header('Access-Control-Allow-Methods: POST, GET, OPTIONS, PUT, DELETE');
    

    API method:

     function add_task_post()
        {
            $userid = $this->input->post('userid');
            $taskname = $this->input->post('taskname');
    
            if (!$taskname || !$userid) {
                $this->response("Enter taskname and userid to add", 400);
            } else
                $result = $this->todo_model->add_task($taskname, $userid);
            if ($result === 0) {
                $this->response("Task could not be added. Try again.", 404);
            } else {
                $this->response("success", 200);
            }
        }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 买了个传感器,根据商家发的代码和步骤使用但是代码报错了不会改,有没有人可以看看
  • ¥15 关于#Java#的问题,如何解决?
  • ¥15 加热介质是液体,换热器壳侧导热系数和总的导热系数怎么算
  • ¥15 想问一下树莓派接上显示屏后出现如图所示画面,是什么问题导致的
  • ¥100 嵌入式系统基于PIC16F882和热敏电阻的数字温度计
  • ¥15 cmd cl 0x000007b
  • ¥20 BAPI_PR_CHANGE how to add account assignment information for service line
  • ¥500 火焰左右视图、视差(基于双目相机)
  • ¥100 set_link_state
  • ¥15 虚幻5 UE美术毛发渲染