繁体   English   中英

使用Jsoup获取表单中的所有名称 - 值对

[英]Obtaining all name-value pairs in a form using Jsoup

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

单独编写每个表单提交 - 从页面中提取每个隐藏或默认值 - 非常繁琐,所以我考虑编写一个通用方法来获取给定表单的HTTP参数列表。

然而,这不是一个简单的代码片段,因为输入标签和字段类型的多样性,每个都可能需要特定的处理(例如textareas,复选框,单选按钮,选择......)所以我想我会首先搜索/询问,以防它已经存在。

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

所以我最终写了它。 我仍然更愿意交换经过现场测试的东西(并希望在其他地方进行维护),但万一它可以帮助任何人降落在这里......

没有经过全面测试,也没有对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是我已经躺在那里的方法......你可以很容易地猜到他们做了什么)。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM