11

Ho automatizzato con successo il processo per spostare i dati da Google Big Query, a Google Storage. Ora ho bisogno di scaricare i dati da Google Storage nel mio ambiente in modo automatico.Scarica file da Google Storage utilizzando Java

Sto tentando di eseguire una normale richiesta HTTP, ma autorizzo prima. Quindi la mia richiesta HTTP è

HttpRequestFactory requestFactory = HTTP_TRANSPORT.createRequestFactory(authorize()); 
    GenericUrl url = new GenericUrl(uri); 
    HttpRequest request = requestFactory.buildGetRequest(url); 
    HttpResponse response = request.execute(); 
    String content = response.parseAsString(); 

E il mio codice di autorizzazione è

/** Authorizes the installed application to access user's protected data. */ 
    private static Credential authorize() throws Exception 
    { 
     HttpTransport httpTransport = new NetHttpTransport(); 
     JsonFactory jsonFactory = new JacksonFactory(); 

     // load client secrets 
     GoogleClientSecrets clientSecrets = GoogleClientSecrets.load(JSON_FACTORY, 
       new InputStreamReader(BigQueryConsumer.class.getResourceAsStream("/secret.json"))); 

     // This creates the credentials datastore at ~/.oauth-credentials/${credentialDatastore} 
     FileDataStoreFactory fileDataStoreFactory = new FileDataStoreFactory(new File(System.getProperty("user.home") + "/" + CREDENTIALS_DIRECTORY)); 

     // set up authorization code flow 
     GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow.Builder(
       httpTransport, JSON_FACTORY, clientSecrets, 
       SCOPES).setDataStoreFactory(fileDataStoreFactory) 
       .build(); 
     // authorize 
     return new AuthorizationCodeInstalledApp(flow, new LocalServerReceiver()).authorize("user"); 
    } 

Dove le seguenti costanti sono

  1. CREDENTIALS_DIRECTORY: ".oauth-credenziali"
  2. JSON_FACTORY: JacksonFactory. getDefaultInstance()
  3. SCOPES: un elenco di stringhe che hanno appena "https://www.googleapis.com/auth/devstorage.full_control"
  4. HTTP_TRANSPORT: nuova NetHttpTransport()

Che cosa mi manca durante il processo di autenticazione/autorizzazione? Sto ottenendo

Exception in thread "main" com.google.api.client.http.HttpResponseException: 401 Unauthorized 
<HTML> 
<HEAD> 
<TITLE>Unauthorized</TITLE> 
</HEAD> 
<BODY BGCOLOR="#FFFFFF" TEXT="#000000"> 
<H1>Unauthorized</H1> 
<H2>Error 401</H2> 
</BODY> 
</HTML> 
+1

Si potrebbe anche voler provare [ 'gcloud-java'] (http://googlecloudplatform.github.io/gcloud-java/), ecco qualche [codice di esempio] (https: //github.com/GoogleCloudPlatform/gcloud-java/blob/master/gcloud-java-examples/src/main/java/com/google/gcloud/examples/StorageExample.java). –

risposta

5

Per gli altri in cerca di una risposta. Esistono diversi passaggi da seguire per utilizzare le credenziali predefinite dell'applicazione ... È possibile seguire i passaggi seguenti o dare un'occhiata a questo link.

  1. Per prima cosa: l'installazione di cloud storage di Google SDK
  2. Assicurarsi la possibilità di eseguire i comandi dal SDK. Se non hai installato python devi installare python 2.7 o superiore, e anche pyopenssl ...
  3. È necessario eseguire l'autenticazione dall'interno dell'SDK eseguendo l'account di servizio attivo di attivazione di gcloud. --key-fil e [file .p12] (Modifica i valori tra parentesi quadre). Quando lo esegui dovresti ricevere un messaggio che ti dice che hai attivato il tuo account di servizio
  4. Devi impostare le variabili di ambiente dall'SDK impostando GOOGLE_APPLICATION_CREDENTIALS sul percorso JSON del segreto (quello scaricato dall'account di servizio creato dalla console sviluppatori) CLOUDSDK_PYTHON_SITEPACKAGES a 1, e anche l'impostazione del progetto di

Comandi per configurare le variabili di sistema ...

 
set GOOGLE_APPLICATION_CREDENTIALS "secret.json path" 
set CLOUDSDK_PYTHON_SITEPACKAGES 1 
gcloud config set project "your project name" 

dopo l'autenticazione, e autorizzare voi stessi, può quindi iniziare a utilizzare le credenziali di default delle applicazioni, dato che hai impostato correttamente il tuo ambiente.

Quando si successo preparare il proprio ambiente, è possibile autenticare e ottenere le credenziali di default, semplicemente

 
     GoogleCredential credential = GoogleCredential.getApplicationDefault(); 

     if (credential.createScopedRequired()) { 
      credential = credential.createScoped(StorageScopes.all()); 
     } 

     HttpTransport httpTransport = GoogleNetHttpTransport.newTrustedTransport(); 
     storageService = new Storage.Builder(httpTransport, jsonFactory, credential) 
       .setApplicationName(applicationName).build(); 

E tramite HTTP GET per ottenere oggetti dal secchio di archiviazione di Google, vale a direqualcosa di simile al seguente

 
// Set up and execute a Google Cloud Storage request. 
       String uri = "https://storage.googleapis.com/" + URLEncoder.encode("[your bucket name here]", "UTF-8") + "/" + googleStorageFileName + "/" + fileName; 

       httpTransport = GoogleNetHttpTransport.newTrustedTransport(); 
       HttpRequestFactory requestFactory = httpTransport.createRequestFactory(
         credential); 
       GenericUrl url = new GenericUrl(uri); 

       HttpRequest request = requestFactory.buildGetRequest(url); 
       HttpResponse response = request.execute(); 
       String content = response.parseAsString(); 
       BufferedWriter writer = new BufferedWriter(new FileWriter(pathToSave + googleStorageFileName)); 
       writer.write(content);