Android,HttpsUrlConnection:POST参数&用于接收InputStream的密码

时间:2012-06-26 14:43:54

标签: android database post parameters httpsurlconnection

希望你们中的一些人可以帮助我解决“大脑僵局”。

(仅供了解)我正在尝试使用php脚本接收数据库。因此,我必须调用一个webadress / server,只有当我使用有效的用户名/ pwd-combo并发送正确的参数时,才能访问php脚本。

使用HttpClient和HttpPost时,我的代码工作正常。 (在GOOD代码下面)

    InputStream myInputDB = null;
    OutputStream myOutputDB = null;
    HttpResponse response = null;
    // Path to the just created empty db
    String dbFilePath = DB_PATH + KeyConstants.DB_NAME;

    try {
        // Creating HTTP client
        HttpClient httpClient = new DefaultHttpClient();
        // Creating HTTP Post
        List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(2);
        nameValuePairs.add(new BasicNameValuePair("version", "20110516140000"));
        HttpPost httppost = new HttpPost("http://USERNAME:PASSWORD@SomeAdress/u/db2.php");
        httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
        response = httpClient.execute(httppost);
        //Open your local db as the input stream
        myInputDB = response.getEntity().getContent();
        //Open the empty db as the output stream
        myOutputDB = new FileOutputStream(dbFilePath);
        //transfer bytes from the inputfile to the outputfile
            byte[] buffer = new byte[1024];
        int length;
        while ((length = myInputDB.read(buffer)) > 0) {
            myOutputDB.write(buffer, 0, length);
        }
        //Close the streams
        myOutputDB.flush();
        myOutputDB.close();
        myInputDB.close();

现在我正在尝试使用HttpURLConnection / HttpsURLConnection而不是上面的解决方案。为什么要清楚,live-system使用HTTPS(服务器认证)。

到现在为止,我浪费了几天试图弄明白......

  1. 使用HttpURLConnection的POST参数
  2. 在服务器上进行身份验证
  3. 一般避免认证检查(测试!)
  4. 而我只是不知道我在哪里弄错了。到目前为止我的代码下面......

        String urlString = "http://USERNAME:PASSWORD@SomeAdress/u/db2.php";
        String params = "version=20110516140000";
        InputStream stream = null;
        url = new URL(urlString);
        if (url.getProtocol().toLowerCase().equals("https")) {
            trustAllHosts();
    
            HttpsURLConnection urlconn = (HttpsURLConnection) url.openConnection();
            urlconn.setHostnameVerifier(DO_NOT_VERIFY);
            urlconn.setDoInput(true);
            urlconn.setDoOutput(true);
            urlconn.setRequestMethod("POST");
            urlconn.setRequestProperty("Content-Type", "text/xml");
            urlconn.setRequestProperty("Content-Length", String.valueOf(params.getBytes().length));
    
            OutputStreamWriter wr = new OutputStreamWriter(urlconn.getOutputStream());
            wr.write(params);
            wr.flush();
    
            stream = urlconn.getInputStream();
            if ("gzip".equals(urlconn.getContentEncoding())) {
                stream = new GZIPInputStream(stream);
            }
    
            wr.close();
    
        } else {            
            // Almost the same as if-path, but without trustAllHosts() and with HttpURLConnection instead of HttpsURLConnection         
        }
    
        return stream;
    

    我需要的是一个InputStream,然后我可以在Android手机上保存/复制(如在工作代码中)。到目前为止,我得到的结果是IOException。一旦调用urlconn.getInputStream(),Activity就会中止。但getOutputStream()也没有有效值。

    现在回答这个问题。任何人都可以检查我的代码并告诉我如何以正确的方式POST参数。除此之外你知道我是否可以通过URL发送身份验证?特别是HTTP'S'部分让我感兴趣。对于非安全模式,我已经有了一个正在运行的解决方案。

    感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

如果您可以使用浏览器手动执行HTTPS连接,例如Firefox,然后您只需查看浏览器发送的请求(例如使用Firebug Firefox扩展程序)并从您需要的标题中复制并将它们放入您的代码中。

我们的想法是先使用标准工具(本例中为浏览器)登录,然后查看成功发送和接收的内容。