Laravel接口教程:如何构建和测试RESTful接口

原文请访问Laravel API Tutorial: How to Build and Test a RESTful API

随着移动开发和JavaScript框架的兴起,使用RESTful API是在数据和客户端之间构建单一接口的最佳选择。

Laravel是一个PHP框架,并注重开发人员的生产力。 由Taylor Otwell编写和维护,框架非常有意义,并努力通过有利于配置的惯例来节省开发人员时间。 该框架还旨在与Web一起发展,并已经在Web开发世界中纳入了几个新功能和想法,例如作业队列,开箱即用的API认证,实时通信等等。

在本文中,我们将探讨如何使用Laravel进行身份验证来构建和测试一个强大的API。 我们将使用Laravel 5.4,所有的代码都可以在GitHub上参考。

RESTful API

首先,我们需要了解什么是RESTful API。 REST代表RE表示状态转移 ,是应用程序之间的网络通信的架构风格,它依赖于无状态协议(通常为HTTP)进行交互。

HTTP动词表示动作

在RESTful API中,我们使用HTTP动词作为动作,端点是


继续阅读»»»

软件熵解析:起因、影响与补救措施

原文请访问Software Entropy Explained: Causes, Effects, and Remedies

这篇文章主要针对的读者是对什么是软件熵、对他们工作会产生哪些实际影响、以及哪些潜在的因素促进熵的增长感兴趣的软件开发人员和项目经理。

主要目的是构成对软件熵的意识,因为它是所有形式的软件开发的一个要素。因此,我们将会探索一种能够把软件熵赋予某个具体值的方法。唯有通过量化软件熵,并且通过连续的发布观察它的增长 ,我们才能真正明白它对我们当前目标和未来计划所带来的风险。

何为软件熵?

软件熵起名于现实世界中熵的主要特点:即对混沌的度量,要么保持不变,要么随时间增长。换种方式来说,软件熵是对关于修改软件系统而产生的内在不稳定性的度量。

不幸的是,软件熵未能得到它应有的重视。

毫无疑问,从开发团队中随便拉个人过来,贸然地进行开发迭代,或者进行“快速修复” —— 这时,实际上,极可能助长了软件熵的增长。

软件开发是一门艺术,也是一种交易,因为它的核心构建块往往是欠缺考虑的。建筑工人工作用的是水泥和钉子,然而软件开发人员要面对是逻辑断言和


继续阅读»»»

(下)高级元编程指南:创建一个Ruby DSL

原文请见Creating a Ruby DSL: A Guide to Advanced Metaprogramming

精简语法

当前的实现还有最后一个地方让人揪心——在配置代码块里不得不重复配置每一行。恰如其分的DSL都应知道,配置代码块里的所有东西将在配置对象的上下文内执行,并且这样可以实现同样的效果:

MyApp.configure do  
  app_id "my_app"
  title "My App"
  cookie_name "my_app_session"
end  

来,撸起袖子继续加油干!从表面上看,需要做两件事。首先,需要一种方式来执行在配置对象上下文内传递给configure的代码块,以便在代码块的方法调用作用于那个对象。其次,要修改访问器方法,以便做到有一个参数时就写入该值、没有参数时就读取。一个可能的实现是:

module Configurable  
  def self.with(*attrs)
    not_provided = Object.new

    config_class = Class.new do

继续阅读»»»

(上)高级元编程指南:创建一个Ruby DSL

原文请见Creating a Ruby DSL: A Guide to Advanced Metaprogramming

领域特定语言(DSL)是一个强大到令人难以置信的工具,因为它把编写或者配置复杂的系统变得更为简单。同时它们无处不在——作为一名软件工程师,你很可能在日常事务中使用了多种不同的DSL。

在这篇文章,你将会学习到什么是领域特定语言,什么时候应该使用它们,以及如何使用Ruby的高级元编程技术创建你自己专属的DSL。

此文章基于Nikola Todorovic发布在Toptal博客上关于Ruby元编程的介绍,如果你是初次接触元编程,请先阅读一下那篇文章。

什么是领域特定语言?

对于DSL的普遍定义是,它们是某一特定应用域或用例的专门语言。这意味着,你只能在指定的方面使用DSL——它们不适合普遍目的的软件开发。如果这听起来有点虚,是因为——DSL本来就千奇百怪。以下是一些重要的分类:

  • 标记性语言,例如HTML和CSS设计用于描述类似结构、内容、网站页面风格这些指定的事物。标记性语言不能用于编写任何算法,所以它们适合DSL的描述。

  • 在某


继续阅读»»»

Twitter数据挖掘:如何使用Python分析大数据

原文请见Twitter Data Mining: A Guide to Big Data Analytics Using Python

大数据无处不在。在时下这个年代,不管你喜欢与否,在运营一个成功的商业的过程中都有可能会遇到它。

本教程将会简要介绍何谓大数据,无论你是尝试抓住时机的商人,抑或是寻找下一个项目的编程高手,你都可以学到它是如何为你所用,以及如何使用Twitter API和Python快速开始。

何谓大数据?

大数据就像它看起来那样——有大量的数据。单独而言,你能从单一的数据获取的洞见穷其有限。但是结合复杂数学模型以及强大计算能力的TB级数据,却能创造出人类无法制造的洞见。大数据分析提供给商业的价值是无形的,并且每天都在超越人类的能力。

大数据分析的第一步就是要收集数据本身,也就是众所周知的“数据挖掘”。数据来自于四面八方。大部分的企业处理着GB级的数据,这些数据有用户数据、产品数据和地理位置数据。在本教程中,我们将会探索如何使用数据挖掘技术收集Twitter的数据,这可能会比你想象中的更有用。

举个例子,假设你运营着脸书,想使用Mes


继续阅读»»»

JSON with HTTP

原文

Play通过HTTP API与JSON库共同支持内容类型为JSON的HTTP请求和应答。

关于 Controllers, Actions, 和routing的详细资料看HTTP Programming

我们将通过设计一个简单的RESTful Web服务来解释必要的概念,这个服务可以GET 到实体集合,并接收POSTs 创建新的实体。并且这个服务将对所有的数据使用JSON类型。

这是我们在我们的服务中将使用的模型:

case class Location(lat: Double, long: Double)

case class Place(name: String, location: Location)

object Place {  
var list: List[Place] = {  
List(  
Place(  
"Sandleford",
Location(51.377797, -1.318965)  
),
Place(  
"Watership Down",
Location(51.235685, -1.309197)  
)
)
}

继续阅读»»»

JSON basics[翻译]

现代的Web应用经常需要解析并生成JSON格式的数据 (JavaScript 对象符号)。Play通过它的JSON library支持这个功能。

JOSN是一个轻量级的数据交换格式,像下面这样:

{
"name" : "Watership Down",
"location" : {
"lat" : 51.235685,
"long" : -1.309197
},
"residents" : [ {
"name" : "Fiver",
"age" : 4,
"role" : null
}, {
"name" : "Bigwig",
"age" : 6,
"role" : "Owsla"
} ]
}

想学习更多关于JSON的知识,详见json.org.

Play的JSON库

play.api.libs.json 包包含了为展示JSON数据的数据结构及这些数据结构和其他数据展现实现之间的实用工具。这个包的一些功能是:

  • 使用最小样板自动转换为Case类和从Case类转换为JSON。如果你想用最小的代码快速的起步和运行,这可能是个开始的地方
  • 解析时自定义验证。
  • 在请求Bo

继续阅读»»»

服务端I/O性能大比拼:Node、PHP、Java和Go

原文请见:Server-side I/O Performance: Node vs. PHP vs. Java vs. Go

理解应用程序的输入/输出(I/O)模型,意味着其在计划处理负载与残酷的实际使用场景之间的差异。若应用程序比较小,也没有服务于很高的负载,也许它影响甚微。但随着应用程序的负载逐渐上涨,采用错误的I/O模型有可能会让你到处踩坑,伤痕累累。

正如大部分存在多种解决途径的场景一样,重点不在于哪一种途径更好,而是在于理解如何进行权衡。让我们来参观下I/O的景观,看下可以从中窃取点什么。

在这篇文章,我们将会结合Apache分别比较Node,Java,Go,和PHP,讨论这些不同的语言如何对他们的I/O进行建模,各个模型的优点和缺点,并得出一些初步基准的结论。如果关心你下一个Web应用的I/O性能,那你就找对文章了。

I/O基础知识:快速回顾

为了理解与I/O密切相关的因素,必须先来回顾在操作系统底层的概念。虽然不会直接处理这些概念的大部分,但通过应用程序的运行时环境你一直在间接地处理他们。而关键在于细节。

系统调用

首先,我们有系统


继续阅读»»»

Body parsers[翻译]

什么是Body解析器?

一个HTTP请求是一个HTTP头后面跟着Body,这个头通常比较小——它可以安全的缓存在内存中,因此在Play中使用RequestHeader 类模仿头。而Body有可能很长,因此不能在内存中缓存,而是使用一个流来模仿。

但是,许多请求Body的有效负载比较小,可以缓存到内存中,因此在缓存中映射Body流到一个对象,Play提供了一个 BodyParser 抽象。

由于Paly是一个异步框架,因此传统的 InputStream不能被用来读Body请求——当你调用read时,输入流会被阻塞掉,线程要调用它就必须等到数据可用时。作为替代,Play使用了一个叫做 Akka Streams的异步流库。

Akka Streams是 Reactive Streams的实现,Reactive Streams是一个允许许多异步流API无缝地一起工作的SPI,因此尽管一般的基于基础技术的 InputStream不合适在Play中使用,但是Akka Streams和Reactive Streams相关的整个异步库生态系统将提供给你任何你想要的。

更多关于Actions


继续阅读»»»

Session and Flash scopes[翻译]

在Play中的Session and Flash scopes有什么不同

如果你想跨多个HTTP请求存储数据,你需要把它们存储到Session或者Flash scopes中。在Session中的数据存储在整个用户Session周期可用,在Flash scope 存储的数据仅在下次请求时可用。

理解Session 和Flash数据不是存储在服务端而是使用Cookie机制添加到每一个随后的HTTP请求中这一点很重要。这意味着数据大小是非常有限的(最大4K),并且你只能存储String类型的值。Cookie的默认名是 PLAY_SESSION。这可以在应用的配置文件中修改Key

如果Cookie的名字被修改,可以使用在设置和清除Cookie中提到的方法清除之前的Cookie。

当然,由于Cookie值使用了秘钥签名因此客户端不能修改Cookie的数据(或者数据会无效)

Paly没有打算把 Session当缓存用。如果你需要缓存一些与特定Session相关的数据,你可以使用Play内置缓存机制,在用户Session存储一个唯一ID,让这些数据与特定的用户相关联。

默认


继续阅读»»»