热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

REST的架构设计与实现

原网址:http:www.cnblogs.comcxtczzyarchive201212202827144.htmlREST(RepresentationalStateTransf

原网址:http://www.cnblogs.com/cxtczzy/archive/2012/12/20/2827144.html

REST(Representational State Transfer)是一种轻量级的Web Service架构风格,其实现和操作明显比SOAP和XML-RPC更为简洁,可以完全通过HTTP协议实现,还可以利用缓存Cache来提高响应速度,性能、效率和易用性上都优于SOAP协议。

  REST架构遵循了CRUD原则,CRUD原则对于资源只需要四种行为:Create(创建)、Read(读取)、Update(更新)和Delete(删除)就可以完成对其操作和处理。这四个操作是一种原子操作,即一种无法再分的操作,通过它们可以构造复杂的操作过程,正如数学上四则运算是数字的最基本的运算一样。

REST架构让人们真正理解我们的网络协议HTTP本来面貌,对资源的操作包括获取、创建、修改和删除资源的操作正好对应HTTP协议提供的GET、POST、PUT和DELETE方法:

1) 使用HTTP POST方法去创建 资源

2) 使用HTTP GET方法去读取 资源

3) 使用HTTP PUT 方法去更新 资源

4) 使用HTTP DELETE方法去删除 资源

因此REST把HTTP对一个URL资源的操作限制在GET、POST、PUT和DELETE这四个之内。这种针对网络应用的设计和开发方式,可以降低开发的复杂性,提高系统的可伸缩性。

  REST的设计准则

  REST架构是针对Web应用而设计的,其目的是为了降低开发的复杂性,提高系统的可伸缩性。REST提出了如下设计准则:

网络上的所有事物都被抽象为资源(resource);

  每个资源对应一个唯一的资源标识符(resource identifier);

通过通用的连接器接口(generic connector interface)对资源进行操作;

采用通用的连接器接口HTTP。

  对资源的各种操作不会改变资源标识符;

所有的操作都是无状态的(stateless)。

客户端发送的请求中包含足够多的信息让服务器理解此次请求,而服务器端不保存上下文信息,只负责提供resource以及操作resource的服务,而client要根据resource中的data和representation自己做render,这就减少了服务器的开销。

  使用REST架构

  对于开发人员来说,关心的是如何使用REST架构,这里我们来简单谈谈这个问题。REST不仅仅是一种崭新的架构,它带来的更是一种全新的Web开发过程中的思维方式:通过URL来设计系统结构。REST是一套简单的设计原则、一种架构风格(或模式),不是一种具体的标准或架构。REST有很多成功的使用案例,著名的Delicious和Flickr都提供基于REST风格的API使用,客户端调用也极其方便,下面是我用JSP写的一个很简单的REST举例,从中可以看出REST是多么的简单易用。

客户端脚本采用Javascript:

/*
* 函数名:getTransport
* 功能: 根据不同的浏览器对象创建 XMLHttpRequest对象并返回,如果浏览器不支持该对象,则返回undefined.
*/
function getHttpRequest()
{
var xmlhttp;
try
{
xmlhttp
=new ActiveXObject('Msxml2.XMLHTTP');
}
catch(e)
{
try
{
xmlhttp
= new ActiveXObject('Microsoft.XMLHTTP');
}
catch(e1)
{
xmlhttp
=new XMLHttpRequest();
}

}
return xmlhttp;
}

function httpGet(url,method,data)
{
var httpget=null;
var xmlhttp=getHttpRequest();
xmlhttp.open(method,url
+"?"+data,false);
xmlhttp.setRequestHeader(
"Content-Type", "application/x-www-form-urlencoded");
xmlhttp.setRequestHeader(
"Content-Length",data.length);
xmlhttp.send (
null);
if (xmlhttp.readyState==4)
{

if(xmlhttp.Status ==200)
{httpget
=xmlhttp.responseText;

}
else
{
httpget
="error";
}
xmlhttp
=null;
}

return httpget;
}

function httpPut(url, method, data){
var httpget=null;
var xmlhttp=getHttpRequest();
xmlhttp.open(method,url,
false);
xmlhttp.setRequestHeader(
"Content-Type", "application/x-www-form-urlencoded");
xmlhttp.setRequestHeader(
"Content-Length", data.length);
xmlhttp.send(data);
if (xmlhttp.readyState==4)
{
if(xmlhttp.Status >=400 && xmlhttp.Status <=599)
httpget
="Error Occurred : "& xmlhttp.Status & "-" & xmlhttp.statusText;
else
httpget
=xmlhttp.responseText;
xmlhttp
=null;
}
return httpget;
}


function httpPost(url, method, data){
var httpget=null;
var xmlhttp=getHttpRequest();
xmlhttp.open(method, url,
false);
xmlhttp.setRequestHeader(
"Content-Type", "application/x-www-form-urlencoded");
xmlhttp.setRequestHeader(
"Content-Length",data.length);
xmlhttp.send(data);
if (xmlhttp.readyState==4)
{
if(xmlhttp.Status ==200)
{
httpget
=xmlhttp.responseText;
}
else
{
httpget
="error";
}
xmlhttp
=null;
}

return httpget;
}


function httpDelete(url, method, data){
var httpget=null;
var xmlhttp=getHttpRequest();
xmlhttp.open(method, url
+ "?" + data,false);
xmlhttp.setRequestHeader(
"Content-Type", "application/x-www-form-urlencoded");
xmlhttp.setRequestHeader(
"Content-Length", data.length);
xmlhttp.send(
null);
if (xmlhttp.readyState==4)
{
if(xmlhttp.Status >=400 && xmlhttp.Status <=599)
httpget
="Error Occurred : "& xmlhttp.Status & "-" & xmlhttp.statusText;
else
httpget
=xmlhttp.responseText;
xmlhttp
=null;
}
return httpget;
}

 

 

客户端调用:

 

<%@ page language="java" cOntentType="text/html; charset=UTF-8"
pageEncoding
="UTF-8"%>

















  web.xml配置文件:

httpGet("handlerestquest", "GET", "do=你向服务器发送了GET请求");是发送请求的url与web.xml配置文件中的一致。

中字段值是服务器servlet的类名。

xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns
="http://java.sun.com/xml/ns/javaee"
xmlns:web
="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
xsi:schemaLocation
="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
id
="WebApp_ID"
version
="3.0">
<servlet>
<servlet-name>HandleRestServletservlet-name>
<servlet-class>com.my.RestServletservlet-class>
servlet>
<servlet-mapping>
<servlet-name>HandleRestServletservlet-name>
<url-pattern>/handlerestquesturl-pattern>
servlet-mapping>
web-app>

服务器端: 

package com.my;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.io.*;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;


public class RestServlet extends HttpServlet
{
public void doGet(HttpServletRequest request,HttpServletResponse response)
throws ServletException, IOException
{
//指定 去除客户端页面的缓存
//指定 去除客户端页面的缓存
ClearCache(response);
request.setCharacterEncoding(
"utf-8");
String operation
=new String((request.getParameter("do")).getBytes("iso-8859-1"));
response.setContentType(
"text/html");
response.setCharacterEncoding(
"utf-8");
PrintWriter out
=response.getWriter();
out.println(operation
+"
");
System.out.println(operation);
out.flush();
out.close();
}

public void doPut(HttpServletRequest request,HttpServletResponse response)
throws ServletException, IOException
{
//指定 去除客户端页面的缓存
ClearCache(response);

BufferedReader sis
= request.getReader();
String operation1
=new String(sis.readLine().getBytes("iso-8859-1"),"utf-8");
System.out.println(operation1);
//sb为POST过来的数据
response.setContentType("text/html");
response.setCharacterEncoding(
"utf-8");
PrintWriter out
=response.getWriter();
out.println(operation1
+"
");
out.flush();
out.close();
}

public void doPost(HttpServletRequest request,HttpServletResponse response)
throws ServletException, IOException
{

//指定 去除客户端页面的缓存
ClearCache(response);

String operation
=new String(request.getParameter("do").getBytes("iso-8859-1"),"utf-8");
response.setContentType(
"text/html");
response.setCharacterEncoding(
"utf-8");
PrintWriter out
=response.getWriter();
out.println(operation
+"
");
System.out.println(operation);
out.flush();
out.close();
}

public void doDelete(HttpServletRequest request,HttpServletResponse response)
throws ServletException, IOException
{
doGet(request,response);
}

public void ClearCache(HttpServletResponse response)
{
//指定 去除客户端页面的缓存
response.setHeader("pragma", "no-cache");
response.setHeader(
"cache-control", "no-cache");
response.setHeader(
"expires", "0");
}
}

推荐阅读
  • REST与RPC:选择哪种API架构风格?
    在探讨REST与RPC这两种API架构风格的选择时,本文首先介绍了RPC(远程过程调用)的概念。RPC允许客户端通过网络调用远程服务器上的函数或方法,从而实现分布式系统的功能调用。相比之下,REST(Representational State Transfer)则基于资源的交互模型,通过HTTP协议进行数据传输和操作。本文将详细分析两种架构风格的特点、适用场景及其优缺点,帮助开发者根据具体需求做出合适的选择。 ... [详细]
  • 本文深入探讨了ASP.NET Web API与RESTful架构的设计与实现。ASP.NET Web API 是一个强大的框架,能够简化HTTP服务的开发,使其能够广泛支持各种客户端设备。通过详细分析其核心原理和最佳实践,本文为开发者提供了构建高效、可扩展且易于维护的Web服务的指导。此外,还讨论了如何利用RESTful原则优化API设计,确保系统的灵活性和互操作性。 ... [详细]
  • ABP框架是ASP.NET Boilerplate的简称,它不仅是一个开源且文档丰富的应用程序框架,还提供了一套基于领域驱动设计(DDD)的最佳实践架构模型。本文将详细介绍ABP框架的特点、项目结构及其在Web API优先架构中的应用。 ... [详细]
  • 本文将深入探讨 iOS 中的 Grand Central Dispatch (GCD),并介绍如何利用 GCD 进行高效多线程编程。如果你对线程的基本概念还不熟悉,建议先阅读相关基础资料。 ... [详细]
  • 网站访问全流程解析
    本文详细介绍了从用户在浏览器中输入一个域名(如www.yy.com)到页面完全展示的整个过程,包括DNS解析、TCP连接、请求响应等多个步骤。 ... [详细]
  • 从0到1搭建大数据平台
    从0到1搭建大数据平台 ... [详细]
  • 如何将TS文件转换为M3U8直播流:HLS与M3U8格式详解
    在视频传输领域,MP4虽然常见,但在直播场景中直接使用MP4格式存在诸多问题。例如,MP4文件的头部信息(如ftyp、moov)较大,导致初始加载时间较长,影响用户体验。相比之下,HLS(HTTP Live Streaming)协议及其M3U8格式更具优势。HLS通过将视频切分成多个小片段,并生成一个M3U8播放列表文件,实现低延迟和高稳定性。本文详细介绍了如何将TS文件转换为M3U8直播流,包括技术原理和具体操作步骤,帮助读者更好地理解和应用这一技术。 ... [详细]
  • 能够感知你情绪状态的智能机器人即将问世 | 科技前沿观察
    本周科技前沿报道了多项重要进展,包括美国多所高校在机器人技术和自动驾驶领域的最新研究成果,以及硅谷大型企业在智能硬件和深度学习技术上的突破性进展。特别值得一提的是,一款能够感知用户情绪状态的智能机器人即将问世,为未来的人机交互带来了全新的可能性。 ... [详细]
  • 为了评估精心优化的模型与策略在实际环境中的表现,Google对其实验框架进行了全面升级,旨在实现更高效、更精准和更快速的在线测试。新的框架支持更多的实验场景,提供更好的数据洞察,并显著缩短了实验周期,从而加速产品迭代和优化过程。 ... [详细]
  • 深入解析 Vue 中的 Axios 请求库
    本文深入探讨了 Vue 中的 Axios 请求库,详细解析了其核心功能与使用方法。Axios 是一个基于 Promise 的 HTTP 客户端,支持浏览器和 Node.js 环境。文章首先介绍了 Axios 的基本概念,随后通过具体示例展示了如何在 Vue 项目中集成和使用 Axios 进行数据请求。无论你是初学者还是有经验的开发者,本文都能为你解决 Vue.js 相关问题提供有价值的参考。 ... [详细]
  • Ceph API微服务实现RBD块设备的高效创建与安全删除
    本文旨在实现Ceph块存储中RBD块设备的高效创建与安全删除功能。开发环境为CentOS 7,使用 IntelliJ IDEA 进行开发。首先介绍了 librbd 的基本概念及其在 Ceph 中的作用,随后详细描述了项目 Gradle 配置的优化过程,确保了开发环境的稳定性和兼容性。通过这一系列步骤,我们成功实现了 RBD 块设备的快速创建与安全删除,提升了系统的整体性能和可靠性。 ... [详细]
  • REST API 时代落幕,GraphQL 持续引领未来
    尽管REST API已广泛使用多年,但在深入了解GraphQL及其解决的核心问题后,我深感其将引领未来的API设计趋势。GraphQL不仅提高了数据查询的效率,还增强了灵活性和性能,有望成为API开发的新标准。 ... [详细]
  • spring cloud微服务实战 pdf_springcloud微服务架构开发实战:常见微服务的消费者
    常见微服务的消费者本节就常见的微服务的消费者进行介绍。在Java领域比较常用的消费者框架主要有HttpClient、Ribbon、Feign等。ApacheHttpClientAp ... [详细]
  • 谈起RESTFUL大家未免都耳熟能详,但是要介绍一下它是什么,可能就是停留在听过或者见过的阶段了。一贯喜欢以通俗的语言来消化知识的小马自然不会放过它了& ... [详细]
  • 之前学习过get信息的方法,就是通过接口得到数据,然后对数据进行处理json处理和xml处理最近学习了post,所以小小的总结一下先说一下使用系统的NSURLConnectio ... [详细]
author-avatar
手机用户2502937963
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有