如何从java Web项目向restful服务发送参数

时间:2017-04-11 17:34:04

标签: java rest servlets java-ee jersey

我有2个java项目。第一个是 RESTFUL webservice ,它应该处理CRUD请求。第二个是动态网络项目(有gui)。

假设我的网络项目中有这个html gui。

enter image description here

(记住我不关心安全和权威原则,我只是不想先了解这一点。)

当我填写信息并单击“登录”时,我在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服务,然后返回响应。我怎样才能做到这一点? (只是将参数从一个地方发送到另一个地方+响应)

4 个答案:

答案 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)

只需将参数附加到服务网址,例如:

http://localhost:8080/MyNote/api/login/get&username=duran&password=password

答案 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请求,因为我想创建一个新的注册。