如何在Java中使用REST get方法?

如何在Java中使用REST get方法?,java,authentication,rest,Java,Authentication,Rest,我有以下成功运行的REST get请求: 结果是一个XML文档,然后我想解析它。我在Java中也尝试过同样的方法: 我使用以下代码: public void getRootService() throws ClientProtocolException, IOException { HttpGet httpGet = new HttpGet("https://localhost:9443/ccm/rootservices"); httpGet.setHeader("Accep

我有以下成功运行的REST get请求:

结果是一个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);

}
public void getRootService()抛出ClientProtocolException,IOException{
HttpGet HttpGet=新的HttpGet(“https://localhost:9443/ccm/rootservices");
setHeader(“接受”、“文本/xml”);
HttpResponse response=client.execute(httpGet);
HttpEntity=response.getEntity();
InputStream in=entity.getContent();
String projectURL=XMLDocumentParser.parseDocument(在中);
System.out.println(projectURL);
HttpGet getProjectsRequest=新的HttpGet(“https://localhost:9443/ccm/process/project-);;
setHeader(“内容类型”,“应用程序/xml;字符集=UTF-8”);
getProjectsRequest.setHeader(“接受字符集”、“UTF-8”);
getProjectsRequest.setHeader(“接受”、“应用程序/xml”);
ResponseHandler=new BasicResponseHandler();
字符串projectResponse=client.execute(getProjectsRequest,handler);
//字符串projectResponse=client.execute(getProjectsRequest,handler);
System.out.println(项目响应);
}

但是我如何进行身份验证呢?我试图为值“Authorization”添加另一个头字段,但没有得到相同的结果。

我实现这一点的方法是使用标准HTTP控制器的会话。他们调用一个登录URL,发布用户和密码,我对会话进行身份验证。完成后,所有以下URL只需检查以确保会话已通过身份验证。

我认为您必须创建一个
用户名密码凭据
,大致如下(未测试)

编辑:
刚刚尝试了以下代码,并成功地在我们的开发环境中调用了一个受基本保护的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);
  }
publicstaticvoidmain(字符串[]args)抛出ClientProtocolException、IOException{
CredentialsProvider credsProvider=新的BasicCredentialsProvider();
credsProvider.setCredentials(
新的AuthScope(“dev.*********.com”、AuthScope.ANY_端口),
新用户名密码凭据(“*******”、“*******”);
DefaultHttpClient=新的DefaultHttpClient();
client.setCredentialsProvider(CredProvider);
字符串url=”http://dev.******.com:18081/path/to/service/id.xml”;
HttpGet=新的HttpGet(url);
ResponseHandler=new BasicResponseHandler();
String resp=client.execute(get,handler);
系统输出打印项次(resp);
}

您可以显式地将
授权
头添加到
HttpRequestBase
(用于
HttpGet
HttpPost
等的抽象类)

此示例显示如何生成基本授权值

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

在服务器中,您必须执行相反的操作(如果您正在执行自己的实现。

支持的身份验证机制将取决于用于托管Rational Team Concert的web服务器。Apache Tomcat服务器使用基本身份验证,而WebSphere Application server同时支持基本身份验证和基于表单的身份验证


您可以查看详细说明

进行身份验证是什么意思?您是指从服务器进行客户端身份验证还是在请求中填充
授权
标题?我必须在服务器上对我的客户端进行身份验证。是的,但问题是我找不到这样的示例。好吧,我的示例将使用Spr但是我只是在每个方法定义上传入请求。从该请求中,我获取会话,并将当前日期存储在会话中。我还传入请求的每个附加调用,获取会话并检查日期。如果它为null或太久以前,我抛出异常,否则我更新日期并继续处理正常情况下。我试过这个,但是setCredentials不接受UserNamePasswordCredentials。真的吗?HttpClient v4?
UserNamePasswordCredentials
implements
org.apache.http.auth.Credentials
so应该可以工作……嗯,我正在使用Java 1.6。我必须向构建路径添加一个jar吗?刚刚注意到一个wierd的东西;
HttpClient
interface不强制要求
setCredentials
,因此客户端类型必须是
DefaultHttpClient
。是的,但是为什么我的setCredentials方法不接受用户名PasswordCredentials?我在使用jre6。@Roflcoptr,成功,以什么方式?我到处都有这段代码,它对我有效。当我使用它时,我从其他人那里得到html代码服务。但是如果我像上图一样在Firefox中使用REST插件,我会得到XMl docukemtn。@Roflcoptr,如果请求头上存在
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);