Android и ResponseCache ... Отсутствуют заголовки запроса - PullRequest
1 голос
/ 01 июля 2011

Я реализую ResponseCache для HttpUrlConnection в Android.Кажется, все работает.Я звоню

ResponseCache.setDefault(new ResCache());

И методы в моем классе ResCache используются, как и ожидалось.Единственная проблема, которую я имею, состоит в том, что Карта с параметрами запроса пуста.Если я попробую этот же самый код за пределами среды Android, я смогу увидеть параметр заголовка запроса, но внутри действия и все такое не работает.Вот код для Activity.

package com.httptest;

import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.CacheRequest;
import java.net.CacheResponse;
import java.net.HttpURLConnection;
import java.net.ResponseCache;
import java.net.URI;
import java.net.URL;
import java.net.URLConnection;
import java.util.List;
import java.util.Map;

import android.app.Activity;
import android.os.Bundle;

public class HttpTest extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        ResponseCache.setDefault(new ResCache());
        HttpURLConnection urlConnection = null;
        try {
        URL url = new URL("http://169.254.198.146//patch/500.php");
        urlConnection = (HttpURLConnection) url
                .openConnection();
        urlConnection.setUseCaches(true);
        urlConnection.setRequestProperty("MY_PROPERTY", "MY_VALUE");
            InputStream in = new BufferedInputStream(
                    urlConnection.getInputStream());
            String aux = readStream(in);
        }catch(Exception e){
            e.printStackTrace();
        }finally {
            urlConnection.disconnect();
        }
    }

    public static String readStream(InputStream in) throws IOException {
        StringBuilder sb = new StringBuilder();
        BufferedReader r = new BufferedReader(new InputStreamReader(in), 1000);
        for (String line = r.readLine(); line != null; line = r.readLine()) {
            sb.append(line);
        }
        in.close();
        return sb.toString();
    }

    public class ResCache extends ResponseCache{

        @Override
        public CacheResponse get(URI arg0, String arg1,
                Map<String, List<String>> arg2) throws IOException {
            System.out.println(arg2);
            return null;
        }

        @Override
        public CacheRequest put(URI uri, URLConnection connection)
                throws IOException {
            return null;
        }
    }
}

В методе ResCache.get (URI, String, Map) карта всегда пуста.Я хотел бы видеть параметры, которые я добавил к запросу.Кстати все параметры хорошо заданы в запросе, так как я могу прочитать их на сервере при выполнении запроса.

Опять же, это работает вне среды Android.

Любая помощь с этим?

Спасибо!

1 Ответ

2 голосов
/ 14 июля 2011

Мне кажется, есть ошибка в реализации Android HttpURLConnection, когда заголовки ответа передаются этому методу вместо заголовков запроса.

Я решил эту проблему в своем коде, как показано ниже, хотя я не обращался к Google за более подробной информацией об ошибке в Android, но я вполне уверен, что реализация Android для httpurlconnection имеет некоторую проблему, как вы можете видеть, что она работает на Android-андроид:

В основном я исправил это, передав VirenRequestHeadersMap вместо передачи URLConnection # getRequestProperies (), чтобы соответствовать значениям, передаваемым из put (...).

@Override
        public CacheRequest put(URI uri, URLConnection connection)
                throws IOException {
            MyPrivateContext context = <>;
            context.setConnection(connection);

            //...
        }

@Override
        public CacheResponse get(URI arg0, String arg1,
                Map<String, List<String>> arg2) throws IOException {
            System.out.println(arg2);

            MyPrivateContext context = <>;
            URLConnection connection = context.getConnection();
            arg2 = new VirenRequestHeadersMap(connection);
            //...
        }

А вот и весь класс VirenRequestHeadersMap, если вам интересно, как он выглядит:

class VirenRequestHeadersMap implements Map<String, List<String>> {

    private final URLConnection mConnection;

    public VirenRequestHeadersMap(URLConnection connection) {
        mConnection = connection;
    }

    public void clear() {
        throw new UnsupportedOperationException();
    }

    public boolean containsKey(Object key) {
        if (key instanceof String) {
            String field = (String) key;
            return mConnection.getRequestProperty(field) != null;
        } else {
            return false;
        }
    }

    public boolean containsValue(Object value) {
        throw new UnsupportedOperationException();
    }

    public Set<Entry<String, List<String>>> entrySet() {
        throw new UnsupportedOperationException();
    }

    public List<String> get(Object key) {
        if (key instanceof String) {
            String field = (String) key;
            String value = mConnection.getRequestProperty(field);
            return value != null ? Collections.singletonList(value) : null;
        } else {
            return null;
        }
    }

    public boolean isEmpty() {
        throw new UnsupportedOperationException();
    }

    public Set<String> keySet() {
        throw new UnsupportedOperationException();
    }

    public List<String> put(String key, List<String> value) {
        throw new UnsupportedOperationException();
    }

    public void putAll(Map<? extends String, ? extends List<String>> value) {
        throw new UnsupportedOperationException();
    }

    public List<String> remove(Object key) {
        throw new UnsupportedOperationException();
    }

    public int size() {
        throw new UnsupportedOperationException();
    }

    public Collection<List<String>> values() {
        throw new UnsupportedOperationException();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...