Java - 使用HtmlUnit发送POST请求

14

我在这方面找不到任何帮助,但我一直在尝试使用HtmlUnit发送post请求。 我有的代码是:

final WebClient webClient = new WebClient();

// Instead of requesting the page directly we create a WebRequestSettings object
WebRequest requestSettings = new WebRequest(
  new URL("www.URLHERE.com"), HttpMethod.POST);

// Then we set the request parameters
requestSettings.setRequestParameters(new ArrayList());
requestSettings.getRequestParameters().add(new NameValuePair("name", "value"));
// Finally, we can get the page
HtmlPage page = webClient.getPage(requestSettings);

有没有更简单的方法可以执行POST请求?


不使用Web客户端。 - Robert Moskal
3
你好。你想找一个更简单的方法。好的,但是你能解释一下在你的代码片段中你发现了什么难以理解或复杂的地方吗? 抱歉,我没有看到。 - davidxxx
2个回答

21

这就是如何完成的

public void post() throws Exception
{

    URL url = new URL("YOURURL");
    WebRequest requestSettings = new WebRequest(url, HttpMethod.POST);

    requestSettings.setAdditionalHeader("Accept", "*/*");
    requestSettings.setAdditionalHeader("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8");
    requestSettings.setAdditionalHeader("Referer", "REFURLHERE");
    requestSettings.setAdditionalHeader("Accept-Language", "en-US,en;q=0.8");
    requestSettings.setAdditionalHeader("Accept-Encoding", "gzip,deflate,sdch");
    requestSettings.setAdditionalHeader("Accept-Charset", "ISO-8859-1,utf-8;q=0.7,*;q=0.3");
    requestSettings.setAdditionalHeader("X-Requested-With", "XMLHttpRequest");
    requestSettings.setAdditionalHeader("Cache-Control", "no-cache");
    requestSettings.setAdditionalHeader("Pragma", "no-cache");
    requestSettings.setAdditionalHeader("Origin", "https://YOURHOST");

    requestSettings.setRequestBody("REQUESTBODY");

    Page redirectPage = webClient.getPage(requestSettings);
}

您可以根据自己的需要进行定制。添加/删除标题、添加/删除请求体等...


-2

有n个可能的库可以用来调用rest web服务。

1)Apache Http客户端 2)Square的Retrofit 3)Google的Volley

我已经使用了Http Apache客户端和Retrofit。两者都非常棒。

这里是使用Apache HTTP客户端发送Post请求的代码示例:

String token = null;

    HttpClient httpClient = HttpClientBuilder.create().build();
    HttpPost postRequest = new HttpPost(LOGIN_URL);
    StringBuilder sb = new StringBuilder();
    sb.append("{\"userName\":\"").append(user).append("\",").append("\"password\":\"").append(password).append("\"}");
    String content = sb.toString();
    StringEntity input = new StringEntity(content);
    input.setContentType("application/json");
    postRequest.setHeader("Content-Type", "application/json");
    postRequest.setHeader("Accept", "application/json");

    postRequest.setEntity(input);

    HttpResponse response = httpClient.execute(postRequest);

    if (response.getStatusLine().getStatusCode() != 201)
    {
        throw new RuntimeException("Failed : HTTP error code : " + response.getStatusLine().getStatusCode());
    }

    Header[] headers = response.getHeaders("X-Auth-Token");

    if (headers != null && headers.length > 0)
    {
        token = headers[0].getValue();
    }

    return token;

谢谢回复。我已经使用过Apache Httpclient了,但是我需要访问的网站需要等待5秒钟的ddos保护,所以当我使用Httpclient时,我只能得到ddos保护的源代码。获取实际页面的源代码非常重要,因为在发送POST请求后,我需要解析响应。 - Joe Taylor
aviundefined, 我不明白您提出的使用Apache Http Client和其他API比HtmlUnit更容易的方式。您能否请提供一下理由? - davidxxx

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接