Konvertieren cURL Befehl in pure Java
Habe ich eine google-token, und mit es, ich fordere eine Authentifizierungs-URL von google mit der folgenden cURL-Befehl:
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'
Wie kann ich umwandeln mit diesem Befehl in eine Reine java-Befehl mit URL-verbindungen oder die Apache-HTTP-Bibliothek? So dass ich nicht haben, verwenden Sie die cURL-binary nicht mehr.
Sah ich mehrere Beispiele, aber ich bin vor einigen Schwierigkeiten mit der POST-Parameter. Ich kann nicht Holen Sie richtig ist.
Meine java versuchen:
$$ TOKEN $$ --> ersetzt werden müssen durch die echten token.
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();
}
}
}
Meine eclipse-Konsole Drucke:
Url=https://www.google.com/accounts/ErrorMsg?id=unknown
Error=Unknown
LÖSUNG:
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
}
}
}
Ich nur hatte, um die SSL-Zertifikat-Validierung und dann hat es geklappt.
poste deinen code und die Fehlermeldung bitte
Gibt es einen Grund, warum man nicht mit einem OAuth-Bibliothek zu handhaben?
Ich Schnitt ihn in den ersten post.
Gibt es einen Grund, warum man nicht mit einem OAuth-Bibliothek zu handhaben?
Ich Schnitt ihn in den ersten post.
InformationsquelleAutor Christian Lanz | 2013-08-12
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn du java benutzen.net.HttpURLConnection schreiben Sie die bytes, die die post Daten direkt in den Ausgabestrom. Also alles, was Sie würde tun müssen, ist nehmen Ihre --Daten und konvertieren Sie es in bytes und schreiben in den stream.
Ihre Antwort würde arbeiten wie ein charme, wenn die Ziel-URL ist http. Wenn die Website hat SSL, benötigen Sie ein ssl cert validation (siehe code in meinem ersten Beitrag) - dann funktioniert es tadellos. Danke 😉
InformationsquelleAutor Joseph Helfert