前言


一、常用的解决方案

React 前端 + PHP (Laravel) 后端

Such as "some exposure to WEB API’s and/or RESTful“。

使用PHP,但不必关心 return view,那么我们应该关心什么呢?

二、本篇提到的接口

Ref: PHP开发APP接口

 服务端发送 - html

[1] 不是php面相对象的接口,而是app接口,以下就是个例子(URL):

[2] APP (通信) 接口定义,仨条件:

    • 接口地址
    • 接口文件
    • 接口数据

 客户端返回 - json/xml

一般返回xml或者json格式的内容,在此列出基本方法:

JSON XML
json_encode($arr) $return .= 拼装法
  $dom = new DomDocument(...);
  XMLWriter
  XMLWriter

封装通信接口


一、封装方法

三种封装的方式:  

二、PHP return JSON

  • Only UTF-8, value is Array.
json_encode($value)
  • 字符编码转换
$newData = iconv('UTF-8', 'GBK', $data) 
  • 通信数据的三个格式

对应如下代码的参数:

[封装方法]

class Response {

  public static function json($code, $message = '', $data = array()) {

    if (!is_numeric($code)) {
      return '';
    }
/**
* 组装成一个新的数据
*/
    $result = array(
      'code' => $code,
      'message' => $message,
      'data' => $data
    );     echo json_encode($result);
    exit;
}

Next, 实践上述类和方法。

<?php

require_once('./response.php');
$arr = array
  'id' => 1,
  'name' => 'singwa'
); Response::json(200, '数据返回成功’, $arr);

三、PHP return XML

  • PHP生成XML数据
1) 组装字符串
2) 使用系统类
    DomDocument --> http://php.net/manual/en/class.domdocument.php
    XMLWriter --> http://php.net/manual/en/book.xmlwriter.php
    SimpleXML --> http://php.net/manual/en/book.simplexml.php
  • 构建XML文件

对应的代码生成。在以上的json的response类中添加以下函数:

public static function xml() {
  //header("Content-Type:text/xml");
//以xml形式表现结构,这么用户接收到response时,就能有xml的友好格式展示
  $xml = "<?xml version= '1.0' encoding='UTF-8'?>\n";
  $xml .= "<root>\n";
  $xml .= "<code>200</code>\n";
  $xml .= "<message>数据返回成功</message>\n";
  $xml .= "<data>\n";
  $xml .= "<id>1</id>\n";
  $xml .= "<name>singwa</name>\n";
  $xml .= "</data>\n";
  $xml .= "</root>\n";   echo $xml;
}

输入URL:

app.com/response.php 

生成:

 

  • 封装通信接口数据

[1] 用户用到的代码示范。

$data = array(
  'id' => 1,
  'name' => 'singwa',
); Response::xmlEncode(200, 'success', $data);

[2] 封装函数的实现。

public static function xmlEncode($code, $message, $data = array()) {

  if (! is_numeric($code)) {
    return '';
  }   $result = array(
    'code' => $code,
    'message' => $message,
    'data' => $data,
  );   header("Content-Type:text/xml");   $xml = "<?xml version= '1.0' encoding='UTF-8'?>\n";
  $xml .= "<root>\n";
  $xml .= self::xmlToEncode($result);  # --->
  $xml .= "</root>\n";   echo $xml;
}

[3] XML对具体内容的封装。

public static function xmlToEncode($data) {

  foreach( $data as $key => $value) {
    $xml .= "<{$key}>";
    $xml .= $value;      // 这里可以改为递归,然后便能打印出内部的数据
    $xml .= "</{$key}>";  
  }   return $xml;
}

[3.1] 改进后加入递归。

public static function xmlToEncode($data) {

  foreach( $data as $key => $value) {
    $xml .= "<{$key}>";
    $xml .= is_array($value)?self::xmlToEncode($value):$value;
    $xml .= "</{$key}>";  
  }   return $xml;
}

[3.2] 如果value部分是数组,会引出一个问题如下。

$data = array(
  'id' => 1,
  'name' => 'singwa',
  'type' => array(4,5,6)
); Response::xmlEncode(200, 'success', $data);

  但,标签是不能用数字表示的。

<type>
  <0>4</0>
  <1>5</1>
  <2>6</2>
</type>

改进方案:$key的角色变了,由<id>变为<item attr = "_">;既然此时的标签没有意义,那就拿item来顶替好了。

public static function xmlToEncode($data) {

  $xml = $attr = "";
  foreach( $data as $key => $value) {     if (is_numberic($key)) {
      $attr = "id='{$key}'";
      $key = "item";
    }     $xml .= "<{$key}><{$attr}>";
    $xml .= is_array($value)?self::xmlToEncode($value):$value;
    $xml .= "</{$key}>";  
  }   return $xml;
}

显示结果:

综合通信方式封装


一、何为”综合“

就是通过判断type: json or xml,从来具体类型具体封装。

show( $code, $message, $data=array(), $type='json' )

二、代码示范

    /**
* 按综合方式输出通信数据
* @param integer $code 状态码
* @param string $message 提示信息
* @param array $data 数据
* @param string $type 数据类型
* return string
*/
public static function show($code, $message = '', $data = array(), $type = self::JSON) {
if(!is_numeric($code)) {
return '';
}

/* url中的参数判断 */
$type = isset($_GET['format']) ? $_GET['format'] : self::JSON; $result = array(
'code' => $code,
'message' => $message,
'data' => $data,
); if($type == 'json') {
self::json($code, $message, $data);
exit;
} elseif($type == 'array') {
var_dump($result);
} elseif($type == 'xml') {
self::xmlEncode($code, $message, $data);
exit;
} else {
// TODO
}
}

[Laravel] 10 - WEB API : wrapper的更多相关文章

  1. [Laravel] 11 - WEB API : cache & timer

    前言 一.资源 Ref: https://www.imooc.com/video/2870 二.缓存 缓存:静态缓存.Memcache.redis缓存 Ref: [Laravel] 09 - Func ...

  2. [Laravel] 13 - WEB API : update & error tracking

    前言 一.大纲 Ref: https://www.imooc.com/video/3134 版本升级分析以及数据表设计 版本升级分析 掌握如何设计版本升级数据表 版本升级接口开发以及APP演示 二.数 ...

  3. [Laravel] 12 - WEB API : cache implement

    前言 Ref: https://www.imooc.com/video/2873 服务端如何为客户端(app)的首页提供数据接口, 本篇用此作为例子演示接口的实现. 单例模式 一.三大原则 单例实现 ...

  4. [Laravel] 14 - REST API: Laravel from scratch

    前言 一.基础 Ref: Build a REST API with Laravel API resources Goto: [Node.js] 08 - Web Server and REST AP ...

  5. [转]Web API OData V4 Keys, Composite Keys and Functions Part 11

    本文转自:https://damienbod.com/2014/09/12/web-api-odata-v4-keys-composite-keys-and-functions-part-11/ We ...

  6. 返璞归真 asp.net mvc (10) - asp.net mvc 4.0 新特性之 Web API

    原文:返璞归真 asp.net mvc (10) - asp.net mvc 4.0 新特性之 Web API [索引页][源码下载] 返璞归真 asp.net mvc (10) - asp.net ...

  7. laravel 配置路由 api和web定义的路由的区别详解

    1.路由经过中间件方面不同 打开kerenl.php就可以看到区别 protected $middlewareGroups = [ 'web' => [ \App\Http\Middleware ...

  8. 循序渐进学.Net Core Web Api开发系列【10】:使用日志

    系列目录 循序渐进学.Net Core Web Api开发系列目录 本系列涉及到的源码下载地址:https://github.com/seabluescn/Blog_WebApi 一.本篇概述 本篇介 ...

  9. win 10+ iis 10 部署.net core 1.1 web api

    今天上午部署了wcf,部署了好久,一直没有部署好,最后找到了dudu的部署方法,结果中午吃饭的时候成功了,这是链接:http://www.cnblogs.com/dudu/p/3328066.html ...

随机推荐

  1. .Net机试题——编写一个BS架构的多层表结构的信息管理模块

      要求: 编写一个BS架构的多层表结构的信息管理模块,用户体验需要注意.包含错误处理,需要最终能完整的跑起来.页面可以不美化,但是整洁还是必须的.在不能完成详细功能需求的情况下优先保证基本功能. 1 ...

  2. 手机号是SIM卡的号呢,还是买手机时就带的

    可以用原来的号码!把原来的卡装在新手机里就可以了,你的号码没有改变! 手机的号是由sim卡来决定的! 但是卡上的号码显示的是卡的一些信息! 你不用去理会它! 全文:http://iask.sina.c ...

  3. WordPress基础:极简手动安装教程

    1.下载WordPress 2.将解压后的文件夹,放到网站根目录,并重命名为你喜欢的目录如:w, 3.重命名文件wp-config-sample.php 为 wp-config.php,并进行配置 4 ...

  4. 奇怪吸引子---Lorenz

    奇怪吸引子是混沌学的重要组成理论,用于演化过程的终极状态,具有如下特征:终极性.稳定性.吸引性.吸引子是一个数学概念,描写运动的收敛类型.它是指这样的一个集合,当时间趋于无穷大时,在任何一个有界集上出 ...

  5. jquery异步ajax与服务器通信过程中如何通过then方法链式传递多层数据

    我们在有些地方可能需要对服务器返回的参数做多步处理,或者很多复杂的操作必须等到服务器返回结果之后才会执行,那么我们可以用链式调用的then方法让这里做到更加易于扩展,也更加容易分离出各个功能模块.基本 ...

  6. 常见的机器学习&数据挖掘知识点

    原文:http://blog.csdn.net/heyongluoyao8/article/details/47840255 常见的机器学习&数据挖掘知识点 转载请说明出处 Basis(基础) ...

  7. android开发之打包签名

    android开发之数字签名 http://www.cnblogs.com/fengzhblog/archive/2013/05/06/3063104.html Android系统要求所有的程序经过数 ...

  8. mysql 5.5.x zip直接解压版 报1076

    到官网下载mysql-5.5.10-win32.zip,然后将mysql解压到任意路径,如:C:\mysql-5.5.10-win32 打开计算机->属性->高级系统设置->环境变量 ...

  9. 基于CentOS 7 搭建 GitLab

    系统要求:CentOS 7.2 64 位操作系统 更新软件包 yum update -y 安装和启动 sshd 安装 sshd: yum install -y curl policycoreutils ...

  10. OpenLayers典型部分概述

    中文学习:http://www.openlayers.cn/portal.php 原文地址:https://www.jianshu.com/p/e693711a7008 一 OpenLayers核心职 ...