2012-11-04 50 views
1

我想使用Jsoup和HttpClient自动发布大量HTML表单。这些表单中的大多数都有隐藏字段(包括会话ID等),或者有我宁愿单独留下的默认值。使用Jsoup获取表单中的所有名称/值对

单独编写每个表单提交 - 从页面提取每个隐藏或默认值 - 是非常乏味的,所以我想写一个通用方法来获取给定表单的HTTP参数列表。但它并不是一段简单的代码,因为各种各样的输入标签和字段类型,每一种都可能需要特定的处理(例如textareas,复选框,单选按钮,选择...),所以我我以为如果它已经存在,我会先搜索/询问。

注意:Jsoup和HttpClient是给定的;我无法改变 - 所以请不要提供建议其他解决方案的答案:我有一个Jsoup Document对象,我需要构建一个HttpClient HttpRequest。

回答

3

所以我写完了。我仍然希望交换经过实地测试(并希望在其他地方维护)的东西,但如果它可以帮助任何人在这里登陆...

未经过彻底测试,并且不支持multipar/form-data,但适用于我试过的几个例子:

public void submit(String formSelector, List<String> params) { 
    if (params.size() % 2 != 0) { 
     throw new Exception("There must be an even number of params."); 
    } 

    Element form= $(formSelector).first(); 

    Set<String> newParams= Sets.newHashSet(); 
    for (int i=0; i < params.size(); i+= 2) { 
     newParams.add(params.get(i)); 
    } 

    List<String> allParams= Lists.newArrayList(params); 
    for (Element field: form.select("input, select, textarea")) { 
     String name= field.attr("name"); 
     if (name == null || newParams.contains(name)) continue; 
     String type= field.attr("type").toLowerCase(); 
     if ("checkbox".equals(type) || "radio".equals(type)) { 
     if (field.attr("checked") != null) { 
      allParams.add(field.attr("name")); 
      allParams.add(field.attr("value")); 
     } 
     } 
     else if (! fieldTypesToIgnore.contains(type)) { 
     allParams.add(field.attr("name")); 
     allParams.add(field.val()); 
     } 
    } 

    String action= form.attr("abs:action"); 
    String method= form.attr("method").toLowerCase(); 
    // String encType= form.attr("enctype"); -- TODO 

    if ("post".equals(method)) { 
     post(action, allParams); 
    } 
    else { 
     get(action, allParams); 
    } 
    } 

($,get和post是我已经躺在身边的方法......你可以很容易地猜出他们做了什么)。

0

Jsoup在FormElement类中有formData方法;它在简单的情况下工作,但它并不总是做我需要的,所以我最终也写了一些自定义代码。

相关问题