REST和SOAP Web Service的区别比较

REST和SOAP Web Service的区别比较,第1张

万维网联盟指出,REST是一个如何构建Web服务的模型。REST Web是WWW(基于HTTP)的子集,其中代理提供统一的接口语义,本质上是创建,检索,更新和删除,而不是任意或特定于应用程序的接口,并且仅通过交换表示来操纵资源。那么,现在我们知道REST是什么了,作者将简要列出Roy Fielding在其论文的第五章中提到的所有约束:

客户端-服务器:以这样的方式实施服务:将用户界面关注点(客户端获得可移植性)与数据存储关注点(服务器获得可伸缩性)分离开来。无状态:在客户端和服务器之间实现通信时,服务器在处理请求时永远不会利用储存在服务器上下文中的任何信息,而与会话相关的所有信息都存储在客户端中。缓存:当可以(隐式或显式)缓存请求的响应时,客户端应获取缓存的响应。统一接口:所有REST服务都应依赖组件之间相同的统一设计。接口应与提供的服务解耦。分层系统:客户端永远不知道它们是直接连接到服务器还是连接到某些中间服务器。例如,请求可以通过代理,该代理具有负载平衡或共享缓存的功能。

cs16服务器架设

一、基本安装篇

1、建立服务器的带宽和机器配置

16服务器对对带宽和机器配置的要求比15高一些,我在ADSL上通过浩方平台建立15服务器,可以在本机上进行游戏,但是16出现明显的停顿,无法流畅的游戏,即使机器配置很高也不能彻底解决,相信带宽是最大的瓶颈。

因此,使用ADSL或者机器配置一般的cser建议不要在本机上建立服务器,用lan的cser在本机上建立服务器效果也不会太理想(除非你只想提供一个服务器,过一把OP的瘾,呵呵)。

2、16服务器版本

我收集有6个版本的cs16,通过试用,个人认为esai2738经典版是最好的,只有200M,同时包括了建立服务器的必要组件,用来游戏与经典版建立的服务器能够很好的兼容。

下载地址:bt种子下载

3、下载完毕后,点击桌面的快捷方式‘Cs16服务器’,自己的服务器就开始工作了,就这么简单?!呵呵。不要只扔西红柿,再来几个鸡蛋,鸡蛋西红柿:)

这只是第一步。看看下边吧:

二、设置篇

1、右键打开桌面快捷方式的属性:

×:\Cs16中文版\hldsexe -game cstrike -port 27016 +maxplayers 16 +map de_dust2 -console +localinfo mm_gamedll dlls/hldsmpdll

其中27016为服务器端口,可以进行修改;

maxplayers 16为最大人数,可以自由变更,别超过32;

开始地图de_dust2可以更换成你喜欢的地图;

+localinfo mm_gamedll dlls/hldsmpdll指你的游戏用哪个dll启动(很多人反映没有新特性,就是由于你的dll没设置好)

其他的参数建议不要更改。

2、反作弊软件的选择

很多自己建立了服务器的cser会发现无法进入游戏,或者进入后很快被踢出,我在开始建立服务器的时候也遇到了类似问题。查考了大量资料后,我认为是反作弊软件的冲突造成的。一般情况下,我们认为cd比vac要强,会自然想打开服务器的cd反作弊插件,或者进入游戏前打开cd。此时,以上问题就出现了。

因此,我们需要将cs的cd插件关掉:

打开\cstrike\addons\metamod\pluginsini,在“win32 addons/cdeath/cdmoddll”前加上//,

即“//win32 addons/cdeath/cdmoddll”。

进入服务器前也不要打开cd。

安装vac,打开cstrike\liblistgam,将设置成secure "1",一般情况下,安装完毕默认是打开的,如果关闭可以将1改为0。

wwcl是杜绝修改脚本作弊的插件,打开cstrike\addons\metamod\pluginsini,其中win32 addons/wwcl/dlls/pcawwclconfig_mmdll即为打开,可以在前面加上//将其关闭。

建议:打开vsm和wwcl,可在一定程度上防止作弊。

3、服务器中amx插件的使用

可以说,amx插件对15而言是成熟的,在16上使用是不是有冲突还不敢肯定,因此建议不要安装过多的amx插件。

我的amx插件:

; AMX Mod plugins

adminamx admin base (required for any admin-related)

;admin_mysqlamx admin base - MySQL version (comment adminamx)

admincmdamx basic admin console commands

adminhelpamx help command for admin console commands

adminslotsamx slot reservation

menufrontamx front-end for admin menus

cmdmenuamx command menu (speech, settings)

plmenuamx players menu (kick, ban, client cmds)

restmenuamx restrict weapons menu

mapsmenuamx maps menu (vote, changelevel)

antifloodamx prevent clients from chat-flooding the server

adminchatamx console chat commands

adminvoteamx vote commands

nextmapamx displays next map in mapcycle

timeleftamx displays time left on map

mapchooseramx allows to vote for next map

scrollmsgamx displays a scrolling message

imessageamx displays information messages

welcomemsgamx console motd @ client connection

statsamx stats on death or round end (CSStats Module required!)

stats_loggingamx weapons stats logging (CSStats Module required!)

telemenuamx teleport menu (Fun Module required!)

miscstatsamx bunch of events announcement for Counter-Strike

pausecfgamx allows to pause and unpause some plugins

statscfgamx allows to manage stats plugins via menu and commands

;ucstats_cstrikeamx i love you

;ucstats_liveamx hehe heh

;goreamx 44hehe

amx_restrictshieldsamx

前面加;的为禁止的。最后一个为禁用盾牌插件。

PS:看着服务器中一堆拿着盾牌的家伙,感觉实在是不爽:)

下载amx以前的版本安装,amx点击下载

免盾牌amx程序amx插件,解压后拷贝到\cstrike\addons\amx目录下,覆盖源文件。

完成后,可以自己考虑使用那些插件:打开\cstrike\addons\amx\plugins\pluginsini,进行修改。

4、服务器的一般设置

首先要设置你的服务器基本参数、OP密码等。

打开\cstrike\servercfg

sv_password "" 设置玩家进入你的服务器是否需要密码,在""中加上你的密码。

rcon_password "" 设置远程控制OP密码。

hostname "BeiJing JiaoDaJiaYuan cs16 Server" 设置你的服务器名称

sv_maxrate 10000

sv_minrate 1000

sv_maxspeed 320 以上三个为服务器网络连接参数,不建议修改

pausable 0 是否允许暂停游戏 禁止0/允许1

sv_cheats 0 作弊模式 关闭0/开启1,谁会开呢,呵呵

sv_aim 0 自动瞄准 关闭0/开启1

mp_flashlight 1 战术手电 允许1/禁止0

mp_footsteps 1 脚步声 开启1/关闭0

mp_falldamage 1 高处落下伤害 开启1/关闭0

mp_autokick 1 自动踢出不动的玩家 开启1/关闭0

allow_spectators 1 观察员模式 开启1/关闭0

sv_restartround 0 服务端设定游戏复位的时间,包括杀人数、武器、金钱和得分。设0不复位。建议设置为0,不要改。

mp_timelimit 450 每局时间,以分钟计。

mp_freezetime 3 购买武器冻结时间 (0-45)建议5秒以内。

mp_roundtime 3 每回合几分钟,一般为3

mp_buytime 025 购买武器装备时间(025-15)即15秒-90秒

mp_c4timer 35 c4炸弹倒计时时间 (15-75)

mp_startmoney 800 开始游戏时的金钱数量(800-16000)

mp_forcechasecam 2 死亡后视角 1本队队友 2原地 0无限制

mp_chasecam 1 死亡后视角模式 0自由跟随/1固定跟随

mp_fadetoblack 0 人物死亡后屏幕 不变黑0/变黑1

mp_friendlyfire 0 友军误伤 关闭0/开启1,如果是混战服务器,建议设置为0,无聊的人很多:)

mp_friendly_grenade_damage 1 手雷友军伤害 关闭0/开启1

mp_tkpunish 0 杀害友军惩罚 0不惩罚/1惩罚:杀害队友超过(1-n)人,下一回合自动死亡

mp_autoteambalance 1 自动调整双方队伍平衡 不调整0/调整(1-n)个人

mp_limitteams 2 双方人数差超过n人即自动调整人数差异 0关闭

mp_hostagepenalty 0 杀害人质惩罚 0不惩罚/惩罚:规定时间内伤害人质超过(1-n)人自动踢出

mp_fraglimit 0 杀人数、得分上限 无0/有(1-n),超过上限就换地图。

mp_winlimit 0 胜利次数上限无0/有(1-n),超过上限就换地图。

mp_maxrounds 0 回合上限 无0/有(1-n),超过上限就换地图。

sv_allowdownload 1 允许下载 开启1/关闭0

sv_send_logos 1 允许下载(sv_allowdownload 1)开启时控制是否允许玩家的LOGO传送 允许1/禁止0

sv_send_resources 1 允许下载(sv_allowdownload 1)开启时控制是否允许资源文件传送 允许1/禁止0

sv_allowupload 1 允许上传 关闭0/开启1

sv_gravity 800 服务器重力设置 默认正常重力800,范围-999到99999,想享受一下玩家飘在空中的‘美景’,可以修改,^_^

mp_mapvoteratio 06 投票比率(大家可以通过投票踢出作弊者和更换地图) (01-1)

mp_ghostfrequency 01 设定鬼魂模式刷新值(01-1)

sv_sendvelocity 0服务器高品质纹理 关闭0/开启1

mp_lowlag 1服务器减少LAG延迟现象(对服务器要求高) 关闭0/开启1

mp_decals 300服务器细节数据发送 默认300 ,可减低到250、200,改善速度。

sv_voiceenable 1 服务器是否允许麦克风语音通讯 允许1/禁止0

sv_alltalk 0 服务器是否允许客户端之间使用语音通信 允许1/禁止0

sv_region 4 设置你的服务器为亚洲地区,玩家刷新的时候更方便找到你的服务器。

mp_logfile 0服务器是否记录文件 不记录0/记录1

mp_logmessages 0 是否在记录文件里记录谈话内容 不记录0/记录1

// load ban files

ex-ec listipcfg

ex-ec bannedcfg

进入别人的服务器看到一些有意思的欢迎画面和欢迎词,自己也可以做。

打开\cstrike\motdtxt,里面可以只是文本文件,想写的都写上吧,注意不要太多就OK了。如果你想换成你的网址和logo,可以在其中修改。把你的logo文件放到\cstrike目录下,修改amx_imessage "Welcome to %hostname% Please Enjoy Yourself :]" "255100000"

amx_imessage "Please Have Fun in %hostname%

More Info Please Visit http://wwwjdjycom" "000100255"

amx_imessage "say /sbwill be kick" "255100000"

amx_imessage "Don't Camp Don't Teamkiller Don't Runaway" "255100000" clanmod风格的服务器MOTD彩色信息,后面的颜色RGB代码可以自己修改

7、服务器的管理 526增加内容

服务器管理强烈建议使用hlsw,如果你开通了amx功能,可以通过hlsw实现kick作弊者、slap玩家、banIP等。

8、再次增加紧急提示内容:526

如果你安装了amx就可能存在一个严重问题,就是服务器的最大玩家人数会发生变换,玩家进入的时候明明有空位,但是会显示被kick无法进入。

这是因为amx为OP预留了通道,但一般情况下我们根本用不到。

解决办法:打开×:\Cs16中文版\cstrike\addons\amx\amxcfg

修改amx_reserved_slots 0 // 预留的管理员通道(默认预留1个位置给OP),将1或2改为0就ok了。

9、你的机器够劲吗?想开两个服务器??605增加内容

安装后,在桌面有一个‘16服务器’的快捷方式,一般情况下默认使用27016端口。如果想在同一台机器上建立两个服务器,不用再装一套服务器软件。在桌面‘16服务器’图标上点击右键,选择‘发送到桌面快捷方式’。此时在桌面上出现了另外一个16服务器的快捷方式。用以上介绍的办法,将这个快捷方式的端口改为27017或者你想要的端口号。

ok了,此时你就可以开通两个不同端口号的服务器了。

但是,存在一个小问题,就是两个新建服务器使用同一套配置文件,服务器名、基本设置都是一样的,怎么区分呢?如果我想改变其中一个的op密码又怎么办呢?

10、不同端口服务器使用不同的配置文件(servercfg)

在9中,我们建立了两个或者更多个服务器,怎么让他们使用不同的配置文件呢?

在桌面启动图标的属性中,加上一个指定servercfg的参数:

+servercfgfile server2cfg 其中server2cfg名称、内容你可以自己改。

servercfg在\cstrike\目录下,你可以用复制的方法创建几个severcfg文件,内容请参考上面内容自己修改。

三、游戏端版本的选择

强烈建议下载esai2738版本,免去升级的麻烦。

如果你有以前的白金版或者其他版本(2569),可以通过升级来解决无法进入服务器的问题。升级时注意先2569-2688-2705-2738,至于为什么要顺序升级我也不清楚。先安装2688升级程序点击下载,再安装2717升级程序点击下载2717-2738升级程序,点击下载。2738最新升级程序5、4放出,点击下载,对于其中的直接覆盖的版本,注意备份你的原文件。

升级中注意安装路径:

安装升级包到 x:\Esai Cs16 完全版

而不是x:\Esai Cs16 完全版\Esai Cs16 完全版或者 x:\Esai Cs16 完全版\Cstrike\

当然如果你在安装时自定义了安装目录,那就要根据你的情况作调整。

这里一定要注意安装路径,安装在你的cs16第一层目录下,里面的文件有swdsdll,可以先看一下。安装成功了吗?进入游戏,不要看显示的版本号,而是在按~呼出控制台,输入version,应该显示2738。如果你的没有显示2705,说明安装存在问题,请重新安装升级包。

提示:上文中提到的cfg gam/ini文件均可用记事本打开进行编辑。

526新增内容。

新增内容。

如要转贴,请您跟贴说明,并保留我的服务器内容。

交大嘉园cs16服务器:

2039363225:27016 1#服务器pub

2039363225:27017 2#服务器

2039363251:27016 1#比赛服务器

2039363251:27017 2#比赛服务器

gaga

五:端口映射相关及图解

1关于内网机器(如网吧局域网的机器)建立公网cs服务器之端口问题,前提是内网主机或本机有公网ip

对于此类局域网机子建立的cs服务器,局域网的玩家由“局域网游戏”进,外部网的玩家由“网上对战”进!开启的cs服务器启动参数:

-game cstrike -port 27016 +maxplayers 22 -nomaster -noipx -insecure +map de_dust2 +sv_lan 1

下载ⅠⅡ端口映射图解说明

http://bbsesaicn/indexphpact=Attach&typost&id=1480253

Ⅰ双网卡internet连接共享主机设置

要安装PortTunnel_CHS软件,(其他的我没用过,呵呵)在主机(比如网吧主机)

安装SP1以上补丁,简单的就安装ie6;接着安装MicrosoftNET Framework;

最后安装PortTunnel软件。

Ⅱ单网卡路由器主机设置

2ADSL用户、小区宽带(首先要有公网ip)

开启的cs服务器启动参数:

-game cstrike +ip 218281922 -port 27015 +maxplayers 22 -nomaster -noipx -insecure +map de_dust2 +sv_lan 1

把里面的ip改为当时cs服务器在互联网上的ip

如需要绑定cs服务器ip地址则需申请一个动态解析域名并安装其客户端,具体在哪些网站申请域名大家知道的可以跟帖交流一下,呵呵

我很久没弄此类服务器了!

由于REST可以降低开发的复杂度,提高系统的可伸缩性,增强系统的可扩展性,简化应用系统之间的集成,因而得到了广大开发人员的喜爱,同时得到了业界广泛的支持。比如IBM,Google等公司的很多产品都提供了REST API给开发人员;与此同时,大量的开源项目和云计算服务都提供了REST API接口。

而在最近,一些新产品的开发甚至已经几乎完全抛弃了传统的类似JSP的技术, 转而大量使用REST风格的构架设计, 即在服务器端所有商业逻辑都以REST API的方式暴露给客户端, 所有浏览器用户界面使用widget、Ajax、HTML5 等技术,用HTTP的方式与后台直接交互。

那么, 在REST API爆炸式增长的今天, 我们应该如何更好的设计我们的接口, 来提高我们的API的可用性,易用性,可维护性与可扩展性呢?本文将从以下方面与您探讨REST API设计方面的最佳实践:

如何规划资源标识结构与URI模式

如何根据应用场景提供内容协商

如何正确的使用HTTP响应代码

如何处理缓存和并发请求

如何利用数据冗余和链接元素

先决条件

如果您具有如下知识与经验,将有助于您阅读和理解本文章的内容 。

REST相关的基本知识;

HTTP协议的基本知识;

一定的Web开发经验。

REST简介

REST是英文 State Transfer的缩写,是近年来迅速兴起的,一种基于HTTP、URI以及XML这些现有协议与标准的,针对网络应用的设计和开发方式。它可以降低开发的复杂度,提高系统的可伸缩性。

REST的核心是可编辑的资源及其集合,用符合Atom文档标准的Feed和Entry表示。每个资源或者集合有一个惟一的URI。系统以资源为中心,构建并提供一系列的Web服务。REST的基本概念和原则包括:系统上的所有事物都被抽象为资源;每个资源对应唯一的资源标识;对资源的操作不会改变资源标识本身;所有的操作都是无状态的;等等。

在REST中,开发人员显式地使用HTTP方法,对系统资源进行创建、读取、更新和删除的操作:

使用POST方法在服务器上创建资源

使用GET方法从服务器检索某个资源或者资源集合

使用PUT方法对服务器的现有资源进行更新

使用DELETE方法删除服务器的某个资源

图 1 用 HTTP 方法操作相册系统资源的简单范例

更好的规划你的资源标识结构与URI模式

REST 中,最基本的莫过于资源标识结构和URI模式了。更好的规划他们,是我们的API设计取得成功的最关键的一步。

首先,我们来看看基本资源类型

上文中提到,在REST构架的设计中,系统中的所有事物都被抽象为资源。

在一个文档系统中,文档、目录、注释、草稿等等,是组成系统的资源。

在一个银行系统中,客户信息、理财产品、利率信息、网点信息等等,是组成系统的资源。

在一个航空客票系统中,旅客信息、机票订单、航班信息、机场信息等等,是组成系统的资源。

这些资源,通常在系统中以“Entry”的形式出现。下面的代码样例向您展示了一个常见的“Entry”资源。

清单 1 一个简单的Entry资源样例

以下是引用片段:

REST API 请求:

GET example/航班信息/CA827/entry

CA827

CA827

2010-08-24T02:35:40937Z

2010-08-24T02:35:40937Z

Beijing

Changsha

09:30:00

AB330

我们会注意到,这些资源,在描述了某种事物的同时,还有可能存在一定的层次结构关系。比如,文档从属于某个目录,注释从属于文档;旅客信息可以从属于机票订单,也可以从属于某个航班。

当我们的资源有这种层次关系的时候,我们不妨在URI模式的设计中,用复合的URI来帮助开发者更好的理解和设计资源。

比如, 针对一个文档的评论, 他的URI模式可以设计成如下:/文件夹/[文件夹名]/文件/[文件名]/评论/[ 评论唯一标示 ]。 这样,在构造和解析URI的过程中, 可以帮助开发者更好的理解系统,设计程序。

其次,我们来看看集合资源类型

资源,除了作为独立个体可以被访问,还可以由多个个体组合成一个集合,在系统中,通常以“feed”的形式存在。资源的集合, 可以是处于相同层次上,有相同从属关系的一组资源,比如一个文件夹下的所有文件; 也可以是根据某种条件查询出来的查询结果的资源集合,比如所有30岁以上40岁以下,拥有100万资产以上客户的名单。

下面,我们来讨论一下设计集合类型资源的REST API时需要考虑的问题。

使用过滤条件来帮助用户更准确地获取数据

我们要返回的资源集合,无论是否有相同从属关系,大部分时候都需要进行必要的过滤,提供足够的过滤参数,查询参数, 能够帮助开发者高效的,准确地获取所需要的数据。 在服务器端过滤数据通常比客户端高效,并且减少了不必要的数据传输,可以大大减少网络开销,提高执行效率。

最常见的过滤条件,是通过URL参数实现,比如/环境工程系/学生籍贯=北京&性别=女。

很多时候,我们需要制定更加复杂的过滤条件,那么我们可以有两种选择:

首先,我们可以使用正则表达式或者服务器可以理解的语法,比如/环境工程系/学生filter=age between (15, 18)

其次,我们还可以使用POST方法,携带一个文件来描述复杂的查询条件,文件的格式与语法通常需要在服务器端有相应的设计与定义。不过通常POST方法没有缓存机制,因此不是查询数据的首选。

使用排序来帮助客户端更好的展现数据

虽然进行客户端排序对于开发者来说是件轻而易举的事情,但是直接得到已经排序的返回结果,仍然是大部分开发者所期望的。尤其是很多时候,我们在浏览器,使用 Widget 展示结果,不适宜在客户端存储大量数据进行内存排序。

排序, 通常有2个参数,一个是用来排序的字段,一个是排序的升序降续方式。比如我们可以用支持这样的参数组合的手段,提供基本的排序能力:sortOrder=asc&sortField=age

使用分页来帮助客户端处理大量数据

由于返回的结果可能有几百几千条记录,将这些记录一次性的返回给客户端是不现实的,巨大的网络流量开销和客户端数据区的内存开销,都是我们在应用开发的时候不希望看到的,因此,如果你的集合资源有可能有大量的数据返回,请务必提供分页的功能支持。

我们通常用一个以上参数来制定一个返回结果的区域,比较常见的有下面两种:

一种常见于用固定行数的表格来展示数据,用当前处于第几页和每页返回多少行数据来确定需要的数据, 比如/所有学生page=5&pagesize=50

另外一种常见于用更加灵活的界面展示数据,用从第几行开始,一共返回多少行数据来确定需要的数据, 比如/所有学生startIndex=27&count=22

下面是一个来自IBM 的API样例,尝试请求该API,你可以看到该集合很好的支持了结果的分页与排序。同时我们从返回的信息中可以看到,每个文档Entry的URI都按照/社区库/[社区库ID]/文档/[文档ID]的复合URI的模式设计的。

清单 2 IBM 的某个社区文件库的集合资源的API

以下是引用片段:

REST API 请求:

GETIBM 的文件服务标签云的API

以下是引用片段:

REST API请求,要求返回XML格式数据:

GETibm//

/files/form/anonymous/api/tags/feedformat=json

&scope=document&pageSize=30&sK=cloud&sO=dsc

使用Aept头进行内容协商

使用URL参数,简单灵活,但是也由此带来了设计上的随意和不标准。并且,过多的参数会导致URL的可读性变差,更有甚者,可能会导致URL过长,超出规范,API请求无法执行。

更为标准的内容协商方式是使用HTTP头。我们通常使用Aept来设置我们接受的返回结果的内容格式,用Aept-Charset来设置字符集,用Aept-Encoding来设置数据传输格式,用Aept-Language来设置语言。

使用URI模式进行内容协商

还有一种模式,就是将协商设置直接作为URI的一部分,将不同的返回视为不同的资源,比如/航班号/json来返回JSON格式的结果,用/航班号/atom来返回ATOM格式的结果。

正确的使用HTTP响应代码

作为API的设计者,正确的将API执行结果和失败原因用清晰简洁的方式传达给客户程序是十分关键的一步。 我们确实可以在HTTP的相应内容中描述是否成功,如果出错是因为什么, 然而, 这就意味着用户需要进行内容解析,才知道执行结果和错误原因。因此,HTTP响应代码可以保证客户端在第一时间用最高效的方式获知API运行结果,并采取相应动作。

转载,仅供参考,祝你愉快,。

一个好的RESTful API,应该具备以下特征:

  这个API应该是对浏览器友好的,能够很好地融入Web,而不是与Web格格不入。

  1浏览器是最常见和最通用的REST客户端。好的RESTful API应该能够使用浏览器+HTML完成所有的测试(不需要使用编程语言)。这样的API还可以很方便地使用各种自动化的Web功能测试、性能测试工具来做测试。Web前端应用(基于浏览器的RIA应用、移动App等等)也可以很方便地将多个RESTful API的功能组合起来,建造Mashup类的应用。

  这个API中所包含的资源和对于资源的操作,应该是直观和容易理解的,并且符合HTTP协议的要求。

  REST开发又被称作“面向资源的开发”,这说明对于资源的抽象,是设计RESTful API的核心内容。RESTful API建模的过程与面向对象建模类似,是以名词为核心的。这些名词就是资源,任何可命名的抽象概念都可以定义为一个资源。而HTTP协议并不是一种传输协议,它实际提供了一个操作资源的统一接口。对于资源的任何操作,都应该映射到HTTP的几个有限的方法(常用的有GET/POST/PUT/DELETE四个方法,还有不常用的PATCH/HEAD/OPTIONS方法)上面。所以RESTful API建模的过程,可以看作是具有统一接口约束的面向对象建模过程。

  按照HTTP协议的规定,GET方法是安全且幂等的,POST方法是既不安全也不幂等的(可以用来作为所有写操作的通配方法),PUT、DELETE方法都是不安全但幂等的。将对资源的操作合理映射到这四个方法上面,既不过度使用某个方法(例如过度使用GET方法或POST方法),也不添加过多的操作以至于HTTP的四个方法不够用。

  2如果发现资源上的操作过多,以至于HTTP的方法不够用,应该考虑设计出更多的资源。设计出更多资源(以及相应的URI)对于RESTful API来说并没有什么害处。

  这个API应该是松耦合的。

  RESTful API的设计包括了三个循序渐进、由低到高的层次:资源抽象、统一接口、超文本驱动。正是这三个层次确保了RESTful API的松耦合性。

  3当设计面向互联网的API时,松耦合变成了一种“必须有”的强需求。紧耦合的API非常脆弱,一旦公布出去,服务器端和客户端都无法持续进化。尤其是服务器端,公布出去的接口根本不敢改,改了之后,几乎所有客户端应用立即无法正常工作。REST这种架构风格就是紧耦合API的解毒剂,这个话题可以谈的很深,这里就不展开了。感兴趣的读者可以参考《REST实战》。

  这个API中所使用的表述格式应该是常见的通用格式

  在RESTful API中,对于资源的操作,是通过在服务器端-客户端之间传递资源的表述来间接完成的。资源的表述可以有很多种格式,并且在响应和请求中的资源表述格式也会有所不同。GET/POST响应中的资源表述格式,常见的有HTML、XML、JSON;POST/PUT请求中的资源表述格式,常见的有标准的HTML表单参数、XML、JSON。

  4这些常见表述格式,处理起来非常容易,有大量的框架和库提供支持。所以除非有很合理的要求,通常不需要使用自定义的私有格式。

  使用HTTP响应状态代码来表达各种出错情况

  HTTP响应状态代码,是HTTP协议这个统一接口中用来表达出错情况的标准机制。响应状态代码分成两部分:status code和reason phase。两部分都是可定制的,也可以使用标准的status code,只定制reason phase。

  5如果一个所谓的“RESTful API”对于任何请求都返回200 OK响应,在响应的消息体中返回出错情况信息,这种做法显然不符合“确保操作语义的可见性”这个REST架构风格的基本要求。

  这个API应该对于HTTP缓存是友好的

一、基本安装篇

1、建立服务器的带宽和机器配置

16服务器对对带宽和机器配置的要求比15高一些,我在ADSL上通过浩方平台建立15服务器,可以在本机上进行游戏,但是16出现明显的停顿,无法流畅的游戏,即使机器配置很高也不能彻底解决,相信带宽是最大的瓶颈。

因此,使用ADSL或者机器配置一般的cser建议不要在本机上建立服务器,用lan的cser在本机上建立服务器效果也不会太理想(除非你只想提供一个服务器,过一把OP的瘾,呵呵)。

2、16服务器版本

我收集有6个版本的cs16,通过试用,个人认为esai2738经典版是最好的,只有200M,同时包括了建立服务器的必要组件,用来游戏与经典版建立的服务器能够很好的兼容。

下载地址:bt种子下载

3、下载完毕后,点击桌面的快捷方式‘Cs16服务器’,自己的服务器就开始工作了,就这么简单?!呵呵。不要只扔西红柿,再来几个鸡蛋,鸡蛋西红柿:)

这只是第一步。看看下边吧:

二、设置篇

1、右键打开桌面快捷方式的属性:

×:\Cs16中文版\hldsexe -game cstrike -port 27016 +maxplayers 16 +map de_dust2 -console +localinfo mm_gamedll dlls/hldsmpdll

其中27016为服务器端口,可以进行修改;

maxplayers 16为最大人数,可以自由变更,别超过32;

开始地图de_dust2可以更换成你喜欢的地图;

+localinfo mm_gamedll dlls/hldsmpdll指你的游戏用哪个dll启动(很多人反映没有新特性,就是由于你的dll没设置好)

其他的参数建议不要更改。

2、反作弊软件的选择

很多自己建立了服务器的cser会发现无法进入游戏,或者进入后很快被踢出,我在开始建立服务器的时候也遇到了类似问题。查考了大量资料后,我认为是反作弊软件的冲突造成的。一般情况下,我们认为cd比vac要强,会自然想打开服务器的cd反作弊插件,或者进入游戏前打开cd。此时,以上问题就出现了。

因此,我们需要将cs的cd插件关掉:

打开\cstrike\addons\metamod\pluginsini,在“win32 addons/cdeath/cdmoddll”前加上//,

即“//win32 addons/cdeath/cdmoddll”。

进入服务器前也不要打开cd。

安装vac,打开cstrike\liblistgam,将设置成secure "1",一般情况下,安装完毕默认是打开的,如果关闭可以将1改为0。

wwcl是杜绝修改脚本作弊的插件,打开cstrike\addons\metamod\pluginsini,其中win32 addons/wwcl/dlls/pcawwclconfig_mmdll即为打开,可以在前面加上//将其关闭。

建议:打开vsm和wwcl,可在一定程度上防止作弊。

3、服务器中amx插件的使用

可以说,amx插件对15而言是成熟的,在16上使用是不是有冲突还不敢肯定,因此建议不要安装过多的amx插件。

我的amx插件:

; AMX Mod plugins

adminamx admin base (required for any admin-related)

;admin_mysqlamx admin base - MySQL version (comment adminamx)

admincmdamx basic admin console commands

adminhelpamx help command for admin console commands

adminslotsamx slot reservation

menufrontamx front-end for admin menus

cmdmenuamx command menu (speech, settings)

plmenuamx players menu (kick, ban, client cmds)

restmenuamx restrict weapons menu

mapsmenuamx maps menu (vote, changelevel)

antifloodamx prevent clients from chat-flooding the server

adminchatamx console chat commands

adminvoteamx vote commands

nextmapamx displays next map in mapcycle

timeleftamx displays time left on map

mapchooseramx allows to vote for next map

scrollmsgamx displays a scrolling message

imessageamx displays information messages

welcomemsgamx console motd @ client connection

statsamx stats on death or round end (CSStats Module required!)

stats_loggingamx weapons stats logging (CSStats Module required!)

telemenuamx teleport menu (Fun Module required!)

miscstatsamx bunch of events announcement for Counter-Strike

pausecfgamx allows to pause and unpause some plugins

statscfgamx allows to manage stats plugins via menu and commands

;ucstats_cstrikeamx i love you

;ucstats_liveamx hehe heh

;goreamx 44hehe

amx_restrictshieldsamx

前面加;的为禁止的。最后一个为禁用盾牌插件。

PS:看着服务器中一堆拿着盾牌的家伙,感觉实在是不爽:)

下载amx以前的版本安装,amx点击下载

免盾牌amx程序amx插件,解压后拷贝到\cstrike\addons\amx目录下,覆盖源文件。

完成后,可以自己考虑使用那些插件:打开\cstrike\addons\amx\plugins\pluginsini,进行修改。

  一 什么是REST

 REST是REpresentational State Transfer的缩写 代表分布式超媒体系统(如World Wide Web)上的一种软件架构体系 并不仅仅是创建Web Service的一种方法 它最早由Roy Fielding于 年在其博士论文 Architectural Styles and the Design of Neork based Sofare Architectures 中提出 并定义了一些基本原则 简单的说 放到World Wide Web上 就是所有的应用程序对象和功能都可以抽象为一种资源(Resource) 并通过URI来定位并使用 因此 我们可以把符合REST原则的系统称为RESTful 也就是说 REST是一种架构风格 而不是一个标准 你永远不会看到W C发布一个叫REST的Specification

 RESTful Web Service与基于SOAP和WSDL的Web Service有着很多的不同 它有着以下特点

 ·将Web Service作为一种资源 并通过URI来定位

 ·使用HTTP中的POST GET PUT和DELETE方法来代表对资源的CREATE READ UPDATE DELETE(CRUD)操作

 ·使用无状态通信

 ·传输XML或者SON

 在JAX WS中提供了对开发和部署一个RESTful的Web Service的基本支持 即通过实现Provider接口使得Web Serivce可以对传输的XML消息进行完全的控制 因此我们可以在WAS CE中使用JAX WS开发一个RESTful的Web Service     对RESTful Web Service提供完整支持的JAX RS Specification将会加入Java EE 的大家庭中 当前的WAS CE V x是遵循Java EE 的企业级应用服务器 因此 若想使用JAX RS开发RESTful Web Service 请关注WAS CE的后续版本

  二 开发环境设置

 本文基于WAS CE的最新版本V 开发一个RESTful的Web Service 在开始编写代码之前 请确认如下的开发环境

 ·Sun JDK V

 ·Eclipse IDE for Java EE Developers Ganymede

 ·WASCE Eclipse Plug in (WEP) V

 此外 WAS CE使用Axis 作为JAX WS引擎 但是由于其存在一个已知的关于HTTP Content Type Header的问题(在Axis 中才解决) 所以我们需要将JAX WS引擎切换成Apache CXF (WAS CE使用版本为V ) 不用担心 WAS CE的模块化架构 使这个过程十分简单 过程如下

  启动WAS CE

  打开Web //localhost: /console

  进入Application > Plugins页面 点击Add Repository

 

  由于WAS CE V 是基于Geronimo V 开发 所以我们也可以使用Geronimo的Server plug ins 在New Repository中输入

  / 然后点击Add Repository

 

  选择刚刚添加的Repository 然后点击Show Plugins in selected repository

 

  勾选上以下plug ins并且点击install按钮

 

  在以上CXF相关的Plugin安装完成之后 我们需要更新WAS CE的配置文件 以使得WAS CE在启动时加载CXF以代替Axis (注意 在更改配置文件前先要停止WAS CE服务器)

  停止WAS CE后 打开<WASCE_HOME>/var/config/config xml

 去掉以下四个module的condition属性

 <module name= nfigs/axis deployer/ /car condition= … />

 <module name= nfigs/axis ejb deployer/ /car condition= … />

 <module name= nfigs/cxf deployer/ /car condition= … />

 <module name= nfigs/cxf ejb deployer/ /car condition= … />

 增加load属性 axis 相关的为false cxf相关的为true

 <module name= nfigs/axis deployer/ /car load= false />

 <module name= nfigs/axis ejb deployer/ /car load= false />

 <module name= nfigs/cxf deployer/ /car load= true />

 <module name= nfigs/cxf ejb deployer/ /car load= true />

  重新启动WAS CE服务器

  三 开发一个简单的RESTful Web Service

  在Eclipse中创建一个Dynamic Web Project作为Web Service的宿主

 选择File >New >Dynamic Web Project

 输入Project Name为HelloRestfulService

  右击Java Resources src 新建一个class 其中package Name Interfaces如下设置

 

  加入如下代码

 

 package ibm wasce samples jaxws rest;import java io ByteArrayInputStream;import javax annotation Resource;import javax servlet ServletRequest;import javax xml parsers DocumentBuilder;import javax xml parsers DocumentBuilderFactory;import javax xml transform Source;import javax xml transform dom DOMSource;import javax xml transform stream StreamSource;import javax xml ws BindingType;import javax xml ws Provider;import javax xml ws WebServiceContext;import javax xml ws WebServiceProvider;import javax xml ws handler MessageContext;import javax xml ws HTTPBinding;import javax xml ws HTTPException;import w c dom Node;import w c dom NodeList;import xml sax InputSource;@WebServiceProvider@BindingType (value = HTTPBinding HTTP_BINDING )public  class HelloWorld  implements Provider<Source> {   @Resource   protected WebServiceContext wsContext ;   public Source invoke(Source source) {       try {           String targetName = null ;           if (source == null ) {               //Get: Getting input from query string               MessageContext mc = wsContext getMessageContext();               String query = (String) mc get(MessageContext QUERY_STRING );               System out println( Query String = + query);               ServletRequest req = (ServletRequest) mc get(MessageContext SERVLET_REQUEST );               targetName = req getParameter( target );           } else {               //POST: Getting input from input box               Node n = null ;               if (source instanceof DOMSource) {                   n = ((DOMSource) source) getNode();               } else  if (source instanceof StreamSource) {                   StreamSource streamSource = (StreamSource) source;                   DocumentBuilder builder = DocumentBuilderFactory newInstance() newDocumentBuilder();                   InputSource inputSource = null ;                   if (streamSource getInputStream() != null ) {                       inputSource = new InputSource(streamSource getInputStream());                   } else  if (streamSource getReader() != null ) {                       inputSource = new InputSource(streamSource getReader());                   }                   n = builder parse(inputSource);               } else {                   throw  new RuntimeException( Unsupported source: + source);               }               NodeList children = n getChildNodes();               for ( int i = ; i < children getLength(); i++) {                   Node child = em(i);                   if (child getNodeName() equals( people )) {                       targetName = child getAttributes() getNamedItem( target ) getNodeValue();                       break ;                   }               }           }

 String body = <ns:return xmlns:ns=\ \ >                    + <ns:HelloWorldResponse> + this sayHello(targetName) + </ns:HelloWorldResponse>                    + </ns:return> ;           return  new StreamSource( new ByteArrayInputStream(body getBytes()));

 } catch (Exception e) {           e printStackTrace();           throw  new HTTPException( );       }   }

 private String sayHello(String target){       return  Hello + target;   }}

 让我们看一看代码中的几个关键点

 a) @WebServiceProvider 表明这个Web Service实现了Provider接口 可以对XML消息进行完全的处理

 b) Provider 是这类Web Service都要实现的接口 它只有一个方法需要实现 即

 public abstractjava lang Object invoke(java lang Object arg )

 c) Source 是交换信息的载体

 当Source对象为空时 表示是一个GET Request 因为这种情况下 所有信息是被拼成一个URI的参数 并传到这个URI对应的Web Service

 否则 是一个POST Request 其内容会包括在一个Source对象内

 另外 Response的内容也要放到一个Source对象内

  编写web xml

 为了使我们前面编写的Web Service能够成功部署到WAS CE中 我们需要将如下内容加入到web xml中  <servlet>    <servlet name>Hello</servlet name>    <servlet class> ibm wasce samples jaxws rest HelloWorld</servlet class></servlet><servlet mapping>    <servlet name>Hello</servlet name>    <url pattern>/Hello</url pattern></servlet mapping>

 注意 这里只是借用了<servlet>和<servlet mapping>标签来帮助暴露Web Service 并不是真是要求这个Web Service必须要实现HttpServlet接口

  部署 运行并测试这个Web Service

 右击这个HelloRestfulService工程 选择Run As > Run on Server 会将其部署到WAS CE中 当Status栏变为Synchronized时 在Console中会有类似如下信息显示

 

 通过访问如下地址 测试使用GET方式调用RESTful Web Service返回的结果

 //localhost /HelloRestfulService/Hello?target=Rex

 

  四 开发一个简单的RESTful Web Service Client

  创建一个Dynamic Web Project作为Client

 选择File >New >Dynamic Web Project

 输入Project Name为HelloRestfulClient

  新建一个testget jsp 加入如下内容  <form method= POST action= HelloGetMethodRequester >  Target Name: <input type= text name= target >  <input type= submit value= Submit ></form>

 这个JSP用来为HelloGetMethodRequester Servlet提供参数

  创建HelloGetMethodRequester Servlet 加入如下内容

 protected void doPost(HttpServletRequest request HttpServletResponse response) throws ServletException IOException {   PrintWriter ut = response getWriter();   String target = request getParameter( target );

 String queryRequest = //localhost: /HelloRestfulService/Hellotarget= + target;   GetMethod method = new GetMethod(queryRequest);   HttpClient client = new HttpClient();   int statusCode = client executeMethod(method);   if (statusCode != ) { //HttpStatus SC_OK       System err println( Method failed: + method getStatusLine());   }

 try {       DocumentBuilder builder= DocumentBuilderFactory newInstance() newDocumentBuilder();       Document queryResponse = builder parse(method getResponseBodyAsStream());       XPath xPath = XPathFactory newInstance() newXPath();       NodeList nodes = (NodeList) xPath evaluate( /return queryResponse XPathConstants NODESET );       for ( int i = ; i < nodes getLength(); i++) {           // Get eachxpathexpression as a string           String str = (String) xPath evaluate( HelloWorldResponse em(i) XPathConstants STRING );           out println( Service return: + str);       }   } catch (Exception e) {       e printStackTrace();   }}

 在这个Servlet中我们用到了mons codec jar和mons 两个包 因此我们需要将它们加入到Build Path中

 

 这两个包在WAS CE的如下目录中可以找到

 <WASCE_HOME>\repository\mons codec\mons codec\ \mons codec jar

 <WASCE_HOME >\repository\mons client\mons client\ \mons

 让我们看一看这段Servlet代码中的一些关键点

 a) 首先创建了一个HttpClient对象 并运行了GetMethod 即使用GET请求如下URI

 //localhost /HelloRestfulService/Hello?target= + target

 b) 如果成功返回 即statusCode为 则可以从method对象中得到返回的结果

 method getResponseBodyAsStream()

 c) 因为返回的结果为自定义的一段XML文档 所以我们可以使用XPath来处理并输出到页面上

  编写部署计划geronimo web xml

 为使这个Web Client能够成功部署到WAS CE中 我们还需要在geronimo web xml的<environment>中加入如下依赖  <dep:dependencies>    <dep:dependency>        <dep:groupId>mons codec</dep:groupId>        <dep:artifactId>mons codec</dep:artifactId>        <dep:version> </dep:version>        <dep:type>jar</dep:type>    </dep:dependency>    <dep:dependency>        <dep:groupId>mons client</dep:groupId>        <dep:artifactId>mons client</dep:artifactId>        <dep:version> </dep:version>        <dep:type>jar</dep:type>    </dep:dependency></dep:dependencies>

  部署和运行

 右击这个HelloRestfulClient工程 选择Run As > Run on Server 会将其部署到WAS CE中 当Status栏变为Synchronized时 表示部署成功

 在浏览器中打开如下页面

 

 输入 Rex 并点击Submit 可得到如下结果

 

  五 总结

 本文介绍了REST的基本概念 以及如何在WAS CE V 下开发一个RESTful Web Service和一个使用GET方式的Client 如果读者朋友有兴趣的话 也可以尝试扩展这个Client 如增加testpost jsp和HelloPostMethodRequester Servlet两个文件

  testpost jsp包括一个文件上载框 用以上传一个XML文件

  HelloPostMethodRequester Servlet用于将XML文件以POST方式传送给HelloWorld这个Service

 事实上 我们的HelloWorld RESTful Web Service已经具备了处理接收一个XML文件的能力

  六 资源链接

 ·WAS CE及Samples下载

 

 ·WAS CE Eclipse Plug in (aka WEP WAS CE s WTP Server Adapter)下载

 

 ·WAS CE文档

 

 ·WAS CE主页

lishixinzhi/Article/program/Java/ky/201311/28821

尽管AJAX技术的出现才不到两年时间,但是AJAX技术遵循了REST的一些重要原则。AJAX技术充分利用了HTTP来获取网络资源并且实现了HTTP没有的对于异步数据进行传输的功能。AJAX技术还使得软件更好地实现分布性功能,在一个企业内只要一个人下载了AJAX引擎,其它企业内部的人员,就可以共享该资源了。AJAX技术遵守REST准则的应用程序中简单和可伸缩的架构,凡是采用AJAX技术的页面简洁而又丰富,一个页面表现了丰富多彩的形态。

AJAX技术还使用了一种不同于XML格式的JSON文件格式,这个意义在哪里呢?在REST软件架构下我们不能对于XML文件进行序列化处理,这样程序员必须要使用自己的XML绑定框架。而以序列化的JavaScript对象为基础的JSON已经获得了广泛认可,它被认为能以远比XML更好的方式来序列化和传输简单数据结构,而且它更简洁。这对REST是一个极大贡献和补充。

当前的网络应用软件还违背了REST的“无状态服务器”约束。REST服务器只知道自己的状态。REST不关心客户端的状态,客户端的状态自己来管理,这是AJAX技术的应用之地。通过AJAX技术,可以发挥有状态网络客户机的优势。而REST的服务器关心的是从所有网络客户端发送到服务器操作的顺序。这样使得互联网这样一个巨大的网络得到有序的管理。

它首次出现在 2000 年 Roy Fielding 的博士论文中,他是 HTTP 规范的主要编写者之一。

REST 指的是一组架构约束条件和原则。满足这些约束条件和原则的应用程序或设计就是 RESTful。

Web 应用程序最重要的 REST 原则是,客户端和服务器之间的交互在请求之间是无状态的。从客户端到服务器的每个请求都必须包含理解请求所必需的信息。如果服务器在请求之间的任何时间点重启,客户端不会得到通知。此外,无状态请求可以由任何可用服务器回答,这十分适合云计算之类的环境。客户端可以缓存数据以改进性能。

在服务器端,应用程序状态和功能可以分为各种资源。资源是一个有趣的概念实体,它向客户端公开。资源的例子有:应用程序对象、数据库记录、算法等等。每个资源都使用 URI (Universal Resource Identifier) 得到一个惟一的地址。所有资源都共享统一的界面,以便在客户端和服务器之间传输状态。使用的是标准的 HTTP 方法,比如 GET、PUT、POST 和 DELETE。Hypermedia 是应用程序状态的引擎,资源表示通过超链接互联。

另一个重要的 REST 原则是分层系统,这表示组件无法了解它与之交互的中间层以外的组件。通过将系统知识限制在单个层,可以限制整个系统的复杂性,促进了底层的独立性。

当 REST 架构的约束条件作为一个整体应用时,将生成一个可以扩展到大量客户端的应用程序。它还降低了客户端和服务器之间的交互延迟。统一界面简化了整个系统架构,改进了子系统之间交互的可见性。

DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
网站模板库 » REST和SOAP Web Service的区别比较

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情