2013-01-22 44 views
1

使用NetBeans和GlassFish, 我正在開發一個簡單的獨立應用程序,從一個REST服務獲取的Tweet的列表。這些對象包含一個名爲tweet的變量,這是我希望在其他應用程序中看到的字符串值。獲得在我的REST客戶端REST服務數據

我已經建立了網站和應用程序創建一個新的類在此:

RESTService.java:

package service; 

import domain.Tweet; 
import domain.User; 
import java.util.Collection; 
import java.util.Date; 
import javax.inject.Inject; 
import javax.ws.rs.*; 
import javax.ws.rs.core.MediaType; 

@Path("/rest") 
public class RESTService { 

    @Inject 
    KwetterService service; 

    @GET 
    @Path("/{user}") 
    public User getUser(@PathParam("user") String userName) 
    { 
     return service.findByName(userName); 
    } 

    @GET 
    @Path("/{user}/tweets") 
    @Produces(MediaType.TEXT_XML) 
    public Collection<Tweet> getTweets(@PathParam("user") String userName) 
    { 
     User user = service.findByName(userName); 
     return user.getTweets(); 
    } 
} 

在獨立的應用程序,我創建了一個小型的一個按鈕。通過按下該按鈕,我想抓住這些推文。

當使用NetBeans添加REST客戶端類時,我將它鏈接到網站的服務。它產生的一類我叫RestClient.java:

package service; 

import com.sun.jersey.api.client.Client; 
import com.sun.jersey.api.client.UniformInterfaceException; 
import com.sun.jersey.api.client.WebResource; 

public class RestClient { 
    private WebResource webResource; 
    private Client client; 

    public RestClient() { 
    } 

    public <T> T getUser(Class<T> responseType, String user) throws UniformInterfaceException { 
     WebResource resource = webResource; 
     resource = resource.path(java.text.MessageFormat.format("{0}", new Object[]{user})); 
     return resource.get(responseType); 
    } 

    public <T> T getTweets(Class<T> responseType, String user) throws UniformInterfaceException { 
     WebResource resource = webResource; 
     resource = resource.path(java.text.MessageFormat.format("{0}/tweets", new Object[]{user})); 
     return resource.accept(javax.ws.rs.core.MediaType.TEXT_XML).get(responseType); 
    } 
} 

在actionbutton執行的方法,我想使用這個類來獲得鳴叫。當這樣做的時候,它會在用戶名旁邊要求輸入Class<T> responseType

形式的代碼如下所示:

private void btnZoekFollowersActionPerformed(java.awt.event.ActionEvent evt) {            
     String userName = txtZoekTweets.getText(); //de naam van de user 
     RestClient client = new RestClient(); 
     Collection<Tweet> tweets = client.getTweets(MediaType.TEXT_XML, userName); 
     //What to insert for mediatype? Above gives an error since it requires Class<T> responseType 
     System.out.println("Datasize: " + data.size()); 
} 

因此,簡而言之,我的問題是:我需要插入一個Class<T> responseType作爲參數,爲什麼呢?我應該使用什麼參數或更好的方法,我該如何避免必須這樣做,而只是將用戶名作爲參數插入?

而在此旁邊,我是否需要自己在某處指定要接近哪個URL的代碼?還是這一切都設置和通過生成客戶端類工作?

+0

爲什麼參數化您的'getUser'和'getTweets'方法?你已經將它們分別具體化爲獲取用戶或獲取推文的一個功能,那麼爲什麼不只是返回'User'和'Collection '? – Perception

+0

@Perception我的目標是從文本字段獲取值,並將其作爲參數傳遞給方法。例如,如果我輸入「UserDude」,我應該從數組中獲得來自UserDude的所有推文。 – Joetjah

+0

我認爲你的主要問題是你試圖確定調用'getTweets'時使用什麼響應類,因爲那個調用需要一個集合,對吧?我將這些信息包含在我的回答中,以及其他一些(希望)有用的提示中。 – Perception

回答

3

好,有一些問題與您的客戶端代碼:

問題1

你感到困惑的媒體類型與響應實體類型。澤西島WebResource類預計,當您使用方法get時,您提供預期的實體類型該響應應編組。如果你想指定預期的媒體類型,那麼你需要通過追加Accept標題,通過accept方法(你在你的getTweets方法中做,而不是getUser)做到這一點。

問題2

您的REST客戶端類並不需要有參數的通用功能。您已經將方法定義爲了解它們返回的對象類型,因此請在方法簽名中使用這些對象!

解決方案

總的來說,我會希望您的客戶是這樣的:

public class RestClient { 
    private Client client; 
    private WebResource webResource; 

    public RestClient() { 
     super(); 
    } 

    public User getUser(String userName) throws UniformInterfaceException { 
     final WebResource userResource = webResource 
      .path(String.format("/user/%s", userName)) 
      .accept(MediaType.TEXT_XML) ; 
     return userResource.get(User.class); 
    } 

    public Collection<Tweet> getTweets(String userName) throws UniformInterfaceException { 
     final WebResource tweetResource = webResource 
      .path(String.format("/user/%s/tweets", userName)) 
      .accept(MediaType.TEXT_XML) ; 
     return tweetResource.get(new GenericType<Collection<Tweet>>(){}); 
    } 
} 

你會發現我加了一個前綴user到資源的URL。如果您願意,您可以將其刪除,但可以在添加更多資源端點時更輕鬆地維護應用程序。如果您決定保留它,那麼您將需要在您的服務器端進行此修改:

@Path("/rest") 
public class RESTService { 

    @Inject 
    KwetterService service; 

    @GET 
    @Path("/user/{userName}") 
    public User getUser(@PathParam("userName") String userName) 
    { 
     return service.findByName(userName); 
    } 

    @GET 
    @Path("/user/{userName}/tweets") 
    @Produces(MediaType.TEXT_XML) 
    public Collection<Tweet> getTweets(@PathParam("userName") String userName) 
    { 
     User user = service.findByName(userName); 
     return user.getTweets(); 
    } 
} 
+0

今天我再也看不到它了,但我明天會對它進行測試!你對參數的解釋已經給我提供瞭解決問題的線索,這是我在整個互聯網上發現的更多信息。提前致謝。 – Joetjah

+0

Thak你,爲我工作! – kylexy1357