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 相关文章推荐
使用php4加速网络传输
Oct 09 PHP
谈谈PHP的输入输出流
Feb 14 PHP
在PHP中使用模板的方法
May 24 PHP
基于PHP文件操作的详解
Jun 05 PHP
PHP程序员常见的40个陋习,你中了几个?
Nov 20 PHP
php查找指定目录下指定大小文件的方法
Nov 28 PHP
php中删除数组的第一个元素和最后一个元素的函数
Mar 07 PHP
php将字符串转换成16进制的方法
Mar 17 PHP
php中实现可以返回多个值的函数实例
Mar 21 PHP
php中namespace use用法实例分析
Jan 22 PHP
PHP将MySQL的查询结果转换为数组并用where拼接的示例
May 13 PHP
PHP错误和异常处理功能模块示例
Nov 12 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
php实现的MySQL通用查询程序
2007/03/11 PHP
Smarty中常用变量操作符汇总
2014/10/27 PHP
分享十款最出色的PHP安全开发库中文详细介绍
2015/03/22 PHP
php简单创建zip压缩文件的方法
2016/04/30 PHP
PHP实现的简单组词算法示例
2018/04/10 PHP
Yii2处理密码加密及验证的方法
2019/05/12 PHP
smarty模板的使用方法实例分析
2019/09/18 PHP
javascript中用星号表示预录入内容的实现代码
2011/01/08 Javascript
jquery load事件(callback/data)使用方法及注意事项
2013/02/06 Javascript
下载文件个别浏览器文件名乱码解决办法
2013/03/19 Javascript
div浮层,滚动条移动,位置保持不变的4种方法汇总
2013/12/11 Javascript
js遍历子节点子元素附属性及方法
2014/08/19 Javascript
php+ajax+jquery实现点击加载更多内容
2015/05/03 Javascript
js实现网页抽奖实例
2015/08/05 Javascript
轻松学习jQuery插件EasyUI EasyUI实现拖动基本操作
2015/11/30 Javascript
Canvas + JavaScript 制作图片粒子效果
2017/02/08 Javascript
Mac系统下Webstorm快捷键整理大全
2017/05/28 Javascript
react native带索引的城市列表组件的实例代码
2017/08/08 Javascript
vue将毫秒数转化为正常日期格式的实例
2018/09/16 Javascript
微信小程序签到功能
2018/10/31 Javascript
JS实现拖动模糊框特效
2020/08/25 Javascript
[13:38]2015国际邀请赛中国战队出征仪式
2015/05/29 DOTA
python执行get提交的方法
2015/04/29 Python
Python入门教程之if语句的用法
2015/05/14 Python
在Linux命令行终端中使用python的简单方法(推荐)
2017/01/23 Python
Python编程使用tkinter模块实现计算器软件完整代码示例
2017/11/29 Python
Python使用matplotlib 模块scatter方法画散点图示例
2019/09/27 Python
python 操作hive pyhs2方式
2019/12/21 Python
Python+unittest+requests+excel实现接口自动化测试框架
2020/12/23 Python
Canvas在超级玛丽游戏中的应用详解
2021/02/06 HTML / CSS
毕业生自荐书模版
2014/01/04 职场文书
终止合同协议书
2014/04/17 职场文书
文化产业实施方案
2014/06/07 职场文书
年度考核表个人总结
2015/03/06 职场文书
个人维稳承诺书
2015/05/04 职场文书
汉字听写大会观后感
2015/06/12 职场文书