使用Java发送HTTP请求GET / POST以形成?

时间:2012-03-31 09:31:25

标签: java http http-post http-get

所以我有这段代码,我得到它的工作,现在它基本上允许我发送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>

现在因为Submit按钮没有name属性,我无法向它发送正确的HTTP Get / Post请求(我知道在这种情况下它是一个get方法)。如何用(适当的键/值)替换String数据,以便它实际向此表单发送请求?

4 个答案:

答案 0 :(得分:1)

我正在使用HttpClient生成http请求

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

HttpClient Learning Artical

答案 1 :(得分:1)

您根本不会将submit部分添加到数据中。这仅供浏览器知道“提交”按钮触发操作。请注意新打开的网站的网址如何显示: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

答案 2 :(得分:0)

//发出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( “引用站点”,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代码获取标题,http参数,cookie,管理会话...... :):)

答案 3 :(得分:0)

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

http://myjavatools.com/