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 相关文章推荐
在PHP中利用XML技术构造远程服务(下)
Oct 09 PHP
php数组函数序列之array_key_exists() - 查找数组键名是否存在
Oct 29 PHP
PHP插入排序实现代码
Apr 04 PHP
使用PHP备份MySQL和网站发送到邮箱实例代码
Nov 28 PHP
PHP IE中下载附件问题解决方法
Jan 07 PHP
PHP实现获取FLV文件的时间
Feb 10 PHP
php字符串分割函数用法实例
Mar 17 PHP
thinkphp自带验证码全面解析
Sep 18 PHP
thinkphp实现分页显示功能
Dec 03 PHP
PHP给源代码加密的几种方法汇总(推荐)
Feb 06 PHP
ThinkPHP5.0框架实现切换数据库的方法分析
Oct 30 PHP
PHP连续签到功能实现方法详解
Dec 04 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
免费手机号码归属地API查询接口和PHP使用实例分享
2014/04/10 PHP
destoon数据库表说明汇总
2014/07/15 PHP
typecho插件编写教程(四):插件挂载
2015/05/28 PHP
js 弹出框 替代浏览器的弹出框
2010/10/29 Javascript
js获取GridView中行数据的两种方法 分享
2013/07/13 Javascript
JQuery分别取得每行最后一列和最后一行的示例代码
2013/08/18 Javascript
javascript基本语法
2016/05/31 Javascript
Angualrjs和bootstrap相结合实现数据表格table
2017/03/30 Javascript
JavaScript DOM元素常见操作详解【添加、删除、修改等】
2018/05/09 Javascript
使用vuex缓存数据并优化自己的vuex-cache
2018/05/30 Javascript
Vue filter格式化时间戳时间成标准日期格式的方法
2018/09/16 Javascript
运用js实现图层拖拽的功能
2019/05/24 Javascript
jquery实现直播视频弹幕效果
2020/02/25 jQuery
javascript设计模式 ? 桥接模式原理与应用实例分析
2020/04/13 Javascript
Vue 实现监听窗口关闭事件,并在窗口关闭前发送请求
2020/09/01 Javascript
js实现鼠标滑动到某个div禁止滚动
2020/09/17 Javascript
十个Python程序员易犯的错误
2015/12/15 Python
python机器学习之决策树分类详解
2017/12/20 Python
python 3调用百度OCR API实现剪贴板文字识别
2018/09/04 Python
对python读写文件去重、RE、set的使用详解
2018/12/11 Python
numpy.where() 用法详解
2019/05/27 Python
python批量修改图片尺寸,并保存指定路径的实现方法
2019/07/04 Python
python正则表达式匹配IP代码实例
2019/12/28 Python
python 解决flask 图片在线浏览或者直接下载的问题
2020/01/09 Python
PyCharm2019 安装和配置教程详解附激活码
2020/07/31 Python
Pyinstaller打包Scrapy项目的实现步骤
2020/09/22 Python
python使用selenium爬虫知乎的方法示例
2020/10/28 Python
python gui开发——制作抖音无水印视频下载工具(附源码)
2021/02/07 Python
美国祛痘、抗衰老药妆品牌:Murad
2016/08/27 全球购物
波兰数码相机及配件网上商店: Cyfrowe.pl
2017/06/19 全球购物
解释i节点在文件系统中的作用
2013/11/26 面试题
医药代表个人的求职信分享
2013/12/08 职场文书
售后求职信范文
2014/03/15 职场文书
工业设计毕业生自荐信
2014/04/13 职场文书
荆州古城导游词
2015/02/06 职场文书
90行Python代码开发个人云盘应用
2021/04/20 Python