如何从 Java 中的 POST 请求中获取表单数据

怪胎09

如何从 POST 请求中提取表单数据,例如。$ curl -X POST -d asdf=blah http://localhost:8000/proxy/http://httpbin.org/post - 我需要提取 asdf=blah。

我目前这样做的方式在很大程度上依赖于我读取的某种格式的数据(我假设表单数据总是在最后一行)。是否有更好(和/或更简单)的方法来获取不依赖于正在读取的数据格式的数据?

(注意:代理同时处理 GET 和 POST 请求)

这是我写的代码:

public class ProxyThread3 extends Thread {
private Socket clientSocket = null;

private OutputStream clientOutputStream;


private static final int BUFFER_SIZE = 32768;

public ProxyThread3(Socket socket) {
    super("ProxyThread");
    this.clientSocket = socket;

}


public void run() {
    try {

        clientOutputStream = clientSocket.getOutputStream();

        // Read request
        InputStream clientInputStream = clientSocket.getInputStream();

        byte[] b = new byte[8196];
        int len = clientInputStream.read(b);

        String urlToCall = "";


        if (len > 0) {

            String userData = new String(b, 0, len);

            String[] userDataArray = userData.split("\n");

            //Parse first line to get URL
            String firstLine = userDataArray[0];
            for (int i = 0; i < firstLine.length(); i++) {

                if (firstLine.substring(i).startsWith("http://")) {

                    urlToCall = firstLine.substring(i).split(" ")[0];
                    break;
                }

            }


            //get request type
            String requestType = firstLine.split(" ")[0];

            String userAgentHeader = "";


            //get USER-AGENT Header and Accept Header
            for (String data : userDataArray) {

                if (data.startsWith("User-Agent")) {

                    userAgentHeader = data.split(":")[1].trim();
                    break;

                }

            }


            switch (requestType) {

                case "GET": {

                    sendGetRequest(urlToCall, userAgentHeader);
                    break;
                }

                case "POST": {


                    String postParams = null;

                    //Get Form Data
                    if (!userDataArray[userDataArray.length - 1].isEmpty()) {

                        postParams = userDataArray[userDataArray.length - 1];

                    }

                    sendPostRequest(urlToCall, userAgentHeader, postParams);
                    break;
                }


            }

        } else {
            clientInputStream.close();
        }

    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        try {
            clientSocket.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}


private void sendPostRequest(String urlToCall, String userAgentHeader,  String postParams) throws IOException {


    URL urlToWriteAndReadFrom = new URL(urlToCall);

    HttpURLConnection httpURLConnection = (HttpURLConnection) urlToWriteAndReadFrom.openConnection();

    httpURLConnection.setRequestMethod("POST");

    // set User-Agent header
    httpURLConnection.setRequestProperty("User-Agent", userAgentHeader);


    httpURLConnection.setDoOutput(true);

    OutputStream urlOutputStream = httpURLConnection.getOutputStream();

    if (postParams != null) {
        urlOutputStream.write(postParams.getBytes());
        urlOutputStream.flush();

    }


    urlOutputStream.close();

    int responseCode = httpURLConnection.getResponseCode();


    if (responseCode == HttpURLConnection.HTTP_OK) { // success


        InputStream dataReader = httpURLConnection.getInputStream();


        //begin send response to client
        byte inputInBytes[] = new byte[BUFFER_SIZE];

        assert dataReader != null;

        int index = dataReader.read(inputInBytes, 0, BUFFER_SIZE);

        while (index != -1) {
            clientOutputStream.write(inputInBytes, 0, index);
            index = dataReader.read(inputInBytes, 0, BUFFER_SIZE);
        }
        clientOutputStream.flush();


    }


}

private void sendGetRequest(String urlToCall, String userAgentHeader) throws IOException {


    URL urlToReadFrom = new URL(urlToCall);
    HttpURLConnection httpURLConnection = (HttpURLConnection) urlToReadFrom.openConnection();

    // set True since reading and getting input
    httpURLConnection.setDoInput(true);
    httpURLConnection.setRequestMethod("GET");

    // set User-Agent header
    httpURLConnection.setRequestProperty("User-Agent", userAgentHeader);

    int responseCode = httpURLConnection.getResponseCode();

    if (responseCode == HttpURLConnection.HTTP_OK) { // success


        InputStream dataReader = httpURLConnection.getInputStream();


        //begin send response to client
        byte inputInBytes[] = new byte[BUFFER_SIZE];

        assert dataReader != null;

        int index = dataReader.read(inputInBytes, 0, BUFFER_SIZE);

        while (index != -1) {
            clientOutputStream.write(inputInBytes, 0, index);
            index = dataReader.read(inputInBytes, 0, BUFFER_SIZE);
        }
        clientOutputStream.flush();


    }


}

}

附注。我对所有这些都是新手,所以如果我的代码中有任何错误,请指出它们

马萨菲

这是一个关于如何创建处理 POST 和 GET 请求的 Java HTTP 服务器的完整示例。

https://www.codeproject.com/Tips/1040097/Create-a-Simple-Web-Server-in-Java-HTTP-Server

共享,这是非常原始的,我建议使用任何第三方库或轻量级 Java 服务器,如GrizzlyJetty,如果不是像 Apache Tomcat 这样使用为此目的而制作的 J2EE Servlet 的服务器。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在C#WebAPI中处理POST表单数据

来自分类Dev

从Java脚本中的表单数据中删除数据

来自分类Dev

在Express中获取POST和GET请求的表单数据

来自分类Dev

卷曲如何发布多部分/表单数据数据以及如何在Flask请求中读取多部分/表单数据

来自分类Dev

如何在Codeigniter中获取提交的表单数据?

来自分类Dev

在PDF Java中创建表单数据

来自分类Dev

如何在Grails中接收Angular $ http post multipart表单数据

来自分类Dev

如何在多部分/表单数据请求中获取文件的实际文件大小

来自分类Dev

如何从ReactJS中的表单构造POST的数据?

来自分类Dev

如何从CycleJS中的POST请求获取文件

来自分类Dev

提取-多部分/表单数据POST中缺少边界

来自分类Dev

如何从POST请求中获取auth参数?

来自分类Dev

如何从多部分表单数据中获取Node JS中间件中的请求正文?

来自分类Dev

如何在Azure函数Java中从POST请求中提取数据

来自分类Dev

从请求中获取表单数据键值

来自分类Dev

request.POST不读取Django中的表单数据

来自分类Dev

如何使用烧瓶使用请求的表单数据在python中调用rest API

来自分类Dev

如何使用go的net / http或类似方法保存在多部分/表单数据POST请求中收到的文件?

来自分类Dev

当表单位于Angular的指令中时,如何获取表单数据?

来自分类Dev

如何使用MonoTouch在iOS中的后期请求中发送表单数据?

来自分类Dev

在C#WebAPI中处理POST表单数据

来自分类Dev

在PHP中读取多部分/表单数据POST数据

来自分类Dev

如何在Angularjs中获取动态表单中的表单数据?

来自分类Dev

如何从CycleJS中的POST请求获取文件

来自分类Dev

如何从POST请求中获取数据

来自分类Dev

如何在控制器中使用 post 值在回调中接收表单数据?

来自分类Dev

如何读取表单数据中针对一个参数发送的 $_POST 中的多个值

来自分类Dev

如何使用正文表单数据获取 Xamarin C# url 中的数据

来自分类Dev

如何从 Nancy 2.0 上的 POST 请求中获取数据?

Related 相关文章

  1. 1

    在C#WebAPI中处理POST表单数据

  2. 2

    从Java脚本中的表单数据中删除数据

  3. 3

    在Express中获取POST和GET请求的表单数据

  4. 4

    卷曲如何发布多部分/表单数据数据以及如何在Flask请求中读取多部分/表单数据

  5. 5

    如何在Codeigniter中获取提交的表单数据?

  6. 6

    在PDF Java中创建表单数据

  7. 7

    如何在Grails中接收Angular $ http post multipart表单数据

  8. 8

    如何在多部分/表单数据请求中获取文件的实际文件大小

  9. 9

    如何从ReactJS中的表单构造POST的数据?

  10. 10

    如何从CycleJS中的POST请求获取文件

  11. 11

    提取-多部分/表单数据POST中缺少边界

  12. 12

    如何从POST请求中获取auth参数?

  13. 13

    如何从多部分表单数据中获取Node JS中间件中的请求正文?

  14. 14

    如何在Azure函数Java中从POST请求中提取数据

  15. 15

    从请求中获取表单数据键值

  16. 16

    request.POST不读取Django中的表单数据

  17. 17

    如何使用烧瓶使用请求的表单数据在python中调用rest API

  18. 18

    如何使用go的net / http或类似方法保存在多部分/表单数据POST请求中收到的文件?

  19. 19

    当表单位于Angular的指令中时,如何获取表单数据?

  20. 20

    如何使用MonoTouch在iOS中的后期请求中发送表单数据?

  21. 21

    在C#WebAPI中处理POST表单数据

  22. 22

    在PHP中读取多部分/表单数据POST数据

  23. 23

    如何在Angularjs中获取动态表单中的表单数据?

  24. 24

    如何从CycleJS中的POST请求获取文件

  25. 25

    如何从POST请求中获取数据

  26. 26

    如何在控制器中使用 post 值在回调中接收表单数据?

  27. 27

    如何读取表单数据中针对一个参数发送的 $_POST 中的多个值

  28. 28

    如何使用正文表单数据获取 Xamarin C# url 中的数据

  29. 29

    如何从 Nancy 2.0 上的 POST 请求中获取数据?

热门标签

归档