java中的rest总结_在Java中使用Rest Api

警告:无法解析HTTP请求java.io.IOException:无法解析请求方法 . 流的结束太早了 . at com.noelios.restlet.http.HttpServerCall.readRequestHead(HttpServerCall.java:347)at com.noelios.restlet.http.StreamServerCall . (StreamServerCall.java:88)at com.noelios.restlet.http.StreamServerHelper $ ConnectionHandler . 运行(StreamServerHelper.java:86)java.util.concurrent.Executors $ RunnableAdapter.call(Executors.java:441)java.util.concurrent.FutureTask $ Sync.innerRun(FutureTask.java:303)at java.util .concurrent.FutureTask.run(FutureTask.java:138)java.util.concurrent.ThreadPoolExecutor $ Worker.runTask(ThreadPoolExecutor.java:886)at java.util.concurrent.ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java:908) )java.lang.Thread.run(Thread.java:619)Apr 30,2012 10:13:22 AM com.noelios.restlet.http.HttpServerCall parseHost INFO:找不到必需的“主机”HTTP标头 . 2012年4月30日10:13:22 com.noelios.restlet.LogFilter afterHandle INFO:2012-04-30 10:13:22 127.0.0.1 - - 8182 - - - 404 330 - 0 http:// null - - 2012年4月30日上午10:13:22 com.noelios.restlet.http.HttpServerConverter commit SEVERE:编写响应实体java.io.IOException时发生异常:已 Build 的连接被主机上的软件在sun处中止 . nio.ch.SocketDispatcher.write0(本机方法),位于sun.nio的sun.nio.ch.S.Dio上,sun.nio.ch.Ifftil.writeFromNativeBuffer(IOUtil.java:104)sun.nio.ch.SocketDispatcher.write(SocketDispatcher.java:33) . ch.IOUtil.write(IOUtil.java:75)位于java.nio的java.nio.channels.Channels.write(Channels.java:60)的sun.nio.ch.SocketChannelImpl.write(SocketChannelImpl.java:334) java的java.io.BufferedOutputStream.flushBuffer(BufferedOutputStream.java:65)java.nio.channels.Channels $ 1.write(Channels.java:134)上的.channels.Channels.access $ 000(Channels.java:47) . sun.nio.cs.StreamEncode上的io.BufferedOutputStream.flush(BufferedOutputStream.java:123)位于org.restlet.resource.StringRepresentation的java.io.OutputStreamWriter.flush(OutputStreamWriter.java:212)的sun.nio.cs.StreamEncoder.flush(StreamEncoder.java:122)中的r.implFlush(StreamEncoder.java:278) .write(StringRepresentation.java:211)com的com.noelios.restlet.http.HttpServerCall.writeResponseBody(HttpServerCall.java:492)com的com.noelios.restlet.http.HttpServerCall.sendResponse(HttpServerCall.java:428) . noelios.restlet.http.HttpServerConverter.commit(HttpServerConverter.java:392)at com.noelios.restlet.http.HttpServerHelper.handle(HttpServerHelper.java:148)at com.noelios.restlet.http.StreamServerHelper $ ConnectionHandler.run( StreamServerHelper.java:86)at java.util.concurrent.Executors $ runnableAdapter.call(Executors.java:441)at java.util.concurrent.FutureTask $ Sync.innerRun(FutureTask.java:303)at java.util.concurrent .futureTask.run(FutureTask.java:138)java.util.concurrent.ThreadPoolExecutor $ Worker.runTask(ThreadPoolExecutor.java:886)at java.util.concurrent.ThreadPoolExecu tor $ Worker.run(ThreadPoolExecutor.java:908)at java.lang.Thread.run(Thread.java:619)Apr 30,2012 10:13:22 AM com.noelios.restlet.http.HttpServerConverter commit WARNING:Unable发送错误响应java.io.IOException:已 Build 的连接由主机中的软件在sun.nio.ch.SocketDispatcher.write(SocketDispatcher.java)上的sun.nio.ch.SocketDispatcher.write0(本机方法)中止 . :33)sun.nio.ch.IOUtil.writeFromNativeBuffer(IOUtil.java:104)at sun.nio.ch.IOUtil.write(IOUtil.java:75)at sun.nio.ch.SocketChannelImpl.write(SocketChannelImpl . java:334)at java.nio.channels.Channels.write(Channels.java:60)at java.nio.channels.Channels.access $ 000(Channels.java:47)at java.nio.channels.Channels $ 1.write (Channels.java:134)at java.io.BufferedOutputStream.flushBuffer(BufferedOutputStream.java:65)at java.io.BufferedOutputStream.flush(BufferedOutputStream.java:123)at com.noelios.restlet.http.HttpServerCall.writeResponseHead( HttpServerCall.java:553)在com.noelios.rest let.http.StreamServerCall.writeResponseHead(StreamServerCall.java:201)at com.noelios.restlet.http.HttpServerCall.sendResponse(HttpServerCall.java:415)at com.noelios.restlet.http.HttpServerConverter.commit(HttpServerConverter.java: 410)at com.noelios.restlet.http.HttpServerHelper.handle(HttpServerHelper.java:148)at com.noelios.restlet.http.StreamServerHelper $ ConnectionHandler.run(StreamServerHelper.java:86)at java.util.concurrent.Executors $ java.util.concurrent.FutureTask的$ RunnableAdapter.call(Executors.java:441)$ java.util.concurrent.FutureTask.run(FutureTask.java:138)中的$ Sync.innerRun(FutureTask.java:303) . util.concurrent.ThreadPoolExecutor $ Worker.runTask(ThreadPoolExecutor.java:886)at java.util.concurrent.ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java:908)at atjava.lang.Thread.run(Thread.java:619)

(1)项目简介 这个demo很简单,是一个记账小工程。用户可以注册、修改密码,可以记账、查找记账记录等。 (2)接口介绍 用户操作相关: post /users 用户注册 post /users/login 用户登录(这里我把login当成一个名词) put /users/pwd?userId=xxx&sign=xxx 用户修改密码 delete /users?uerId=xxx&sign=xxx 删除用户 记账记录操作相关: post /records?userId=xxx&sign=xxx 增加一条记账记录 get /records/:id?userId=xxx&sign=xxx 查询一条记账记录详情 put /records/:id?userId=xxx&sign=xxx 修改一条记账记录详情 get /records?查询参数&userId=xxx&sign=xxx 分页查询记账记录 delete /records/:id?userId=xxx&sign=xxx 删除一条记账记录 其url带sign参数的表示该接口需要鉴权,sign必须是url最后一个参数。具体的鉴权方法是:用户登录后,服务器生成返回一个token,然后客户端要注意保存这个token,需要鉴权的接口加上sign签名,sign=MD5(url+token),这样可以避免直接传token从而泄露了token。这里我觉得接口最好还带一个时间戳参数timestamp,然后可以在服务端比较时间差,从而避免重放攻击。而且这样还有一个好处,就是如果有人截获了我们的请求,他想伪造我们的请求则不得不改时间戳参数(因为我们在服务器端会比较时间),这样一来sign势必会改变,他是无法得知这个sign的。如果我们没有加时间戳参数的话,那么,他截获了请求url,再重发这个请求势必又是一次合法的请求。我在这里为了简单一些,就不加时间戳了,因为这在开发测试阶段实在是太麻烦了。 (3)关于redis和数据库的说明 服务端在用户登录后,生成token,并将token保存到redis。后面在接口鉴权的时候会取出token计算签名MD5(除sign外的url+token),进行比对。 这个demo搭建了一个redis主从复制,具体可以参考:http://download.csdn.net/detail/zhutulang/9585010 数据库使用mysql,脚本在 src/main/resources/accounting.sql
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值