2013-08-12 4 views
1

Я получил Google токена и с ним, я запросить URL аутентификации от Google с помощью следующей Curl команды:Преобразования Curl команды в чистый Java

curl --data 'accountType=&Email=&has_permission=1&Token= + $$TOKEN$$ + &service=weblogin%3Acontinue%3Dhttps%253A//www.google.com/dashboard/&source=&androidId=&app=&client_sig=&device_country=&operatorCountry=&lang=&RefreshServices=' -k 'https://android.clients.google.com/auth' 

Как я могу преобразовать эту команду в команду чистой Java с URL-соединениями или с библиотекой Apache HTTP? Так что мне больше не нужно использовать двоичный код cURL.

Я видел несколько примеров, но мне приходится сталкиваться с некоторыми проблемами с параметрами POST. Я не могу получить правильно.

Мой Java попробовать:

$$ ЗНАК $$ -> должен быть заменен реальным лексемы.

import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.util.ArrayList; 
import java.util.List; 

import org.apache.http.HttpResponse; 
import org.apache.http.NameValuePair; 
import org.apache.http.client.HttpClient; 
import org.apache.http.client.entity.UrlEncodedFormEntity; 
import org.apache.http.client.methods.HttpPost; 
import org.apache.http.impl.client.DefaultHttpClient; 
import org.apache.http.message.BasicNameValuePair; 

public class Test implements Runnable { 

    public static void main(String args[]) { 
     new Test(); 
    } 

    public Test() { 
     Thread thread = new Thread(this); 
     thread.start(); 
    } 

    @Override 
    public void run() { 
     HttpClient client = new DefaultHttpClient(); 
     HttpPost post = new HttpPost("https://android.clients.google.com/auth"); 

     try { 

      List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(1); 
      nameValuePairs.add(new BasicNameValuePair("accountType", "")); 
      nameValuePairs.add(new BasicNameValuePair("Email", "")); 
      nameValuePairs.add(new BasicNameValuePair("has_permission", "1")); 
      nameValuePairs.add(new BasicNameValuePair("Token", "$$ TOKEN $$")); 
      nameValuePairs.add(new BasicNameValuePair("service", "weblogin%3Acontinue%3Dhttps%253A//www.google.com/dashboard/")); 
      nameValuePairs.add(new BasicNameValuePair("androidId", "")); 
      nameValuePairs.add(new BasicNameValuePair("app", "")); 
      nameValuePairs.add(new BasicNameValuePair("client_sig", "")); 
      nameValuePairs.add(new BasicNameValuePair("device_country", "")); 
      nameValuePairs.add(new BasicNameValuePair("operatorCountry", "")); 
      nameValuePairs.add(new BasicNameValuePair("lang", "")); 
      nameValuePairs.add(new BasicNameValuePair("RefreshServices", "")); 

      post.setEntity(new UrlEncodedFormEntity(nameValuePairs)); 
      HttpResponse response = client.execute(post); 
      BufferedReader rd = new BufferedReader(new InputStreamReader(response.getEntity().getContent())); 

      String line = ""; 
      while ((line = rd.readLine()) != null) { 
      System.out.println(line); 

      } 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 
} 

Мои консоли Eclipse напечатает:

Url=https://www.google.com/accounts/ErrorMsg?id=unknown 
Error=Unknown 

РЕШЕНИЕ:

import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.io.UnsupportedEncodingException; 
import java.net.HttpURLConnection; 
import java.net.MalformedURLException; 
import java.net.URL; 
import java.security.SecureRandom; 
import java.security.cert.CertificateException; 
import java.security.cert.X509Certificate; 

import javax.net.ssl.HostnameVerifier; 
import javax.net.ssl.HttpsURLConnection; 
import javax.net.ssl.SSLContext; 
import javax.net.ssl.SSLSession; 
import javax.net.ssl.TrustManager; 
import javax.net.ssl.X509TrustManager; 

public class Test implements Runnable { 

    public static void main(String args[]) { 
     new Test(); 
    } 

    public Test() { 
     Thread thread = new Thread(this); 
     thread.start(); 
    } 

    @Override 
    public void run() { 
     String data; 
     String selectedToken = "xxx YOUR TOKEN HERE xxx"; 

     try { 
      data = "accountType=&Email=&has_permission=1&Token=" + selectedToken + 
        "&service=weblogin%3Acontinue%3Dhttps%253A//www.google.com/dashboard/&source=&androidId=" + 
        "&app=&client_sig=&device_country=&operatorCountry=&lang=&RefreshServices="; 

      // Disable cert validation 
      disableCertificateValidation(); 

      HttpURLConnection con = (HttpURLConnection) new URL("https://android.clients.google.com/auth").openConnection(); 
      con.setRequestMethod("POST"); 
      con.setDoOutput(true); 
      con.getOutputStream().write(data.getBytes("UTF-8")); 

      // Get the inputstream 
      BufferedReader reader = new BufferedReader(new InputStreamReader(con.getInputStream())); 

      // .. and print it 
      String tmp; 
      while((tmp = reader.readLine()) != null) { 
       System.out.println(tmp); 
      } 
     } catch (UnsupportedEncodingException e) { 
      e.printStackTrace(); 
     } catch (MalformedURLException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 

    public static void disableCertificateValidation() { 
     // Create a trust manager that does not validate certificate chains 
     TrustManager[] trustAllCerts = new TrustManager[] { new X509TrustManager() { 
      public X509Certificate[] getAcceptedIssuers() { 
       return new X509Certificate[0]; 
      } 

      @Override 
      public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException { 

      } 

      @Override 
      public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException { 

      } 
     }}; 

     // Ignore differences between given hostname and certificate hostname 
     HostnameVerifier hv = new HostnameVerifier() { 
      @Override 
      public boolean verify(String hostname, SSLSession session) { 
       return true; 
      } 
     }; 

     // Install the all-trusting trust manager 
     try { 
      SSLContext sc = SSLContext.getInstance("SSL"); 
      sc.init(null, trustAllCerts, new SecureRandom()); 
      HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory()); 
      HttpsURLConnection.setDefaultHostnameVerifier(hv); 
     } catch (Exception e) { 
      // Do nothing 
     } 
    } 
} 

Я просто должен был добавить проверку сертификата SSL, а затем он работал.

+1

напишите свой код и сообщите об ошибке – Satya

+1

Есть ли причина, по которой вы не используете библиотеку OAuth для обработки всего этого? – chrylis

+0

Я отредактировал его в первом посте. –

ответ

1

Если вы используете java.net.HttpURLConnection, вы можете записать байты данных сообщения прямо в выходной поток. Таким образом, все, что вам нужно сделать, это взять ваш -data и преобразовать его в байты и записать его в поток.

+0

Я получаю «javax.net.ssl.SSLHandshakeException» и «java.security.cert.CertificateException». Как я могу обойти проверку сертификата SSL - как опция «-k» cURL? –

+0

Ваш ответ будет работать как шарм, если целевым URL является http. Если у сайта есть SSL, вам нужно добавить подтверждение ssl cert (см. Код в моем первом сообщении) - тогда он работает отлично. Благодаря ;) –

Смежные вопросы