EnergyStar Portfolio Manager-Java客户端使用带身份验证的REST API

ah

我是新手。经过2周的研究,我到了这一步,仍然非常迷茫和绝望。

我的目标:从EnergyStar Portfolio Manager Restful Web服务/ API检索数据,并将该数据放入SQL数据库或Excel工作表中。

到目前为止的进展:1)我发现了一个示例代码,除了身份验证部分外,它似乎很适合我的需要。我使WSDL服务比RESTful服务更成功。特别是对于EnergySTAR,它需要某种身份验证,我似乎无法解决

2)检索GET协议:http : //portfoliomanager.energystar.gov/webservices/home/test/api/reporting/designMetrics/get

我的源代码:

package com;
 
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.core.Response;
 
import com.User;
 
@Path("/wstest/property/")
public class UserManagementModule
{
    @GET
    @Path("/{propertyId}/design/metrics?measurementSystem=METRIC")
    @Produces("application/xml")
    public Response getUserById(@PathParam("propertyId") Integer id)
    
    {
        User user = new User();
        user.setId(id);
        return Response.status(200).entity(user).build();
    }
    
 
    
}
package com;
 
import java.io.Serializable;

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
 
@XmlAccessorType(XmlAccessType.NONE)
@XmlRootElement(name = "propertyMetrics")
public class User implements Serializable {
 
    private static final long serialVersionUID = 1L;
      
    @XmlAttribute(name = "propertyId")
    private int propertyId;
    
    @XmlElement(name="metric")
    private double metric;
    
    @XmlAttribute(name = "designEnergyCost")
    private double designEnergyCost;
       
    @XmlAttribute(name = "designScore")
    private double designScore; 
    
    @XmlAttribute(name = "designSiteTotal")
    private double designSiteTotal;
    
    @XmlAttribute(name = "designSiteIntensity")
    private double designSiteIntensity;
    
    @XmlAttribute(name = "designTargetEnergyCost")
    private double designTargetEnergyCost;
    
    @XmlAttribute(name = "designTargetTotalGHGEmissions")
    private double designTargetTotalGHGEmissions;
    
    @XmlAttribute(name = "designTargetSiteTotal")
    private double designTargetSiteTotal;
 
    @XmlAttribute(name = "designTargetSiteIntensity")
    private double designTargetSiteIntensity;
    
    @XmlAttribute(name = "designTargetSourceTotal")
    private double designTargetSourceTotal;
    
    @XmlAttribute(name = "designTargetSourceIntensity")
    private double designTargetSourceIntensity;
    
    @XmlAttribute(name = "medianEnergyCost")
    private double medianEnergyCost;
    
    @XmlAttribute(name = "medianTotalGHGEmissions")
    private double medianTotalGHGEmissions;
    
    @XmlAttribute(name = "medianScore")
    private double medianScore;
     
    public int getId() {
        return propertyId;
    }
    public void setId(int propertyId) {
        this.propertyId = propertyId;
    }
  
public double getmendianScore() {
return medianScore;
}
//    
//    public void setFirstName(String firstName) {
//        this.firstName = firstName;
//    }
//    public String getLastName() {
//        return lastName;
//    }
//    public void setLastName(String lastName) {
//        this.lastName = lastName;
//    }
}
package tests;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.StringReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
 
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Unmarshaller;

import com.User; 

public class RestClientXML {

	public static void main(String[] args) 
    {
        try
        {
            URL url = new URL(" https://portfoliomanager.energystar.gov/wstest/");
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
            conn.setRequestMethod("GET");
            conn.setRequestProperty("Accept", "application/xml");
 
            if (conn.getResponseCode() != 200) 
            {
                throw new RuntimeException("Failed : HTTP error code : " + conn.getResponseCode());
            }
 
            BufferedReader br = new BufferedReader(new InputStreamReader((conn.getInputStream())));
            String apiOutput = br.readLine();
            System.out.println(apiOutput);
            conn.disconnect();
 
            JAXBContext jaxbContext = JAXBContext.newInstance(User.class);
            Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
            User user = (User) jaxbUnmarshaller.unmarshal(new StringReader(apiOutput));
 
            System.out.println(user.getId());
            
/*            System.out.println(user.getFirstName());
            System.out.println(user.getLastName());
             */
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (JAXBException e) {
            e.printStackTrace();
        }
    }
}

我知道有些身份验证需要用户名和pw,因此我也尝试了此身份验证,而不是RestClient类,但均不起作用。

public static void main(String[] args) {
        CloseableHttpClient httpClient = null;
        HttpPost httpPost = null;
        CloseableHttpResponse response = null;

        try {

            httpClient = HttpClients.createDefault();
            httpPost = new HttpPost("https://portfoliomanager.energystar.gov/wstest/");

            List<NameValuePair> nvps = new ArrayList<NameValuePair>();
            nvps.add(new BasicNameValuePair("content-type", "application/xml"));

             StringEntity input = new StringEntity("{\"username\": \"yungv1\",\"password\": \"dummypassword\"}");
             input.setContentType("application/xml");
             httpPost.setEntity(input);

            for (NameValuePair h : nvps)
            {
                httpPost.addHeader(h.getName(), h.getValue());
            }

            response = httpClient.execute(httpPost);

            if (response.getStatusLine().getStatusCode() != 200) {
                throw new RuntimeException("Failed : HTTP error code : "
                        + response.getStatusLine().getStatusCode());
            }

            BufferedReader br = new BufferedReader(new InputStreamReader(
                    (response.getEntity().getContent())));

            String output;
            System.out.println("Output from Server .... \n");
            while ((output = br.readLine()) != null) {
                System.out.println(output);
            }
            
        } catch (MalformedURLException e) {

            e.printStackTrace();

        } catch (IOException e) {

            e.printStackTrace();

        } finally {
            try{
                response.close();
                httpClient.close();
            }catch(Exception ex) {
                ex.printStackTrace();
            }
        }

我知道这很草率。您能指出我如何实现目标的方向吗?

我也尝试运行此命令,并不断收到401错误,我认为身份验证失败。我不知道该如何解决这个问题,还有其他需要研究的地方。

jn1kk
conn.setRequestProperty("Authorization", "Basic " + Base64.encodeBase64String((getWebServicesUsername() + ":" + getWebServicesPassword()).getBytes()));

其中conn是HttpURLConnection。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

在客户端进行身份验证,如何现在保护我的Java Rest API?

Rest API:客户端授权和最终用户身份验证

Jboss EAP 7 - REST API 客户端的动态 SSL 身份验证

Google API身份验证:客户端的无效来源

使用Go进行IAM身份验证的API网关HTTP客户端请求

使用证书对 Kubernetes API(NodeJS)客户端进行身份验证不成功

如何使用客户端证书在Web API中进行身份验证和授权

使用客户端凭据身份验证通过 Graph API 创建自定义扩展

使用Fabric和Twitter API客户端获取“已通过Twitter进行身份验证”

使用外部 Laravel 护照 lumen api 进行 Laravel 客户端身份验证

Google Drive API 身份验证 - 在客户端进行身份验证?

PHP中的System Center Operations Manager(SCOM)1801 REST API身份验证

仅使用客户端JavaScript使用Google自然语言API进行简单身份验证

如何使用快递作为代理和XHR作为客户端通过客户端身份验证联系Twitter API

如何使用PowerShell对AAD进行身份验证并作为本地客户端应用程序调用Graph API?

Google API:我可以使用 PHP 客户端对特定用户进行身份验证吗?

如何使用符合 JAX-RS 2.0 的 RESTEasy 客户端 API 启用 NTLM 身份验证?

具有客户端证书身份验证的.Net Core Web API

来自 JavaFX 桌面客户端应用程序的 RESTful API 身份验证

针对Self Host Web API Windows服务对HTTP .NET客户端进行身份验证

Django内部API客户端/服务器身份验证?

如何将Windows身份验证凭据从客户端传递到Web API服务

通过用户身份验证保护特定客户端的API

node.js 客户端的 Adobe Analytics Segments API 身份验证问题

Web api 2客户端和用户两部分身份验证

WSO2 API Manager 1.6.0-API身份验证失败

Java REST API客户端

是否可以通过Azure AD进行身份验证以使用客户端凭据授予来访问Dynamics Web API

使用Google日历API版本3.0的客户端ID的OAuth 2.0在c#.net的浏览器中再次询问身份验证详细信息