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 相关文章推荐
笑谈配置,使用Smarty技术
Jan 04 PHP
PHP中用正则表达式清除字符串的空白
Jan 17 PHP
PHP数据类型之整数类型、浮点数的介绍
Apr 28 PHP
深入PHP与浏览器缓存的分析
Jun 03 PHP
解析php中用PHPMailer来发送邮件的示例(126.com的例子)
Jun 24 PHP
php实现的百度搜索某地天气的小偷代码
Apr 23 PHP
一个简单的PHP验证码实现代码
May 10 PHP
php中字符串和正则表达式详解
Oct 23 PHP
php简单创建zip压缩文件的方法
Apr 30 PHP
PHP中读取文件的几个方法总结(推荐)
Jun 03 PHP
php的socket编程详解
Nov 20 PHP
PHP实现简单ajax Loading加载功能示例
Dec 28 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+js iframe实现上传头像界面无跳转
2014/04/29 PHP
php常用表单验证类用法实例
2015/06/18 PHP
PHP中substr函数字符串截取用法分析
2016/01/07 PHP
PHP运行模式汇总
2016/11/06 PHP
为何说PHP引用是个坑,要慎用
2018/04/02 PHP
查看源码的工具 学习jQuery源码不错的工具
2011/12/26 Javascript
script标签属性type与language使用选择
2012/12/02 Javascript
js实现单一html页面两套css切换代码
2013/04/11 Javascript
Javascript实现真实字符串剩余字数提示的实例代码
2013/10/22 Javascript
js中call与apply的用法小结
2013/12/28 Javascript
jquery实现不同大小浏览器使用不同的css样式表的方法
2014/04/02 Javascript
轻松创建nodejs服务器(10):处理上传图片
2014/12/18 NodeJs
浅谈JS中的!=、== 、!==、===的用法和区别
2016/09/24 Javascript
Vue.js基础知识小结
2017/01/13 Javascript
webpack 1.x升级过程中的踩坑总结大全
2017/08/09 Javascript
对于input 框限定输入值为浮点型的js代码
2017/09/25 Javascript
基于axios 解决跨域cookie丢失的问题
2018/09/26 Javascript
微信小程序 wx:for遍历循环使用实例解析
2019/09/09 Javascript
[03:17]2016完美“圣”典风云人物:冷冷专访
2016/12/08 DOTA
跟老齐学Python之玩转字符串(2)
2014/09/14 Python
Python的Django框架中自定义模版标签的示例
2015/07/20 Python
python万年历实现代码 含运行结果
2017/05/20 Python
Python爬取当当、京东、亚马逊图书信息代码实例
2017/12/09 Python
Django 全局的static和templates的使用详解
2019/07/19 Python
用python生成与调用cntk模型代码演示方法
2019/08/26 Python
jupyter notebook 添加kernel permission denied的操作
2020/04/21 Python
Python自动创建Excel并获取内容
2020/09/16 Python
总结python 三种常见的内存泄漏场景
2020/11/20 Python
浅析HTML5:'data-'属性的作用
2018/01/23 HTML / CSS
会计职业生涯规划书
2014/01/13 职场文书
公司营业员的自我评价
2014/03/04 职场文书
《爱的教育》读书心得
2014/11/08 职场文书
出纳岗位职责范本
2015/03/31 职场文书
浅谈什么是SpringBoot异常处理自动配置的原理
2021/06/21 Java/Android
SpringMVC 整合SSM框架详解
2021/08/30 Java/Android
关于k8s环境部署mysql主从的问题
2022/03/13 MySQL