[英]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.