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 相关文章推荐
example1.php
Oct 09 PHP
用PHP伪造referer突破网盘禁止外连的代码
Jun 15 PHP
php数组总结篇(一)
Sep 30 PHP
如何在smarty中增加类似foreach的功能自动加载数据
Jun 26 PHP
ThinkPHP中U方法的使用浅析
Jun 13 PHP
ThinkPHP在新浪SAE平台的部署实例
Oct 31 PHP
PHP转盘抽奖接口实例
Feb 09 PHP
php的闭包(Closure)匿名函数详解
Feb 22 PHP
支持中文的PHP按字符串长度分割成数组代码
May 17 PHP
PHP实现的一致性哈希算法完整实例
Nov 14 PHP
WordPress中登陆后关闭登陆页面及设置用户不可见栏目
Dec 31 PHP
详解Laravel制作API接口
May 31 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
利用文件属性结合Session实现在线人数统计
2006/10/09 PHP
PHP脚本的10个技巧(7)
2006/10/09 PHP
php生成图形(Libchart)实例
2013/11/06 PHP
php实现文件下载功能的几个代码分享
2014/05/10 PHP
php中get_object_vars()方法用法实例
2015/02/08 PHP
PHP基于XMLWriter操作xml的方法分析
2017/07/17 PHP
PHP合并两个或多个数组的方法
2019/01/20 PHP
Ext第一周 史上最强学习笔记---GridPanel(基础篇)
2008/12/29 Javascript
jQuery中jqGrid分页实现代码
2011/11/04 Javascript
漂亮的jquery提示效果(仿腾讯弹出层)
2013/02/05 Javascript
JS获取文件大小方法小结
2015/12/08 Javascript
JavaScript正则表达式实例详解
2016/10/16 Javascript
vue基于mint-ui的城市选择3级联动的示例
2017/10/25 Javascript
React中常见的动画实现的几种方式
2018/01/10 Javascript
js实现动态改变radio状态的方法
2018/02/28 Javascript
node thread.sleep实现示例
2018/06/20 Javascript
原生JS实现简单的倒计时功能示例
2018/08/30 Javascript
node.js环境搭建图文详解
2018/09/19 Javascript
vue v-for循环重复数据无法添加问题解决方法【加track-by='索引'】
2019/03/15 Javascript
JavaScript使用ul中li标签实现删除效果
2019/04/15 Javascript
JS实现简单tab选项卡切换
2019/10/25 Javascript
原生javascript如何实现共享onload事件
2020/07/03 Javascript
举例讲解Python中is和id的用法
2015/04/03 Python
python安装cx_Oracle模块常见问题与解决方法
2017/02/21 Python
Python爬虫 bilibili视频弹幕提取过程详解
2019/07/31 Python
解决python 读取 log日志的编码问题
2019/12/24 Python
Python坐标轴操作及设置代码实例
2020/06/04 Python
Spring @Enable模块驱动原理及使用实例
2020/06/23 Python
英国口碑最好的的维他命胶囊品牌:Myvitamins(有中文站)
2016/12/03 全球购物
Vuori官网:运动服装的终级表现
2021/01/27 全球购物
2014保险公司内勤工作总结
2014/12/16 职场文书
2015年学校政教处工作总结
2015/05/26 职场文书
导游词之开封禹王台风景区
2019/12/02 职场文书
Django对接elasticsearch实现全文检索的示例代码
2021/08/02 Python
电脑关机速度很慢怎么办 提升电脑关机速度设置教程
2022/04/08 数码科技
Spring JPA 增加字段执行异常问题及解决
2022/06/10 Java/Android