zoukankan      html  css  js  c++  java
  • 当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 ,搞定

    此文转载!

  • 相关阅读:
    Aurora 数据库支持多达五个跨区域只读副本
    Amazon RDS 的 Oracle 只读副本
    Amazon EC2 密钥对
    DynamoDB 读取请求单位和写入请求单位
    使用 EBS 优化的实例或 10 Gb 网络实例
    启动 LAMP 堆栈 Web 应用程序
    AWS 中的错误重试和指数退避 Error Retries and Exponential Backoff in AWS
    使用 Amazon S3 阻止公有访问
    路由表 Router Table
    使用MySQLAdmin工具查看QPS
  • 原文地址:https://www.cnblogs.com/wenJiaQi/p/6241833.html
Copyright © 2011-2022 走看看