简体   繁体   中英

How to send parameters to a restful service from a java web project

I have 2 java projects. The first one is a RESTFUL webservice , that should handle CRUD requests. The second is a dynamic web project (which has the gui).

Let's say I have this html gui in my web project.

在此处输入图片说明

(Remember I don't care about security and authority principles, I just wan't to understand this first).

When I fill the information and click "Sign in" I call my login_servlet inside the web project. Inside the servlet I create a client object and call the RESTFUL web service (inside the doPost method):

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 + "****");
    }
}

As for now the provided URL calls the following code inside the RESTFUL web service, which successfully get printed out:

@Path("/login")
public class UserLogin {

    @GET
    @Path("/get")
    public void login(){
        System.out.println("**** I'm checking if user exist in DB *****");

    }
}

What I instead want to do, is to send the inserted username and password from the login_servlet as parameters to the Restful web service, and then return a response. How can I do that? (Just the part of sending parameters from one place to another + Response)

All security aside, you have a few options to send params.

As query params as Duran mentioned above. In your Jersey request method you would handle those as:

@GET
@Path("/get")
public void login(@QueryParam("foo") String var1, @QueryParam("bar") String var2){
    // do something 
}

Note that the variable names do not have to match, the string you pass to @QueryParam() is what gets matched and the value injected into the variable.

As path params you would do:

@GET
@Path("/get/{foo}/{bar}")
public void login(@PathParam("foo") String var1, @PathParam("bar") String var2){
    // do something 
}

Here make sure that what you have as var name in {} matches what you pass to @PathParam .

As far as Jersey/JAX-RS goes this is only the tip of the iceberg, there are other options. Hope this helps you get started.

EDIT: People seem to take issue with password being passed openly so let me say this: NO, you should never pass a password in the url, this is just to serve as an example

EDIT2: Changed username to foo and password to bar.

Just append the parameters to the service url like:

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

Using path params:

//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);

Using Query params

//Rest API
    @GET
    @Path("/get")
    public void login(@QueryParam("username") String username, @QueryParam("password") String pwd){

//Jersey
ClientResponse resp = webR.accept("text/html")
.queryParam("username", userName)
.queryParam("password", pwd)
.get(ClientResponse.class);

Although it is possible to send parameters in a GET request (as described in previous answers), it is usually better to send a POST request and to send a JSON payload in the body.

Here, you only have 2 parameters (login and password), so it's not too bad, but I still prefer to send an object in a POST. If you want to do that, then in your RESTful service, you just have to have method annotated with POST (and check the annotations that allow you to retrieve the de-serialized object).

Having said that, 2 comments/questions:

1) why do you mix servlets and JAX-RS? You could implement everything with JAX-RS and I would recommend that. Move the registration to a JAX-RS resource.

2) @Path("/get") is an anti-pattern: you don't want to have /get in the url. You rarely want VERBS in URLs (purists would say never). Typically, to register a new user, I would send a POST request to /api/registrations, because I want to create a new registration.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM