Отправка https, не получая ожидаемое значение в результате - PullRequest
0 голосов
/ 07 апреля 2011

Я, наконец, получил свое заявление, чтобы "по-видимому" опубликовать в https.Тем не менее, каждый раз, когда я публикую и получаю результат, результат -200.Этот результат - ответ от сервера, говорящий мне, что мне нужно пройти аутентификацию.Результат будет положительным, если я правильно аутентифицируюсь.И я отправляю сообщение для аутентификации ... так что ответ просто говорит мне, что он терпит неудачу.Я поговорил с администратором сервера, и он сказал, что, возможно, у меня есть место где-то в фактическом сообщении.

Мой вопрос: как мне проверить полное сообщение, которое публикуется?Как я могу проверить, чтобы убедиться, что то, что я вставил в URL в веб-браузере, совпадает с тем, что публикуется в приложении?Прямо сейчас у меня есть некоторые из них, но откуда я знаю, что ВСЕ это сообщение верно.Начиная с «https» и до самого конца сообщения.

Заранее спасибо !!Любая помощь приветствуется, и если вы видите что-то не так с тем, что у меня есть, пожалуйста, дайте мне знать!СПАСИБО!

URL должен выглядеть следующим образом при публикации:

https://ipaddress/health_monitoring/admin.php?action=authentication&username=uName&password=pWord

//my database helper class
public class SmartDBHelper {
    private static SmartDBHelper sDBHObject;

    private SmartDBHelper() {

    }

    public static synchronized SmartDBHelper getSDBHObject() {
        if(sDBHObject == null) {
            sDBHObject = new SmartDBHelper();
        }
        return sDBHObject;
    }

    public Object clone() throws CloneNotSupportedException {
        throw new CloneNotSupportedException();
    }

    /* this function is to authenticate with the database
     * it returns the id_subject, if it is greater than 0
     * authentication was successful.
     */
    public static synchronized int authenticate(String uName, String pWord) {
        Map<String, String> tempMap = new LinkedHashMap<String, String>();
        tempMap.put("action", "authentication");
        tempMap.put("username", "uName");
        tempMap.put("password", "pWord");
        try {
            String tempUrl = "https://ipaddress/health_monitoring/admin.php";
            String result = post(tempUrl, tempMap);
            Log.v("smartdbhelper post result", result);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return 0;
    }

    // always verify the host - dont check for certificate
    final static HostnameVerifier DO_NOT_VERIFY = new HostnameVerifier() {
            public boolean verify(String hostname, SSLSession session) {
                    return true;
            }
    };

    /**
     * Trust every server - dont check for any certificate
     */
    private static void trustAllHosts() {
            // Create a trust manager that does not validate certificate chains
            TrustManager[] trustAllCerts = new TrustManager[] { new X509TrustManager() {
                    public java.security.cert.X509Certificate[] getAcceptedIssuers() {
                            return new java.security.cert.X509Certificate[] {};
                    }

                    public void checkClientTrusted(X509Certificate[] chain,
                                    String authType) throws CertificateException {
                    }

                    public void checkServerTrusted(X509Certificate[] chain,
                                    String authType) throws CertificateException {
                    }
            } };

            // Install the all-trusting trust manager
            try {
                    SSLContext sc = SSLContext.getInstance("TLS");
                    sc.init(null, trustAllCerts, new java.security.SecureRandom());
                    HttpsURLConnection
                                    .setDefaultSSLSocketFactory(sc.getSocketFactory());
            } catch (Exception e) {
                    e.printStackTrace();
            }
    }

    private static String post(String urlString, Map formParameters)
    throws MalformedURLException, ProtocolException, IOException {
        DataOutputStream ostream = null;

        trustAllHosts();
        URL tempUrl;
        tempUrl = new URL(urlString);
        HttpsURLConnection https = (HttpsURLConnection) tempUrl.openConnection();
        https.setHostnameVerifier(DO_NOT_VERIFY);

        https.setRequestMethod("POST");
        https.setDoInput(true);
        https.setDoOutput(true);
        ostream = new DataOutputStream(https.getOutputStream());

        if(formParameters != null) {
            Set parameters = formParameters.keySet();
            Iterator it = parameters.iterator();
            StringBuffer buf = new StringBuffer();

            for(int i = 0, paramCount = 0; it.hasNext(); i++) {
                String parameterName = (String) it.next();
                String parameterValue = (String) formParameters.get(parameterName);

                if(parameterValue != null) {
                    parameterValue = URLEncoder.encode(parameterValue);
                    if(paramCount > 0) {
                        buf.append("&");
                    }
                    buf.append(parameterName);
                    buf.append("=");
                    buf.append(parameterValue);
                    ++paramCount;
                }
            }
            Log.v("smartdbhelper adding post parameters", buf.toString());
            Log.v("smartdbhelper adding post parameters", https.toString());
            ostream.writeBytes(buf.toString());
        }

        if( ostream != null ) {
            ostream.flush();
            ostream.close();
        }
        Object contents = https.getContent();
        InputStream is = (InputStream) contents;
        StringBuffer buf = new StringBuffer();
        int c;
        while((c = is.read()) != -1) {
            buf.append((char)c);
            Log.v("smartdbhelper bugger", buf.toString());
        }
        https.disconnect();
        return buf.toString();
    }
}

Ответы [ 3 ]

0 голосов
/ 07 апреля 2011

Хорошо, я только что заметил следующее:

tempMap.put("username", "uName");
tempMap.put("password", "pWord");

Вы помещаете постоянные значения "uName" и "pWord" в карту вместо переменных.Это должно быть:

tempMap.put("username", uName);
tempMap.put("password", pWord);

Вы также можете сначала вызвать .trim() для параметров, чтобы убедиться, что нет лишних пробелов.

0 голосов
/ 09 апреля 2011

Я понял, в чём моя проблема!На самом деле я публиковал на http, прежде чем добавить сообщение в URL ... упс.

Фиксированный код для поста приведен ниже для тех, кому нужен пример.

private static String post(String urlString, Map formParameters)
throws MalformedURLException, ProtocolException, IOException {
    DataOutputStream ostream = null;

    trustAllHosts();
    URL tempUrl;
    StringBuffer buf = new StringBuffer();
    if(formParameters != null) {
        Set parameters = formParameters.keySet();
        Iterator it = parameters.iterator();
        //StringBuffer buf = new StringBuffer();

        for(int i = 0, paramCount = 0; it.hasNext(); i++) {
            String parameterName = (String) it.next();
            String parameterValue = (String) formParameters.get(parameterName);

            if(parameterValue != null) {
                parameterValue = URLEncoder.encode(parameterValue);
                if(paramCount > 0) {
                    buf.append("&");
                }
                buf.append(parameterName);
                buf.append("=");
                buf.append(parameterValue);
                ++paramCount;
            }
        }
        Log.v("smartdbhelper adding post parameters", buf.toString());


    }
    urlString = urlString + "?" + buf;
    Log.v("smartdbhelper url string", urlString);
    tempUrl = new URL(urlString);
    HttpsURLConnection https = (HttpsURLConnection) tempUrl.openConnection();
    https.setHostnameVerifier(DO_NOT_VERIFY);
    Log.v("smartdbhelper adding post parameters", https.toString());
    https.setRequestMethod("POST");
    https.setDoInput(true);
    https.setDoOutput(true);
    ostream = new DataOutputStream(https.getOutputStream());
    ostream.writeBytes(buf.toString());


if( ostream != null ) {
    ostream.flush();
        ostream.close();
    }
    Object contents = https.getContent();
    InputStream is = (InputStream) contents;
    StringBuffer buf2 = new StringBuffer();
    int c;
    while((c = is.read()) != -1) {
        buf2.append((char)c);
        Log.v("smartdbhelper bugger", buf2.toString());
    }
    https.disconnect();
    return buf2.toString();
}
0 голосов
/ 07 апреля 2011

Я никогда не слышал о -200, указывающем на необходимость аутентификации.Это ваш код ответа, отправленный вашим сервером?Как правило, вы получаете 401 или подобное, когда вам нужно аутентифицироваться.

Вот стандартные коды состояния HTTP

Кроме того, когда вы публикуете параметры, они не получаютдобавляется в конец URL, чтобы ваш URL не выглядел так, как указано в верхней части вопроса.

Это будет просто https://ipaddress/health_monitoring/admin.php

...