侯体宗的博客
  • 首页
  • Hyperf版
  • beego仿版
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

PHP获取不了React Native Fecth参数的解决办法

php  /  管理员 发布于 7年前   122

话不多说,我们直接来看示例

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('&') : '';}// fetchbody: 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参数的问题就基本解决结束了,希望本文对大家的学习与工作能有所帮助,如果有疑问或者问题可以留言进行交流。

您可能感兴趣的文章:

  • React-Native Android 与 IOS App使用一份代码实现方法
  • IOS React Native FlexBox详解及实例
  • Android React-Native通信数据模型分析
  • ReactNative Alert详解及实例代码
  • ReactNative (API)AsyncStorage存储详解及实例
  • ReactNative-JS 调用原生方法实例代码
  • React-Native TextInput组件详解及实例代码
  • ReactNative页面跳转实例代码
  • Android原生嵌入React Native详解
  • React Native实现简单的登录功能(推荐)
  • React Native搭建iOS开发环境
  • Windows下React Native的Android环境部署及布局示例
  • 深入浅析react native es6语法
  • React Native 如何获取不同屏幕的像素密度


  • 上一条:
    简单的自定义php模板引擎
    下一条:
    简单的pgsql pdo php操作类实现代码
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • Laravel从Accel获得5700万美元A轮融资(0个评论)
    • PHP 8.4 Alpha 1现已发布!(0个评论)
    • 用Time Warden监控PHP中的代码处理时间(0个评论)
    • 在PHP中使用array_pop + yield实现读取超大型目录功能示例(0个评论)
    • Property Hooks RFC在PHP 8.4中越来越接近现实(0个评论)
    • 近期文章
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf分页文件功能(0个评论)
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 欧盟关于强迫劳动的规定的官方举报渠道及官方举报网站(0个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf文件功能(0个评论)
    • Laravel从Accel获得5700万美元A轮融资(0个评论)
    • 在go + gin中gorm实现指定搜索/区间搜索分页列表功能接口实例(0个评论)
    • 在go语言中实现IP/CIDR的ip和netmask互转及IP段形式互转及ip是否存在IP/CIDR(0个评论)
    • PHP 8.4 Alpha 1现已发布!(0个评论)
    • Laravel 11.15版本发布 - Eloquent Builder中添加的泛型(0个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2016-10
    • 2016-11
    • 2017-06
    • 2017-07
    • 2017-08
    • 2017-09
    • 2017-11
    • 2017-12
    • 2018-01
    • 2018-02
    • 2018-03
    • 2020-03
    • 2020-04
    • 2020-05
    • 2020-06
    • 2020-07
    • 2020-09
    • 2021-02
    • 2021-03
    • 2021-04
    • 2021-05
    • 2021-06
    • 2021-07
    • 2021-08
    • 2021-09
    • 2021-10
    • 2021-11
    • 2021-12
    • 2022-01
    • 2022-02
    • 2022-05
    • 2022-06
    • 2022-07
    • 2022-08
    • 2022-09
    • 2022-10
    • 2022-11
    • 2022-12
    • 2023-01
    • 2023-02
    • 2023-03
    • 2023-04
    • 2023-05
    • 2023-06
    • 2023-07
    • 2023-08
    • 2023-09
    • 2023-10
    • 2023-11
    • 2023-12
    • 2024-01
    • 2024-02
    • 2024-03
    • 2024-04
    • 2024-05
    • 2024-06
    • 2024-07
    • 2024-09
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客