繁体   English   中英

将cURL命令转换为纯Java

[英]Convert cURL command into pure Java

我有一个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'

如何通过URL连接或Apache HTTP库将该命令转换为纯Java命令? 这样我就不必再使用cURL二进制了。

我看到了几个示例,但是我在POST参数方面遇到了一些麻烦。 我无法理解是正确的。

我的Java尝试:

$$ 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();
        }
    }
}

我的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证书验证就可以了。

如果使用java.net.HttpURLConnection,则可以将发布数据的字节直接写入输出流。 因此,您所要做的就是获取--data并将其转换为字节,然后将其写入流。

暂无
暂无

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

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