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 Memcached + APC + 文件缓存封装实现代码
Mar 11 PHP
php的urlencode()URL编码函数浅析
Aug 09 PHP
php提示无法加载或mcrypt没有找到 PHP 扩展 mbstring解决办法
Mar 27 PHP
让PHP更快的提供文件下载的代码
Jun 13 PHP
php中使用preg_replace函数匹配图片并加上链接的方法
Feb 06 PHP
PHPMailer邮件发送的实现代码
May 04 PHP
PHP6 中可能会出现的新特性预览
Apr 04 PHP
ThinkPHP中URL路径访问与模块控制器之间的关系
Aug 23 PHP
php验证手机号码
Nov 11 PHP
Zend Studio使用技巧两则
Apr 01 PHP
Thinkphp5.0 框架的请求方式与响应方式分析
Oct 14 PHP
php去除deprecated的实例方法
Nov 17 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
Views rows style模板重写代码
2011/05/16 PHP
详解PHP中array_rand函数的使用方法
2016/09/11 PHP
如何让PHP编码更加好看利于阅读
2019/05/12 PHP
PHP var关键字相关原理及使用实例解析
2020/07/11 PHP
通过JAVASCRIPT读取ASP设定的COOKIE
2007/02/15 Javascript
javasript实现密码的隐藏与显示
2015/05/08 Javascript
简介JavaScript中search()方法的使用
2015/06/06 Javascript
JavaScript  cookie 跨域访问之广告推广
2016/04/20 Javascript
js 获取经纬度的实现方法
2016/06/20 Javascript
JavaScript实现QQ列表展开收缩扩展功能
2017/10/30 Javascript
基于javascript 显式转换与隐式转换(详解)
2017/12/15 Javascript
vue获取dom元素注意事项
2017/12/28 Javascript
Vue组件和Route的生命周期实例详解
2018/02/10 Javascript
vue-cli基础配置及webpack配置修改的完整步骤
2019/10/20 Javascript
手机浏览器唤起微信分享(JS)
2020/10/11 Javascript
javascript实现下拉菜单效果
2021/02/09 Javascript
Python实现的二维码生成小软件
2014/07/11 Python
详解python脚本自动生成需要文件实例代码
2017/02/04 Python
简单谈谈Python中的元祖(Tuple)和字典(Dict)
2017/04/21 Python
用python实现将数组元素按从小到大的顺序排列方法
2018/07/02 Python
Python Pillow Image Invert
2019/01/22 Python
Python3.5实现的三级菜单功能示例
2019/03/25 Python
Python编程快速上手——疯狂填词程序实现方法分析
2020/02/29 Python
python中的socket实现ftp客户端和服务器收发文件及md5加密文件
2020/04/01 Python
Python importlib动态导入模块实现代码
2020/04/16 Python
Python Merge函数原理及用法解析
2020/09/16 Python
Flask处理Web表单的实现方法
2021/01/31 Python
把富文本的回车转为br标签
2019/08/09 HTML / CSS
马德里著名的运动鞋商店:NOIRFONCE
2019/04/12 全球购物
莫斯科大型旅游休闲商品超市:Camping.ru
2020/09/16 全球购物
山海经纬软件测试笔试题和面试题
2013/04/02 面试题
小学开学典礼主持词
2014/03/19 职场文书
户外活动总结范文
2014/04/30 职场文书
无罪辩护词范文
2015/05/21 职场文书
Win11电脑显示本地时间与服务器时间不一致怎么解决?
2022/04/05 数码科技
Python各协议下socket黏包问题原理
2022/04/12 Python