简体   繁体   English

将cURL命令转换为纯Java

[英]Convert cURL command into pure Java

I have got a google token and with it, I request an authentication URL from google with the following cURL command: 我有一个google令牌,并用它通过以下cURL命令从google请求一个身份验证URL:

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'

How can I convert this command into a pure java command with URL connections or the Apache HTTP library? 如何通过URL连接或Apache HTTP库将该命令转换为纯Java命令? So that I don't have to use the cURL binary any more. 这样我就不必再使用cURL二进制了。

I saw several examples but I'm facing some troubles with the POST parameters. 我看到了几个示例,但是我在POST参数方面遇到了一些麻烦。 I can't get is right. 我无法理解是正确的。

My java try: 我的Java尝试:

$$ TOKEN $$ --> must be replaced by the real token. $$ 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();
        }
    }
}

My eclipse console prints: 我的Eclipse控制台打印:

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

SOLUTION: 解:

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
        }
    }
}

I just had to add the SSL cert validation and then it worked. 我只需要添加SSL证书验证就可以了。

If you use java.net.HttpURLConnection you can write the bytes of the post data right to the outputstream. 如果使用java.net.HttpURLConnection,则可以将发布数据的字节直接写入输出流。 So all you would have to do is take your --data and convert it to bytes and write it to the stream. 因此,您所要做的就是获取--data并将其转换为字节,然后将其写入流。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM