2016-04-10 2 views
1

Итак, я занимаюсь своими проблемами уже некоторое время с помощью Интернета, но у меня был минимальный успех.Использование Android Volley для поиска в поисковой строке веб-сайта

Проблема: я использую Android с библиотекой Volley, чтобы попытаться выполнить поиск с двух веб-сайтов. На рассматриваемых веб-сайтах нет открытого API или что-либо, чтобы увидеть, как я могу выполнять поиск. Я попытался проверить HTTP-запросы в Firefox, открыв F12.

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"); (содержимое панели поиска), он просто возвращает страницу поиска.

Теперь мои вопросы, что я пытаюсь сделать возможным? Я не слишком хорошо разбираюсь в веб-материалах, но, похоже, страницы скрывают логику поиска и все, что затрудняет выполнение поисков. Если это действительно возможно, как я могу это сделать? Любые намеки были бы оценены в этой попытке.

ответ

1

Быстрый ответ ДА, вы можете это сделать! ... но это может быть не так просто :)

Таким образом, серверы могут проверять многие вещи в запросе и даже «незначительные» данные, такие как заголовок Accept-Language: заголовок может привести к тому, что служба вернется или не получит ответ.

у вас есть 2 основные вещи, которые вы должны проверить и экспериментировать с и 1 замечание:

1) Headers

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) Params

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

Хотя «Search1: txtSearch» кажется очевидным один, чтобы сделать поиск другой может играть роль в этом, так что я хотел бы добавить все эти и удалить их с 1 по один и попробуйте.

3) (примечание) ответ 302 это почтовый запрос, который не возвращает ответ, а скорее перенаправляет его. Вы должны быть осторожны, чтобы включить отладочные журналы и проверить, что Volley возвращает, поскольку этот ответ считается ошибкой в ​​залпе. Он может обрабатываться использованием HTTP Stack Volley, но зависит от того, какой из них установлен.Если это так, то это будет прозрачно для волейбола, но в противном случае необходимо выполнить некоторую настройку на Volley или использовать другой стек. Например, андроид принял и испек OkHttp в Android-источнике как родной клиент, фактически используемый URLConnection. Поэтому более ранние версии, такие как KitKat, не будут обрабатывать это перенаправление. Но новые релизы, однако, справляются с этим.

+0

Большое спасибо за советы и поддержку! Я действительно получил его работу, включив все, что вы сказали (который был найден с помощью Network Inspector), и отменил Content-Type. Как-то это все испортило. Кроме того, поскольку это форма, мне пришлось использовать POST вместо GET :) – Mootpoint

Смежные вопросы