博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【转】当AngularJS POST方法碰上PHP
阅读量:6308 次
发布时间:2019-06-22

本文共 1937 字,大约阅读时间需要 6 分钟。

问题描述

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

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

原理说明

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

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设定headerangular.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 ,搞定

后记

目前我只有找到这两个还满漂亮的解法,如果还有找到更好的再补,或是麻烦留言推荐啰!

 

 


 

 

原文出处:

 

转载于:https://www.cnblogs.com/xythree/articles/3939126.html

你可能感兴趣的文章
【前台】【单页跳转】整个项目实现单页面跳转,抛弃iframe
查看>>
因为你是前端程序员!
查看>>
数据库设计中的14个技巧
查看>>
Android学习系列(5)--App布局初探之简单模型
查看>>
git回退到某个历史版本
查看>>
ecshop
查看>>
HTML5基础(二)
查看>>
在GCE上安装Apache、tomcat等
查看>>
在Mac 系统下进行文件的显示和隐藏
查看>>
ue4(c++) 按钮中的文字居中的问题
查看>>
技能点
查看>>
读书笔记《乌合之众》
查看>>
Hadoop日记Day1---Hadoop介绍
查看>>
iOS 学习资料汇总
查看>>
centos7 yum安装jdk
查看>>
Bluedroid与BluZ,蓝牙测试方法的变动(基于bludroid和BlueZ的对比)
查看>>
接口和抽象类有什么区别
查看>>
Linux 下添加用户,修改权限
查看>>
请问view controller scene,该如何删除
查看>>
bootstrap新闻模块样式模板
查看>>