EnergyStar Portfolio Manager - клиент Java для использования своего REST API с аутентификацией

Я новичок прямо. После 2 недель исследований я пришел к этому моменту, все еще очень потерянный и отчаянный.

Моя цель: извлечь данные из EnergyStar Portfolio Manager Restful веб-сервисов / 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, которые я представлял, что аутентификация терпит неудачу. Я не знаю, как еще можно снять эту часть и есть ли еще что-то, что мне нужно изучить.

1 ответ

Решение
conn.setRequestProperty("Authorization", "Basic " + Base64.encodeBase64String((getWebServicesUsername() + ":" + getWebServicesPassword()).getBytes()));

Где conn HttpURLConnection.

Другие вопросы по тегам