PHP获取不了React Native Fecth参数的解决办法


Posted in PHP onAugust 26, 2016

话不多说,我们直接来看示例

React Native 使用 fetch 进行网络请求,推荐Promise的形式进行数据处理。

官方的 Demo 如下:

fetch('https://mywebsite.com/endpoint/', { 
 method: 'POST',
 headers: {
 'Accept': 'application/json',
 'Content-Type': 'application/json',
 },
 body: JSON.stringify({
 username: 'yourValue',
 pass: 'yourOtherValue',
 })
}).then((response) => response.json())
.then((res) => {
 console.log(res);
})
.catch((error) => {
 console.warn(error);
});

但是实际在进行开发的时候,却发现了php打印出 $_POST为空数组。

这个时候自己去搜索了下,提出了两种解决方案:

一、构建表单数据

function toQueryString(obj) { 
 return obj ? Object.keys(obj).sort().map(function (key) {
  var val = obj[key];
  if (Array.isArray(val)) {
   return val.sort().map(function (val2) {
    return encodeURIComponent(key) + '=' + encodeURIComponent(val2);
   }).join('&');
  }

  return encodeURIComponent(key) + '=' + encodeURIComponent(val);
 }).join('&') : '';
}

// fetch
body: toQueryString(obj)

但是这个在自己的机器上并不生效。

二、服务端解决方案

获取body里面的内容,在php中可以这样写:

$json = json_decode(file_get_contents('php://input'), true);
var_dump($json['username']);

这个时候就可以打印出数据了。然而,我们的问题是 服务端的接口已经全部弄好了,而且不仅仅需要支持ios端,还需要web和Android的支持。这个时候要做兼容我们的方案大致如下:

    1、我们在fetch参数中设置了 header 设置 app 字段,加入app名称:ios-appname-1.8;

    2、我们在服务端设置了一个钩子:在每次请求之前进行数据处理:

// 获取 app 进行数据集中处理
  if(!function_exists('apache_request_headers') ){
   $appName = $_SERVER['app'];
  }else{
   $appName = apache_request_headers()['app'];
  }

  // 对 RN fetch 参数解码
  if($appName == 'your settings') {
   $json = file_get_contents('php://input');
   $_POST = json_decode($json, TRUE );
  }

这样服务端就无需做大的改动了。

对 Fetch的简单封装

由于我们的前端之前用 jquery较多,我们做了一个简单的fetch封装:

var App = {

 config: {

  api: 'your host',
  // app 版本号
  version: 1.1,

  debug: 1,
 },

 serialize : function (obj) {
  var str = [];
  for (var p in obj)
   if (obj.hasOwnProperty(p)) {
    str.push(encodeURIComponent(p) + "=" + encodeURIComponent(obj[p]));
   }
  return str.join("&");
 },

 // build random number
 random: function() {
  return ((new Date()).getTime() + Math.floor(Math.random() * 9999));
 },



 // core ajax handler
 send(url,options) {
  var isLogin = this.isLogin();
  var self = this;


  var defaultOptions = {
   method: 'GET',
   error: function() {
    options.success({'errcode':501,'errstr':'系统繁忙,请稍候尝试'});
   },
   headers:{
    'Authorization': 'your token',
    'Accept': 'application/json',
    'Content-Type': 'application/json',
    'App': 'your app name'
   },
   data:{
    // prevent ajax cache if not set
    '_regq' : self.random()
   },
   dataType:'json',
   success: function(result) {}
  };

  var options = Object.assign({},defaultOptions,options);
  var httpMethod = options['method'].toLocaleUpperCase();
  var full_url = '';
  if(httpMethod === 'GET') {
   full_url = this.config.api + url + '?' + this.serialize(options.data);
  }else{
   // handle some to 'POST'
   full_url = this.config.api + url;
  }

  if(this.config.debug) {
   console.log('HTTP has finished %c' + httpMethod + ': %chttp://' + full_url,'color:red;','color:blue;');
  }
  options.url = full_url;


  var cb = options.success;

  // build body data
  if(options['method'] != 'GET') {
   options.body = JSON.stringify(options.data);
  }

  // todo support for https
  return fetch('http://' + options.url,options)
    .then((response) => response.json())
    .then((res) => {
     self.config.debug && console.log(res);
     if(res.errcode == 101) {
      return self.doLogin();
     }

     if(res.errcode != 0) {

      self.handeErrcode(res);
     }
     return cb(res,res.errcode==0);
    })
    .catch((error) => {
     console.warn(error);
    });
 },


 handeErrcode: function(result) {
  //
  if(result.errcode == 123){


   return false;
  }

  console.log(result);
  return this.sendMessage(result.errstr);
 },


 // 提示类

 sendMessage: function(msg,title) {
  if(!msg) {
   return false;
  }
  var title = title || '提示';

  AlertIOS.alert(title,msg);
 }

};

module.exports = App;

这样开发者可以这样使用:

App.send(url,{ 
 success: function(res,isSuccess) {
 }
})

总结

好了,到这里PHP获取不了React Native Fecth参数的问题就基本解决结束了,希望本文对大家的学习与工作能有所帮助,如果有疑问或者问题可以留言进行交流。

PHP 相关文章推荐
实现dedecms全站URL静态化改造的代码
Mar 29 PHP
PHP读取网页文件内容的实现代码(fopen,curl等)
Jun 23 PHP
PHP 使用header函数设置HTTP头的示例解析 表头
Jun 17 PHP
PHP Global定义全局变量使用说明
Aug 15 PHP
ThinkPHP公共配置文件与各自项目中配置文件组合的方法
Nov 24 PHP
PDO防注入原理分析以及注意事项
Feb 25 PHP
YII Framework教程之异常处理详解
Mar 14 PHP
ThinkPHP中where()使用方法详解
Apr 19 PHP
PHP多维数组元素操作类的方法
Nov 14 PHP
PHP获取链表中倒数第K个节点的方法
Jan 18 PHP
PHP验证类的封装与使用方法详解
Jan 10 PHP
Laravel如何实现自动加载类
Oct 14 PHP
简单的pgsql pdo php操作类实现代码
Aug 25 #PHP
php mongodb操作类 带几个简单的例子
Aug 25 #PHP
php flush无效,IIS7下php实时输出的方法
Aug 25 #PHP
php 的反射详解及示例代码
Aug 25 #PHP
php 输入输出流详解及示例代码
Aug 25 #PHP
PHP 输出缓冲控制(Output Control)详解
Aug 25 #PHP
PHP中利用sleep函数实现定时执行功能实现代码
Aug 25 #PHP
You might like
无线电广播与收音机发展的历史回眸
2021/03/02 无线电
SONY SRF-40W电路分析
2021/03/02 无线电
PHP5.2下preg_replace函数的问题
2015/05/08 PHP
PHP共享内存用法实例分析
2016/02/12 PHP
php ucwords() 函数将字符串中每个单词的首字符转换为大写(实现代码)
2016/05/12 PHP
thinkphp多表查询两表有重复相同字段的完美解决方法
2016/09/22 PHP
Javascript中的数学函数集合
2007/05/08 Javascript
JavaScript 异步调用框架 (Part 3 - 代码实现)
2009/08/04 Javascript
jquery常用技巧及常用方法列表集合
2011/04/06 Javascript
jquery插件开发之实现jquery手风琴功能分享
2014/03/10 Javascript
JQuery中使文本框获得焦点的方法实例分析
2015/02/28 Javascript
js上传图片及预览功能实例分析
2015/04/24 Javascript
JavaScript获得指定对象大小的方法
2015/07/01 Javascript
js+CSS实现模拟华丽的select控件下拉菜单效果
2015/09/01 Javascript
基于jquery animate操作css样式属性小结
2015/11/27 Javascript
JS根据浏览器窗口大小实时动态改变网页文字大小的方法
2016/02/25 Javascript
JS实现点击网页判断是否安装app并打开否则跳转app store
2016/11/18 Javascript
bootstrap模态框垂直居中效果
2016/12/03 Javascript
layui 优化button按钮和弹出框的方法
2018/08/15 Javascript
用vue-cli开发vue时的代理设置方法
2018/09/20 Javascript
Vue引用Swiper4插件无法重写分页器样式的解决方法
2018/09/27 Javascript
让webpack+vue-cil项目不再自动打开浏览器的方法
2018/09/27 Javascript
vue cli 3.0通用打包配置代码,不分一二级目录
2020/09/02 Javascript
[03:58]兄弟们,回来开黑了!DOTA2昔日战友招募宣传视频
2016/07/17 DOTA
Python 爬虫的工具列表大全
2016/01/31 Python
python 3.6.5 安装配置方法图文教程
2018/09/18 Python
Python判断一个list中是否包含另一个list全部元素的方法分析
2018/12/24 Python
对Python3 解析html的几种操作方式小结
2019/02/16 Python
解决pytorch下出现multi-target not supported at的一种可能原因
2021/02/06 Python
GAP美国官网:美国休闲时尚品牌
2016/08/26 全球购物
杭州-飞时达软件有限公司.net笔面试
2012/04/28 面试题
环境工程求职简历的自我评价范文
2013/10/24 职场文书
三年级语文教学反思
2014/02/01 职场文书
房贷工资证明范本
2015/06/12 职场文书
致创业您:正能量激励人心句子(48条)
2019/08/15 职场文书
详解Vue的列表渲染
2021/11/20 Vue.js