Java中的Http POST(带文件上传)。

我想做的是在一个java应用程序中提交一个web表单。 我需要填写的表格在这里。http:/cando-dna-origami.org。

表格提交后,服务器会向给定的邮箱发送一封确认邮件,目前我只是用手检查。 我试过手动填写表格,邮件也能正常发送。还需要注意的是,当表格填写错误时,页面只是刷新,并没有任何反馈)。

我从来没有做过http的事情,但是我找了一下,得出了下面的代码,应该是向服务器发送一个post请求。

    String data = "name=M+V&affiliation=Company&email="
            + URLEncoder.encode("m.v@gmail.com", "UTF-8")
            + "&axialRise=0.34&helixDiameter=2.25&axialStiffness=1100&bendingStiffness=230" +
            "&torsionalStiffness=460&nickStiffness=0.01&resolution=course&jsonUpload="
            + URLEncoder.encode("C:/Users/Marjie/Downloads/twisted_DNA_bundles/monotwist.L1.v1.json",
            "UTF-8") + "&type=square";

    URL page = new URL("http://cando-dna-origami.org/");
    HttpURLConnection con = (HttpURLConnection) page.openConnection();

    con.setDoOutput(true);
    con.setRequestMethod("POST");
    con.connect();

    OutputStreamWriter out = new OutputStreamWriter(con.getOutputStream());
    out.write(data);
    out.flush();

    System.out.println(con.getResponseCode());
    System.out.println(con.getResponseMessage());

    out.close();
    con.disconnect();

然而,当它运行时,它似乎没有做任何事情 — 也就是说,我没有收到任何电子邮件,尽管程序确实向System.out打印了 “200 OK”,这似乎表明从服务器上收到了一些东西,尽管我不确定它到底是什么意思。 我想问题可能出在文件上传上,因为我不确定该数据类型是否需要不同的格式。

这是用Java发送POST请求的正确方式吗? 我需要为文件上传做一些不同的事情吗? 谢谢!


看了Adam的帖子后,我使用Apache HttpClient写了以下代码。

    List<NameValuePair> params = new ArrayList<NameValuePair>();
    params.add(new BasicNameValuePair("type", "square"));
    //... add more parameters

    UrlEncodedFormEntity entity = new UrlEncodedFormEntity(params, HTTP.UTF_8);

    HttpPost post = new HttpPost("http://cando-dna-origami.org/");
    post.setEntity(entity);

    HttpResponse response = new DefaultHttpClient().execute(post);
    post = new HttpPost("http://cando-dna-origami.org/");

    post.setEntity(new FileEntity(new File("C:/Users/Marjie/Downloads/twisted_DNA_bundles/monotwist.L1.v1.json"), "text/plain; charset=\"UTF-8\""));
    HttpResponse responseTwo = new DefaultHttpClient().execute(post);

然而,它似乎仍然没有工作;同样,我不确定上传的文件如何适合表单,所以我试着发送两个单独的POST请求,一个是表单,一个是其他数据。 我仍在寻找一种方法来将这些数据合并成一个请求;有人知道这方面的事情吗?

解决方案:

你可能最好使用类似 Apache HttpClient,你可以用它来建立一个 POST 请求。

HttpClient httpclient = new DefaultHttpClient();
HttpPost httppost = new HttpPost("http://.../whatever");

List <NameValuePair> params = new ArrayList<NameValuePair>();
params.add(new BasicNameValuePair("param1", "value1"));
params.add(new BasicNameValuePair("param2", "value2"));
...

httpost.setEntity(new UrlEncodedFormEntity(params, HTTP.UTF_8));

HttpResponse response = httpclient.execute(httppost);

如果您需要将文件与您的表格一起上传,您将需要使用 MultipartEntity 而不是。

MultipartEntity reqEntity = new MultipartEntity();
reqEntity.addPart("someParam", "someValue");
reqEntity.addPart("someFile", new FileBody("/some/file"));
....

httpost.setEntity(reqEntity);

有一些样本程序在 其网站. 基于表格的登录 “和 “多部分编码的请求实体 “是一个很好的例子。

同样值得测试一下你的连接,看看底层的网络数据,看看发生了什么。比如说 Firebug 会让你看到在你的浏览器中到底发生了什么,你可以打开HttpClient日志来查看你的程序中所有的数据交换。另外,你也可以使用像Wireshark或Fiddler这样的软件来实时观察你的网络流量。这可能会让你更好地了解你的浏览器到底在做什么,与你的程序在做什么。

给TA打赏
共{{data.count}}人
人已打赏
未分类

如何生成`c('q01','q02','q03','q04',...'q99')`?[重复]

2022-9-8 21:38:36

未分类

Android - textview hash符号不能正确显示

2022-9-8 21:38:38

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索