3

うまくいけば、あなたの何人かが私の「頭脳の行き詰まり」を手伝ってくれるでしょう。

(理解のために)php-scriptを使用してデータベースを受信しようとしています。したがって、有効なユーザー名/ pwd-comboを使用し、適切なパラメーターを送信している場合にのみ、php-scriptにアクセスできるwebadress/serverを呼び出す必要があります。

私のコードは、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を使用しようとしています。なぜ明確にする必要があるのか​​、ライブシステムはHTTPS(サーバー認証)を使用します。

今では、私は方法を理解しようとして何日も無駄にしています...

  1. HttpURLConnectionを使用したPOSTパラメーター
  2. サーバーで認証する
  3. 認証を避けてください-一般的にチェックしてください(テストのために!)

どこで間違いを犯しているのかわかりません。これまでの私のコードの下に...

    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()が呼び出されるとすぐに、アクティビティは中止されます。ただし、getOutputStream()にも有効な値はありません。

さて、質問に移りましょう。誰かが私のコードを確認して、パラメータを正しい方法でPOSTする方法を教えてもらえますか?それに加えて、URL経由で認証を送信できるかどうか知っていますか?特にHTTPの「S」の部分に興味があります。非セキュアモードの場合、私はすでに実行中のソリューションを持っています。

ご協力いただきありがとうございます!

4

1 に答える 1

0

Firefox などのブラウザーを使用して手動で HTTPS 接続を実行できる場合は、ブラウザーから送信された要求を調べて (Firebug Firefox 拡張機能を使用して)、そこから必要なヘッダーをコピーしてコードに挿入します。

アイデアは、最初に標準ツール (この場合はブラウザー) を使用してログインし、成功した場合に送受信されるものを確認することです。

于 2013-03-24T12:33:39.323 に答える