如何在Java中实现REST的GET方法?

3

我有一个成功的REST获取请求:

enter image description here

结果是一个XML文档,我想解析它。我尝试在Java中做同样的事情:

我使用以下代码:

public void getRootService() throws ClientProtocolException, IOException {

    HttpGet httpGet = new HttpGet("https://localhost:9443/ccm/rootservices");
    httpGet.setHeader("Accept", "text/xml");
    HttpResponse response = client.execute(httpGet);
    HttpEntity entity = response.getEntity();
    InputStream in = entity.getContent();
    String projectURL = XMLDocumentParser.parseDocument(in);

    System.out.println(projectURL);
    HttpGet getProjectsRequest = new HttpGet("https://localhost:9443/ccm/process/project-areas");
    getProjectsRequest.setHeader("Content-Type", "application/xml;charset=UTF-8");
    getProjectsRequest.setHeader("Accept-Charset", "UTF-8");
    getProjectsRequest.setHeader("Accept", "application/xml");


    ResponseHandler<String> handler = new BasicResponseHandler();
    String projectResponse = client.execute(getProjectsRequest, handler);
    //String projectResponse = client.execute(getProjectsRequest, handler);

    System.out.println(projectResponse);

}

但是我该如何进行认证呢?我尝试添加另一个标题字段,值为“授权”,但结果并不相同。


你所说的认证是指什么?是指从服务器进行客户端认证还是在请求中填充“Authorization”头? - Buhake Sindi
我必须在服务器上对我的客户进行身份验证。 - anon
4个回答

5

我认为你需要创建一个UsernamePasswordCredentials,可以按照以下方式操作(未经测试):

CredentialsProvider credsProvider = new BasicCredentialsProvider();
credsProvider.setCredentials(
    new AuthScope("somehost", AuthScope.ANY_PORT), 
    new UsernamePasswordCredentials("username", "password"));

HttpClient httpclient = new DefaultHttpClient();
httpclient.setCredentialsProvider(credsProvider);

请查看http://hc.apache.org/httpcomponents-client-ga/tutorial/html/authentication.html
编辑:
我刚试了下面的代码,并成功地调用了一个基本受保护的REST服务,该服务位于我们的开发环境中。
public static void main(String[] args) throws ClientProtocolException, IOException {
    CredentialsProvider credsProvider = new BasicCredentialsProvider();
    credsProvider.setCredentials(
        new AuthScope("dev.*******.com", AuthScope.ANY_PORT), 
        new UsernamePasswordCredentials("*****", "******"));


    DefaultHttpClient client = new DefaultHttpClient();
    client.setCredentialsProvider(credsProvider);

    String url = "http://dev.******.com:18081/path/to/service/id.xml";

    HttpGet get = new HttpGet(url);
    ResponseHandler<String> handler = new BasicResponseHandler();
    String resp = client.execute(get, handler);

    System.out.println(resp);
  }

我尝试过这个,但是setCredentials不接受UserNamePasswordCredentials。 - RoflcoptrException
嗯,我正在使用Java 1.6版本。我需要将一个jar包添加到构建路径吗? - RoflcoptrException
是的,但为什么我的setCredentials方法不接受UserNamePasswordCredentials?我正在使用jre6。 - RoflcoptrException
HttpClient 不支持,但 DefaultHttpClient 支持。另外,您指的是 UsernamePasswordCredentials 而不是 UserNamePasswordCredentials,对吗? - Qwerky
好的。我现在复制了你的代码,现在它可以编译。但是无论如何,我还是没有得到XML文档。相反,HTML代码指示需要身份验证。 - RoflcoptrException
显示剩余2条评论

3
你可以明确地向HttpRequestBaseHttpGetHttpPost 等的抽象类)添加Authorization头。以下示例显示如何生成基本授权值。
String unhashedString = userName + ":" + password;
String hashedString = Base64.encode(unhashedString); //This class doesn't exist, it's for demonstration purpose only.

HttpGet.setHeader("Authorization", "Basic " + hashedString);

在服务器上,如果您正在进行自己的实现,则需要执行反向操作。

@Roflcoptr,成功了,怎么样?我到处都有这个代码,而且对我很有效。 - Buhake Sindi
当我使用它时,从REST服务获取HTML代码。但是,如果像上面的图片一样在Firefox中使用REST插件,我将会获得XML文档。 - RoflcoptrException
@Roflcoptr,你在服务器上检查过请求头中的Authorization头部是否存在吗? - Buhake Sindi

1
我实现这个的方式是使用会话和标准的HTTP控制器。他们调用一个登录URL,带有用户和密码的POST请求,然后我验证会话。一旦完成验证,所有后续的URL都只需检查会话是否已经通过身份验证即可。

是的,但问题是我找不到相关示例。 - RoflcoptrException
好的,我的示例将使用Spring MVC,但我只是在每个方法定义中传递了请求。从该请求中,我获取会话,并将当前日期存储在会话中。每个额外的调用中,我也会传递请求,获取会话并检查日期。如果日期为null或者过去太久了,我会抛出一个异常,否则我会更新日期并继续正常处理。 - Thom

0

支持的认证机制将取决于用于托管 Rational Team Concert 的 Web 服务器。Apache Tomcat 服务器使用基本身份验证,而 WebSphere 应用程序服务器支持基本身份验证和基于表单的身份验证。

您可以在此处查看详细说明。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接