Проблемы с получением JSON с сервера https на Android - PullRequest
0 голосов
/ 01 февраля 2011

это мой вопрос / проблема:

Я делаю URL-запрос к серверу, который аутентифицируется по SSL через https, но при получении ответа всегда возвращается пустым, когда я преобразовываю ввод в строку. Другой вызов без параметров всегда проходит гладко

Есть идеи?

URL: https://www.server.com/api/getResources.php?res[]=Argentina&res[]=Australia&res[]=Bolivia

И код:

HttpURLConnection http = conectar(URL);
    InputStream urlInputStream = null;
    try {
        urlInputStream = http.getInputStream();
    } catch (IOException e) {

    }

метод конектара:

private HttpURLConnection conectar(String surl) {
    URL url = null;
    try {
        url = new URL(surl);
    } catch (MalformedURLException e) {

    }

    HttpURLConnection http = null;

    if (url.getProtocol().toLowerCase().equals("https")) {
        trustEveryone();
        HttpsURLConnection https = null;
        try {
            https = (HttpsURLConnection) url.openConnection();
        } catch (IOException e) {

        }
        // https.setHostnameVerifier(DO_NOT_VERIFY);
        http = https;
    } else {
        try {
            http = (HttpURLConnection) url.openConnection();
        } catch (IOException e) {

        }
    }
    Authenticator.setDefault(new MyAuthenticator());
    return http;
}

Метод trustEveryone:

HttpsURLConnection
                .setDefaultHostnameVerifier(new HostnameVerifier() {
                    public boolean verify(String hostname,
                            SSLSession session) {
                        return true;
                    }
                });
        SSLContext context = SSLContext.getInstance("TLS"); // TLS
        context.init(null, new X509TrustManager[] { new X509TrustManager() {
            public void checkClientTrusted(X509Certificate[] chain,
                    String authType) throws CertificateException {
            }

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

            public X509Certificate[] getAcceptedIssuers() {
                return new X509Certificate[0];
            }
        } }, new SecureRandom());
        HttpsURLConnection.setDefaultSSLSocketFactory(context
                .getSocketFactory());

1 Ответ

0 голосов
/ 01 февраля 2011

Правильно ли указана строка URL?Если это так, вам нужно закодировать квадратные скобки перед передачей в конструктор URL.Документация для URL гласит:

Класс URL сам по себе не кодирует и не декодирует какие-либо компоненты URL в соответствии с механизмом экранирования, определенным в RFC2396.Вызывающая сторона несет ответственность за кодирование любых полей, которые должны быть экранированы до вызова URL, а также за декодирование любых экранированных полей, которые возвращаются с URL

EDIT
RFC2396 гласит, что:

Данные, соответствующие исключенным символам, должны быть экранированы для надлежащего представления в URI.

Квадратные скобки считаются исключенными символами.

Таким образом, вам необходимо закодировать строку параметров, прежде чем включать ее в URL.Вы не хотите кодировать весь URL, так как в противном случае он будет кодировать такие символы, как :.Вот фрагмент кода:

String parameters = "res[]=Argentina&res[]=Australia&res[]=Bolivia";
String encodedParameters = URLEncoder.encode(parameters , "UTF-8");

Затем вы можете добавить это к своему хосту и пути и передать его в ваш URL конструктор.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...