我有2个java项目。第一个是 RESTFUL webservice ,它应该处理CRUD请求。第二个是动态网络项目(有gui)。
假设我的网络项目中有这个html gui。
(记住我不关心安全和权威原则,我只是不想先了解这一点。)
当我填写信息并单击“登录”时,我在Web项目中调用 login_servlet 。在servlet中,我创建了一个客户端对象并调用RESTFUL Web服务(在doPost方法内):
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
Client client = Client.create();
WebResource webR = client.resource("http://localhost:8080/MyNote/api/login/get");
ClientResponse resp = webR.accept("text/html").get(ClientResponse.class);
if (resp.getStatus() == 200){
System.out.println("****** 200 ******");
String output = resp.getEntity(String.class);
//System.out.println("****" + output + "****");
}
}
现在,提供的URL在RESTFUL Web服务中调用以下代码,该代码已成功打印出来:
@Path("/login")
public class UserLogin {
@GET
@Path("/get")
public void login(){
System.out.println("**** I'm checking if user exist in DB *****");
}
}
我想要做的是将login_servlet中插入的用户名和密码作为参数发送到Restful Web服务,然后返回响应。我怎样才能做到这一点? (只是将参数从一个地方发送到另一个地方+响应)
答案 0 :(得分:1)
除了所有安全性之外,您还有一些选择来发送params。
正如上面提到的杜兰的查询参数。 在您的泽西岛请求方法中,您将处理以下内容:
@GET
@Path("/get")
public void login(@QueryParam("foo") String var1, @QueryParam("bar") String var2){
// do something
}
请注意,变量名称不必匹配,传递给@QueryParam()
的字符串是匹配的值,并将值注入变量。
作为路径参数,您可以这样做:
@GET
@Path("/get/{foo}/{bar}")
public void login(@PathParam("foo") String var1, @PathParam("bar") String var2){
// do something
}
在此,请确保{}
中作为var名称的内容与您传递给@PathParam
的内容相符。
就Jersey / JAX-RS而言,这只是冰山一角,还有其他选择。希望这有助于您入门。
编辑:人们似乎对公开传递的密码存在疑问,所以让我这样说:不,你不应该在网址中传递密码,这只是作为一个例子EDIT2:将用户名更改为foo,将密码更改为bar。
答案 1 :(得分:0)
答案 2 :(得分:-1)
使用路径参数:
ALTER FUNCTION [dbo].[fn_Get_NormalOrders]
(
@minimalLevel int,
@recordStart int,
@recordsEnd int,
@orderBy varchar(30)
)
RETURNS TABLE
AS
RETURN
(
select *
from
(
select case @orderBy
when 'Column1' then ROW_NUMBER() over (order by Column1)
when 'Column2' then ROW_NUMBER() over (order by Column2)
when 'Column3' then ROW_NUMBER() over (order by Column3)
when 'Column4' then ROW_NUMBER() over (order by Column4)
end as row
,d.nameModel
,t.idToner
from toner t
inner join vwWebDevice d on d.idDevice = t.idDevice
and d.statusDevice not like '%stale%'
and isnull(d.deleted,0) = 0
inner join groups g on g.idGroup = d.idGroup
where
t.currentLevel <= @minimalLevel
) as x
where x.row between @recordStart and @recordsEnd
)
使用查询参数
//Rest API
@GET
@Path("/get/{username}/{password}")
public void login(@PathParam("username") String userName, @PathParam("password") String pwd){
}
//Jersey
ClientResponse resp = webR.accept("text/html")
.path(userName)
.path(password)
.get(ClientResponse.class);
答案 3 :(得分:-1)
虽然可以在GET请求中发送参数(如前面的答案中所述),但通常最好发送POST请求并在正文中发送JSON有效负载。
在这里,你只有2个参数(登录名和密码),所以它不是太糟糕,但我仍然喜欢在POST中发送一个对象。如果你想这样做,那么在你的RESTful服务中,你只需要用POST注释方法(并检查允许你检索反序列化对象的注释)。
话虽如此,2条意见/问题:
1)为什么混合使用servlet和JAX-RS?您可以使用JAX-RS实现所有功能,我建议您这样做。将注册移动到JAX-RS资源。
2)@Path("/get")
是一种反模式:您不希望在网址中包含/get
。你很少想在URL中使用VERBS(纯粹主义者会说永远不会)。通常,要注册新用户,我会向/ api / registrations发送POST请求,因为我想创建一个新的注册。