【问题标题】:Using Android Volley to perform a search on a website's search bar使用 Android Volley 在网站的搜索栏上执行搜索
【发布时间】:2016-04-10 09:43:39
【问题描述】:

所以我在互联网的帮助下处理我的问题已经有一段时间了,但收效甚微。

问题:我正在使用带有 Volley 库的 Android 来尝试从两个网站执行搜索。有问题的网站没有开放的 API 或任何东西来查看我如何执行搜索。我尝试使用 F12 打开视图来检查 Firefox 中的 HTTP 请求。

Website 1 使用 HTTPS 协议。我需要使用 Vnr 号码从这里搜索。从结果页面中,我将解析药物的名称。

Website 2 使用 HTTP 协议。从这里我会使用找到的药物名称进行搜索,然后我会得到药物描述(芬兰语)。

对于网站 2,我尝试了以下代码,成功返回了结果页面的 HTML 文件:

    RequestQueue queue = Volley.newRequestQueue(this);
    String url = "http://www.laakeinfo.fi/Medicine.aspx?m=758&d=2111337&i=ORION+PHARMA_RESILAR_RESILAR+oraaliliuos+3+mg/ml";

    StringRequest request = new StringRequest(Request.Method.GET, url, new Response.Listener<String>() {
        @Override
        public void onResponse(String response) {
            Log.d("HTTPTEST", "Response len: " + response.length());
            writeToFile(response);
        }
    }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {
            Log.d("HTTPTEST", "Error: " + error.getMessage());
        }
    }) {
        @Override
        protected Map<String, String> getParams() throws AuthFailureError {
            Map<String, String> params = new HashMap<String, String>();
            params.put("i", "Resilar");
            return params;
        }

        @Override
        public Map<String, String> getHeaders() throws AuthFailureError {
            Map<String, String> params = new HashMap<String, String>();
            params.put("Content-Type", "application/x-www-form-urlencoded");
            return params;
        }
    };

    queue.add(request);

现在这行得通,因为 URL 直接指向我想要的位置。如果我将 URL 更改为 "http://www.laakeinfo.fi/Search.aspx" 并在 getParams() 中使用 params.put("Search1:txtSearch", "Resilar");(搜索栏的内容),它只会返回搜索页面本身。

现在我的问题是,我正在尝试做的事情可能吗?我对网络东西不太了解,但似乎这些页面隐藏了搜索逻辑和所有内容,这使得执行搜索变得困难。如果确实有可能,我该怎么做呢?在此尝试中将不胜感激任何提示。

【问题讨论】:

    标签: android asp.net http https android-volley


    【解决方案1】:

    快速的回答是是的,你可以做到! ...但可能没那么简单:)

    因此服务器可能会检查请求中的许多内容,甚至像 Accept-Language: 标头这样的“无关紧要”数据可能会导致服务返回或不响应。

    你有 2 件主要的事情需要检查和试验,还有 1 条评论:

    1) 标题

        Host: xn--lkeinfo-5waa.fi
    User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.11; rv:45.0) Gecko/20100101 Firefox/45.0
    Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
    Accept-Language: en-US,en;q=0.5
    Accept-Encoding: gzip, deflate
    DNT: 1
    Referer: http://xn--lkeinfo-5waa.fi/Search.aspx
    Cookie: ASP.NET_SessionId=mxj22y2oofzwcnmtcen50c45
    

    这些可能会改变行为,因此您需要在那里进行试验。我会尝试把所有我认为可能有用或不理解的东西都写出来。在这里,我将只删除“Cookie”和“Accept-Encoding”。

    2) 参数

    __EVENTTARGET:"Search1$lbSubmit"
    __EVENTARGUMENT:""
    __VIEWSTATE:"/wEPDwUKMTc2NzY1NjI3Mg9kFgJmD2QWBAIDD2QWAgIFDxYCHgVjbGFzcwUGYWN0aXZlZAIFD2QWBGYPFgIfAAUJZnJtc2VhcmNoZAICDw8WBh4IQ3NzQ2xhc3MFA2J0bh4EVGV4dAUDSEFFHgRfIVNCAgJkZGQ2BqYJzINvRHYkGXr7+fwtg0L8cQ=="
    __VIEWSTATEGENERATOR:"BBBC20B8"
    __EVENTVALIDATION:"/wEWBALa8vLKCALQkcCMBAL43fjZDALY7fiNCoNRBovCyGbCM+mhYEACTRYyyeuF"
    Search1:txtSearch:"Resilar"
    Search1:hdLanguageId:"1"
    

    虽然 'Search1:txtSearch' 似乎是一个显而易见的搜索,但另一个可能会参与其中,所以我会添加所有这些并一个一个删除它们并尝试。

    3) (remark) response 302 这是一个不返回响应而是重定向到响应的发布请求。您必须小心启用调试日志并检查 Volley 返回的内容,因为此响应被视为 volley 中的错误。它可能由 Volley 使用的 HTTP Stack 处理,但这取决于设置了哪一个。如果是这种情况,这对 volley 是透明的,但否则需要对 Volley 进行一些自定义或使用另一个堆栈。例如android已经采用并烘焙了Android源码中的OkHttp作为URLConnection实际使用的native client。所以像 KitKat 这样的早期版本不会处理这个重定向。然而,新版本会处理它。

    【讨论】:

    • 非常感谢您的建议和鼓励!实际上,我通过包含您所说的所有内容(使用 Network Inspector 找到)并删除 Content-Type 来使其正常工作。不知何故,它把一切都搞砸了。另外,因为它是一个表单,我不得不使用 POST 而不是 GET :)
    猜你喜欢
    • 2018-07-31
    • 1970-01-01
    • 2023-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-06
    相关资源
    最近更新 更多