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 相关文章推荐
简单易用的计数器(数据库)
Oct 09 PHP
深入了解php4(2)--重访过去
Oct 09 PHP
php 分库分表hash算法
Nov 12 PHP
php模拟ping命令(php exec函数的使用方法)
Oct 25 PHP
php函数serialize()与unserialize()用法实例
Nov 06 PHP
PHP实现Javascript中的escape及unescape函数代码分享
Feb 10 PHP
php正则表达式学习笔记
Nov 13 PHP
浅析php设计模式之数据对象映射模式
Mar 03 PHP
如何直接访问php实例对象中的private属性详解
Oct 12 PHP
PHP+jQuery实现双击修改table表格功能示例
Feb 21 PHP
PHP创建对象的六种方式实例总结
Jun 27 PHP
php实现大文件断点续传下载实例代码
Oct 01 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
推荐10个提供免费PHP脚本下载的网站
2014/12/31 PHP
jQuery + Flex 通过拖拽方式动态改变图片的代码
2011/08/03 Javascript
javascript中的delete使用详解
2013/04/11 Javascript
javascript属性访问表达式用法分析
2015/04/25 Javascript
js实现select跳转菜单新窗口效果代码分享(超简单)
2015/08/21 Javascript
AngularJs Understanding the Controller Component
2016/09/02 Javascript
Web 开发中Ajax的Session 超时处理方法
2017/01/19 Javascript
JavaScript实现无刷新上传预览图片功能
2017/08/02 Javascript
python实现封装得到virustotal扫描结果
2014/10/05 Python
Python安装使用命令行交互模块pexpect的基础教程
2016/05/12 Python
如何在Python函数执行前后增加额外的行为
2016/10/20 Python
python 批量修改/替换数据的实例
2018/07/25 Python
Python理解递归的方法总结
2019/01/28 Python
numpy基础教程之np.linalg
2019/02/12 Python
使用pip安装python库的多种方式
2019/07/31 Python
Python numpy.zero() 初始化矩阵实例
2019/11/27 Python
Python:二维列表下标互换方式(矩阵转置)
2019/12/02 Python
python要安装在哪个盘
2020/06/15 Python
python实现代码审查自动回复消息
2021/02/01 Python
css3设置box-pack和box-align让div里面的元素垂直居中
2014/09/01 HTML / CSS
香港化妆品经销商:我的公主
2016/08/05 全球购物
美国在线家装零售商:Build.com
2016/09/02 全球购物
Giglio俄罗斯奢侈品购物网:男士、女士、儿童高级时装
2018/07/27 全球购物
日本乐天德国站:Rakuten.de
2019/05/16 全球购物
大专生简历的自我评价
2013/11/26 职场文书
乔迁宴答谢词
2014/01/21 职场文书
不假外出检讨书
2014/01/27 职场文书
应届大专毕业生自我鉴定
2014/04/08 职场文书
门面房租房协议书
2014/08/20 职场文书
邮政竞聘演讲稿
2014/09/03 职场文书
公司证明怎么写
2014/09/22 职场文书
幼儿园感恩节活动方案
2014/10/06 职场文书
专项资金申请报告
2015/05/15 职场文书
Python OpenCV实现图形检测示例详解
2022/04/08 Python
python热力图实现的完整实例
2022/06/25 Python
Nginx报错104:Connection reset by peer问题的解决及分析
2022/07/23 Servers