簡體   English   中英

如何從Java Web項目向靜態服務發送參數

[英]How to send parameters to a restful service from a java web project

我有2個Java項目。 第一個是RESTFUL Web服務 ,它應該處理CRUD請求。 第二個是動態Web項目 (具有gui)。

假設我的Web項目中有這個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服務,然后返回響應。 我怎樣才能做到這一點? (只是將參數從一個地方發送到另一個地方+響應的部分)

除了所有安全性,您還有一些發送參數的選項。

作為查詢參數,就像上面提到的Duran一樣。 在Jersey請求方法中,您可以按以下方式處理這些問題:

@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而言,這只是冰山一角,還有其他選擇。 希望這可以幫助您入門。

編輯:人們似乎對密碼公開開放感到不滿,所以讓我這樣說: 不,您永遠不要在url中傳遞密碼,這只是作為示例

EDIT2:將用戶名更改為foo,將密碼更改為bar。

使用路徑參數:

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

使用查詢參數

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

盡管可以在GET請求中發送參數(如先前的答案中所述),但通常最好在正文中發送POST請求並發送JSON有效負載。

在這里,您只有2個參數(登錄名和密碼),所以還算不錯,但是我仍然更喜歡在POST中發送對象。 如果要執行此操作,則在RESTful服務中,只需用POST注釋方法(並檢查允許您檢索反序列化對象的注釋)。

話雖如此,有2條評論/問題:

1)為什么要混合使用servlet和JAX-RS? 您可以使用JAX-RS來實現所有功能,我建議您這樣做。 將注冊移至JAX-RS資源。

2) @Path("/get")是一種反模式:您不想在URL中使用/get 您很少希望在網址中使用VERBS(純粹主義者不會說)。 通常,要注冊一個新用戶,我會向/ api / registrations發送一個POST請求,因為我想創建一個新注冊。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM