Java 在我的REST客户端中获取REST服务数据

Java 在我的REST客户端中获取REST服务数据,java,web-services,rest,netbeans,Java,Web Services,Rest,Netbeans,使用网虫和玻璃鱼, 我正在开发一个简单的独立应用程序,它可以从REST服务中获取Tweet的列表。这些对象包括一个名为tweet的变量,它是我希望在其他应用程序中看到的字符串值 我已经构建了网站应用程序,并在此创建了一个新类: RESTService.java: package service; import domain.Tweet; import domain.User; import java.util.Collection; import java.util.Date; import

使用网虫和玻璃鱼, 我正在开发一个简单的独立应用程序,它可以从REST服务中获取
Tweet
的列表。这些对象包括一个名为
tweet
的变量,它是我希望在其他应用程序中看到的字符串值

我已经构建了网站应用程序,并在此创建了一个新类:

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();
    }
}
套餐服务;
导入域名.Tweet;
导入域。用户;
导入java.util.Collection;
导入java.util.Date;
导入javax.inject.inject;
导入javax.ws.rs.*;
导入javax.ws.rs.core.MediaType;
@路径(“/rest”)
公共类服务{
@注入
KwetterService服务;
@得到
@路径(“/{user}”)
公共用户getUser(@PathParam(“用户”)字符串用户名)
{
return service.findByName(用户名);
}
@得到
@路径(“/{user}/tweets”)
@生成(MediaType.TEXT\u XML)
公共集合getTweets(@PathParam(“用户”)字符串用户名)
{
User=service.findByName(用户名);
返回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);
    }
}
套餐服务;
导入com.sun.jersey.api.client.client;
导入com.sun.jersey.api.client.UniformInterfaceException;
导入com.sun.jersey.api.client.WebResource;
公共类RestClient{
私有网络资源;
私人客户;
公共RestClient(){
}
public T getUser(类responseType,字符串user)抛出UniformInterfaceException{
WebResource=WebResource;
resource=resource.path(java.text.MessageFormat.format(“{0}”,新对象[]{user}));
返回resource.get(responseType);
}
公共T getTweets(类响应类型,字符串用户)引发UniformInterfaceException{
WebResource=WebResource;
resource=resource.path(java.text.MessageFormat.format(“{0}/tweets”,新对象[]{user}));
返回resource.accept(javax.ws.rs.core.MediaType.TEXT\uxml.get(responseType);
}
}
在actionbutton执行的方法中,我试图使用该类来获得tweet。这样做时,它会在用户名旁边请求一个
Class 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());
}
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>>(){});
    }
}
private void btnZoekFollowersActionPerformed(java.awt.event.ActionEvent evt){
字符串userName=txtZoekTweets.getText();//de naam van de user
RestClient=newrestclient();
收集tweets=client.getTweets(MediaType.TEXT\uxml,用户名);
//为mediatype插入什么?上面给出了一个错误,因为它需要类responseType
System.out.println(“Datasize:+data.size());
}
简而言之,我的问题如下:我需要插入一个
类responseType
作为参数,为什么?我应该使用什么作为参数,或者更好的是,如何避免这样做而只插入用户名作为参数


接下来,我是否需要自己在某个地方键入代码,指定要访问哪个URL?或者这些都设置好了,并且可以通过生成客户端类来工作吗?

好的,您的客户端代码存在一些问题:

问题1

您将媒体类型与响应实体类型混淆。Jersey
WebResource
类期望当您使用方法
get
时,您提供响应应编组到的预期实体类型。如果要指定预期的媒体类型,则需要通过
Accept
方法(您在
getweets
方法中执行此操作,但不是
getUser
)附加
Accept

问题2

您的REST客户端类不需要具有参数化的泛型函数。您已经定义了您的方法,以了解它们返回的对象类型,因此请在方法签名中使用这些对象

解决方案

总的来说,我希望你的客户是这样的:

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());
}
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>>(){});
    }
}

为什么要参数化
getUser
getweets
方法?您已经将它们分别指定为获取用户或推特的一个函数,那么为什么不返回
User
Collection
?@Perception我的目标是从文本字段中获取一个值,并将其作为参数传递给方法。例如,如果我键入“UserDude”,我应该从数组中的UserDude获取所有tweet。我认为您的主要问题是,在调用
getTweets
时,您试图确定要使用哪个响应类,因为该调用需要一个集合,对吗?我已经在我的答案中包含了这些信息,以及一些其他(希望)有用的提示。我今天不能再看它了,但我明天会测试它!你对参数的解释已经给了我一个如何解决它的线索,这是我在互联网上找到的更多信息。提前谢谢。