• 当AngularJS POST方法碰上PHP


    问题描述

    怎么POST过去给PHP都收不到资料?

    $_POST方法取不到正确的传入值!

    原理说明

    AngularJS这套framework使用的AJAX方法中,资料传递的格式为JSON,送出去的header

    Content-Type: application/json

    而非JQuery 或是HTML form 送出的

    multipart/form-data

    application/x-www-form-urlencoded

    解决办法

    1. AngularJS 配合,去把请求的header 改成PHP 能够接受的

    2. PHP 配合,改成接受JSON 格式的请求

    我个人比较倾向解决办法2(以JSON沟通为主),JSON格式在前后端的沟通上有着很好的弹性,前端包装,​​后端收到资料轻松的拆解。

    先说办法1 的解法,首先要把预设值改掉

    复制代码
    复制代码
    复制代码
    //替换成自己的模组名称后使用config设定header
    angular.module("YourAppModule", ["SomeModule"]).config(function($httpProvider) {
      $httpProvider.defaults.headers.put['Content-Type'] =
        'application/x-www-form-urlencoded';
      $httpProvider.defaults.headers.post['Content-Type'] =
        'application/x-www-form-urlencoded';
    });
    复制代码
    复制代码
    复制代码

    如上解法

    但是这样只会让POST方法中,传资料的栏位,变成一次送出1团,而且是无属性栏位只有的一团!(就是JSON字串)

    所以要

    用AngularJS 的方法自己写一个中间层(interceptor)来打包请求/回应

    复制代码
    复制代码
    复制代码
    $httpProvider.interceptors.push(['$q', function($q) {
      return {
        request: function(config) {
          if (config.data && typeof config.data === 'object') {
              //请求在这边做处理,下方针对请求的资料打包
            config.data = serialize(config.data);
            //serialize 序列化的程式码可以参考下方
          }
            return config || $q.when(config);
        }
      };
    }]);
    复制代码
    复制代码
    复制代码

    ref: 参考 <<推荐一读

    复制代码
    复制代码
    复制代码
    var serialize = function(obj, prefix) {
        var str = [];
        for(var p in obj) {
            var k = prefix ? prefix + "[" + p + "]" : p, v = obj[p];
            str.push(typeof v == "object" ? serialize(v, k) : encodeURIComponent(k) + "=" + encodeURIComponent(v));
          }
        return str.join("&");
    }
    复制代码
    复制代码
    复制代码

    ref: 参考

    如此一来,PHP 在后端的部分可以完全不用修改,就接上啰!

    虽然有点多此一举,但是从这可以知道,AngularJS 有interceptor 可以来包装请求/回应这件事的设计其实还满不错的说~

    针对无登入或任何伺服器回应事件,前端网页需要做跳转还是其他处理时有个中控管理的机制,减少在其他方法的判断与code 的维护

    接下来是办法2

    不改动到前端,对后端PHP做一点修改

    $content_type_args = explode(';', $_SERVER['CONTENT_TYPE']);
    if ($content_type_args[0] == 'application/json')
      $_POST = json_decode(file_get_contents('php://input'),true);

    ref: 参考

    在使用$_POST方法前或档案开头处,补上这三行就OK,与以往开发无两样!

    原理就是把前端传过来的JSON 做parsing 配给$_POST ,搞定

    此文转载!

  • 相关阅读:
    Algebra, Topology, Differential Calculus, and Optimization Theory For Computer Science and Machine Learning 第4章 读书笔记(待更新)
    Algebra, Topology, Differential Calculus, and Optimization Theory For Computer Science and Machine Learning 第3章 读书笔记(待更新)
    Algebra, Topology, Differential Calculus, and Optimization Theory For Computer Science and Machine Learning 第1,2章 读书笔记(待更新)
    Tkinter的Message组件
    Git 实操/配置/实践
    mysq5.7.32-win安装步骤
    行为型模式之模板方法
    结构型模式之组合模式
    结构型模式之享元模式
    结构型模式之外观模式
  • 原文地址:https://www.cnblogs.com/wenJiaQi/p/6241833.html
Copyright © 2020-2023  润新知