Volley请求只有在访问桌面浏览器上的页面后才能工作



所以。我的问题(对我来说)非常奇怪。我正在使用Volley向这个网站发送HTTP请求。使用相同的代码,我得到了3种类型的响应。其中一个充满了奇怪的符号(WRÉââxúD©zíï&D…),第二个是页面自己的错误页面,第三种是我想要的:药物页面。

我得到想要的、实际结果页面的唯一方法是奇怪的事情。我正在向医药页面发送HTTP GET。只要这样做就会产生类型1或类型2。但是!当我第一次点击链接(我在Android Studio中登录)并用桌面浏览器转到页面时(通常尝试几次后,错误页面有时会弹出),然后再次点击我的应用程序中的链接,它加载得很好!

我已经试过很多次了,看起来确实是这样。我不会重新启动我的应用程序,因为我可以返回到结果视图并再次单击药物。我可能会点击药物几十次,结果总是出现错误页面或奇怪的符号,但访问桌面上的页面,然后在应用程序中再次点击,总是会产生所需的页面。可能是什么问题?关于饼干的事?

请求的代码如下:

public static void requestWithUrl(final HTTPRequestListener listener, final String url) {
    Log.d("WUT", "URL: " + url);
    final StringRequest request = new StringRequest(Request.Method.GET, url, new Response.Listener<String>() {
        @Override
        public void onResponse(String response) {
            Log.d("WUT", "Got url response");
            try {
                String encoding = "UTF-8";
                String line;
                InputStream stream = new ByteArrayInputStream(response.getBytes(encoding));
                BufferedReader reader = new BufferedReader(new InputStreamReader(stream, encoding));
                while ((line = reader.readLine()) != null) {
                    Log.d("WUT", "LINE: " + line);
                }
            } catch (Exception e) {
                listener.onHTTPFailure();
            }
            listener.onFoundSingle("Title", response, true);
        }
    }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {
            Log.d("WUT", "Got url error");
            listener.onHTTPFailure();
        }
    }) {
        @Override
        protected Map<String, String> getParams() throws AuthFailureError {
            Map<String, String> params = new HashMap<>();
            params.put("Content-Type", "text/html; charset=utf-8");
            return params;
        }
        @Override
        public Map<String, String> getHeaders() throws AuthFailureError {
            Map<String, String> params = new HashMap<>();
            params.put("Host", "www.laakeinfo.fi");
            params.put("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:46.0) Gecko/20100101 Firefox/46.0");
            params.put("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8");
            params.put("Accept-Language", "fi-FI,fi;q=0.8,en-US;q=0.5,en;q=0.3");
            params.put("Accept-Encoding", "gzip, deflate");
            params.put("Referer", "http://www.laakeinfo.fi/Search.aspx");
            return params;
        }
    };
    request.setTag(TAG);
    queue.add(request);
}

自从我找到答案以来,打开问题似乎很有治疗作用。简单地说,当我第一次请求药物列表时,我会在parseNetworkResponse中获取Set-Cookie标题的内容并保存它。然后,当我请求实际页面时,我将Cookie参数设置为保存的cookie,一切都像做梦一样。

相关内容

最新更新