【问题标题】:Sending HTTP Request GET/POST to form with Java?使用 Java 发送 HTTP 请求 GET/POST 以形成表单?
【发布时间】:2012-03-31 09:31:24
【问题描述】:

所以我有这段代码,我让它工作,现在它基本上允许我向我想要的几乎任何外部网站发送 http post 和获取请求,除非元素不包含 name 属性。这是一个例子:

这是Java代码:

    public static String sendPostRequest(String url) {

    StringBuffer sb = null;

    try {

        String data = URLEncoder.encode("user", "UTF-8") + "="
                + URLEncoder.encode("myUserName", "UTF-8") + "&"
                + URLEncoder.encode("submit", "UTF-8") + "="
                + URLEncoder.encode("Submit", "UTF-8");


        URL requestUrl = new URL(url);
        HttpURLConnection conn = (HttpURLConnection) requestUrl
                .openConnection();
        conn.setDoOutput(true);
        conn.setRequestMethod("GET");

        OutputStreamWriter osw = new OutputStreamWriter(
                conn.getOutputStream());
        osw.write(data);
        osw.flush();

        BufferedReader br = new BufferedReader(new InputStreamReader(
                conn.getInputStream()));

        String in = "";
        sb = new StringBuffer();

        while ((in = br.readLine()) != null) {
            sb.append(in + "\n");
        }

        osw.close();
        br.close();
    } catch (UnsupportedEncodingException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (MalformedURLException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    return sb.toString();
}

这是我试图向其发送请求的表单(它是 w3schools 网站上的表单,这是网站 http://www.w3schools.com/html/html_forms.asp):

<form name="input0" target="_blank" action="html_form_action.asp" method="get">

Username: 

<input type="text" name="user" size="20" />

<input type="submit" value="Submit" />

</form>

现在因为提交按钮没有名称属性,我无法向它发送正确的 HTTP Get/Post 请求(我知道在这种情况下它是一个 get 方法)。我应该用什么替换字符串数据(什么正确的键/值),以便它实际上向这个表单发送请求?

【问题讨论】:

    标签: java http http-post http-get


    【解决方案1】:

    我正在使用 HttpClient 来生成 http 请求

    HttpClient 是开源的 apache 项目。你可以得到广泛的代码。 HttpClient 4.1版是很好的Http api集

    HttpClient Learning Artical

    【讨论】:

    • 这与我正在尝试做的事情有什么不同?我在问我应该使用哪些键/值将 HTTP 发布请求发送到特定站点......而不是某种 API
    • @user1007059 : HttpClient 会给你更好的可读性,你可以解决你的问题...我在我的项目中使用这个 httpclien 4.1 并从任何 URL 获取数据。
    【解决方案2】:

    您根本不会将submit 部分添加到您的数据中。这只是为了让浏览器知道“提交”按钮触发了操作。注意新打开站点的 URL 的外观:http://www.w3schools.com/html/html_form_action.asp?user=myUserName - 这里没有 submit 部分。所以你的data 代码应该是这样的:

    String data = URLEncoder.encode("user", "UTF-8") + "="
                + URLEncoder.encode("myUserName", "UTF-8"); // end here
    

    【讨论】:

    • ehm 不起作用,无论我是在 html_form_action.asp 站点还是 html_forms.asp 站点上使用它。而且我已经在其他网站上尝试过,除非我将提交按钮部分添加到它,否则它不起作用......
    • 这可能是因为当您调用getOutputStream() 时,GET 请求会自动替换为POST。这是一个合理的做法,因为通常这就是作者的意思。要真正发出GET 请求,请删除整个OutputStreamWriter 部分并将您的data 附加到请求URL,就像它应该在有效的GET 请求中一样:URL requestUrl = new URL(url + "?" + data);。当然你还是不要添加submit 部分。
    • 但这不会是 GET 请求,它只是直接获取某个 URL 的 HTML 源。我需要发送请求。我试图通过完全删除输出流来做到这一点,但它仍然只是返回错误的数据。
    • 嗯,这确实是一个 GET 请求 - 只是一个带有查询部分的 URL (?someData=value&amp;otherData=value...)。您也可以在浏览器地址栏中手动输入,然后按 Enter。就像您填写表格并按下submit 按钮一样。将 GET 视为类似于 POST 的东西,其中所有数据从正文移动到问号后面的 URL。这有点过于简单了,但可以抓住这个想法。在这里查看完整代码:pastebin.com/Zmf6irXC
    【解决方案3】:

    //发出http get请求

    HttpClient httpClientDefault1 = new DefaultHttpClient();
    HttpPost httpPost = new HttpPost("http://www.your.targer.url.com/page.html");
    

    //设置标头(服务器理解某些浏览器抛出的请求)

    httpPost.setHeader("Connection", "keep-alive");
    httpPost.setHeader("User-Agent", "Mozilla/5.0 (Windows NT 6.1; rv:9.0.1) Gecko/20100101 Firefox/9.0.1");
    httpPost.setHeader("Accept", " text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8");
    httpPost.setHeader("Accept-Language", "en-us,en;q=0.5");
    httpPost.setHeader("Host", "ec2-23-20-44-83.compute-1.amazonaws.com");
    

    httpPost.setHeader("Referer",resultUrl+resultUrlAsp);

    //设置参数

    ArrayList<NameValuePair> nameValuePair = new ArrayList<NameValuePair>();
    nameValuePair.add(new BasicNameValuePair("key",""));
    nameValuePair.add(new BasicNameValuePair("txtenroll","095020693015"));
    httpPost.setEntity(new UrlEncodedFormEntity(nameValuePair));
    

    //发送请求

    HttpResponse httpRespnse = httpClientDefault1.execute(httpPost);
    

    //获取响应正文

    if(httpRespnse.getStatusLine().getStatusCode() != 200) {
        InputStream in =  httpRespnse.getEntity().getContent();
        byte b[] = new byte[1024] ;
        StringBuilder html = new StringBuilder("");
        while(in.read(b) != -1) {
            html.append((new String(b)).toString());
            b = new byte[1024];
        }
        System.out.println(html);
    }
    

    你也可以通过java代码获取headers、http参数、cookies、管理会话... :) :)

    【讨论】:

    • 需要注意的是这里使用的是Apache库。
    【解决方案4】:

    我有一个 ClientHttpRequest 类,它可以处理所有多部分、文件等,并带有可选的进度跟踪和取消。它已经存在了大约 10 年。使用起来非常简单。 现在也有 Scala 版本。 https://github.com/vpatryshev/ScalaKittens/blob/master/src/main/scala/scalakittens/ClientHttpRequest.scala

    http://myjavatools.com/

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-06-11
      • 1970-01-01
      • 1970-01-01
      • 2023-04-02
      • 2011-03-20
      相关资源
      最近更新 更多