java获取GET和POST请求参数

6 篇文章 0 订阅

URL和参数列表

一 获取请求方式
request.getMethod();    get和post都可用,

二 获取请求类型

request.getContentType();   get和post都可用,示例值:application/json ,multipart/form-data, application/xml等

三 获取所有参数key

request.getParameterNames();   get和post都可用,注:不适用contentType为multipart/form-data

四 获取参数值value

request.getParameter("test");   get和post都可用,注:不适用contentType为multipart/form-data

五 获取取参数请求集合

request.getParameterMap();   get和post都可用,注: 不适用contentType为multipart/form-data


六 获取文本流

   request.getInputStream() 适用于如:application/json,xml,multipart/form-data文本流或者大文件形式提交的请求或者xml等形式的报文

七 获取URL

getRequestURL()

八 获取参数列表:

1.getQueryString()

只适用于GET,比如客户端发送http://localhost/testServlet?a=b&c=d&e=f,通过request.getQueryString()得到的是a=b&c=d&e=f.


2.getParameter()
GET和POST都可以使用
但如果是POST请求要根据<form>表单提交数据的编码方式来确定能否使用.
当编码方式是(application/x- www-form-urlencoded)时才能使用.
这种编码方式(application/x-www-form-urlencoded)虽然简单,但对于传输大块的二进制数据显得力不从心.
对于传输大块的二进制数这类数据,浏览器采用了另一种编码方式("multipart/form-data"),这时就需要使用下面的两种方法.

3.getInputStream()
4.getReader()
上面两种方法获取的是Http请求包的包体,因为GET方式请求一般不包含包体.所以上面两种方法一般用于POST请求获取参数.

需要注意的是:
request.getParameter()、 request.getInputStream()、request.getReader()这三种方法是有冲突的,因为流只能被读一次。
比如:
当form表单内容采用 enctype=application/x-www-form-urlencoded编码时,先通过调用request.getParameter()方法得到参数后,
再调用request.getInputStream()或request.getReader()已经得不到流中的内容,
因为在调用 request.getParameter()时系统可能对表单中提交的数据以流的形式读了一次,反之亦然。

当form表单内容采用 enctype=multipart/form-data编码时,即使先调用request.getParameter()也得不到数据,
所以这时调用request.getParameter()方法对 request.getInputStream()或request.getReader()没有冲突,
即使已经调用了 request.getParameter()方法也可以通过调用request.getInputStream()或request.getReader()得到表单中的数据,
而request.getInputStream()和request.getReader()在同一个响应中是不能混合使用的,如果混合使用就会抛异常。


九:下面附上解析multipart/form-data格式的报文方法,

示例报文如下:


解析:(利用upload方式解析的可以忽略)

     /**
     * 解析multipart/form-data
     * @param res 这是通过request.getInputStream()都出来的报文
     * @param contentType multipart/form-data
     * @return  解析multipart/form-data格式提交过来的的流,转成json,这里忽略了报文中的“文件”部分,只解析“文本”字段
     */
    private static String getData(String res, String contentType) {
        BufferedReader reqbuf = null;
        JSONObject jsonObject = new JSONObject();
        try {
            final int NONE = 0; // 状态码,表示没有特殊操作
            final int DATAHEADER = 1; // 表示下一行要读到报头信息
            final int FIELDDATA = 2; // 表示下面要读到表单域的文本值
            String fieldname = ""; // 表单域的名称
            String fieldvalue = ""; // 表单域的值
            String boundary = ""; // 分界符字符串
            String lastboundary = ""; // 结束分界符字符串
            int pos = contentType.indexOf("boundary=");
            if (pos != -1) {
                pos += "boundary=".length();
                boundary = "--" + contentType.substring(pos); // 解析出分界符
                lastboundary = boundary + "--"; // 得到结束分界符
            }
            // 起始状态为NONE
            int state = NONE;
            // 从字符串中得到输出缓冲流
            reqbuf = new BufferedReader(new StringReader(res));
            while (true) {
                //读一行
                String s = reqbuf.readLine();
                //如果读到结束标志
                if (s == lastboundary || s == null) {
                    break;
                }
                switch (state) {
                    case NONE:
                        if ((s.startsWith(boundary))) {
                            // 如果读到分界符,则表示下一行一个头信息
                            state = DATAHEADER;
                        }
                        break;
                    case DATAHEADER:
                        pos = s.indexOf("name=");
                        if(pos != -1){
                            pos += "name=".length() + 1; // 1表示后面的"的占位(引号的占位)
                            s = s.substring(pos, s.length() - 1);
                            fieldname = s; // 表单域的名称放入fieldname
                            state = FIELDDATA; // 设置状态码,准备读取表单域的值
                        }
                        break;
                    case FIELDDATA:
                        // 读取表单域的值,再次读取,因为中间有空行
                        s = reqbuf.readLine();
                        fieldvalue = s; // 存入fieldvalue
                        jsonObject.put(fieldname, fieldvalue);
                        state = NONE;
                        break;
                }
            }
        } catch (IOException e) {
            log.error("解析异常", e);
        } finally {
            try {
                reqbuf.close();
            } catch (IOException e) {
                log.error("关闭异常", e);
            }
        }
        return jsonObject.toJSONString();
    }

  • 8
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
Java可以使用HTTPClient和HttpURLConnection两种方式来实现GET和POST请求。 使用HTTPClient的方法有两个版本,分别是HTTPClient3.1和HTTPClient4.5.5。HTTPClient3.1位于org.apache.commons.httpclient包下,而HTTPClient4.5.5位于org.apache.http.client包下。这两个版本都提供了对远程URL的操作工具包,可以满足工作需求。 另一种方式是使用HttpURLConnection,它是Java的标准请求方式。可以通过创建HttpURLConnection对象来发送GET和POST请求,并获取响应结果。 以下是使用HTTPClient和HttpURLConnection实现GET和POST请求的示例代码: 使用HTTPClient3.1实现GET请求: ```java HttpClient client = new HttpClient(); GetMethod method = new GetMethod(url); int statusCode = client.executeMethod(method); String response = method.getResponseBodyAsString(); ``` 使用HTTPClient4.5.5实现GET请求: ```java CloseableHttpClient client = HttpClients.createDefault(); HttpGet request = new HttpGet(url); CloseableHttpResponse response = client.execute(request); String result = EntityUtils.toString(response.getEntity()); ``` 使用HttpURLConnection实现GET请求: ```java URL url = new URL("http://example.com"); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); connection.setRequestMethod("GET"); int responseCode = connection.getResponseCode(); BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream())); String line; StringBuilder response = new StringBuilder(); while ((line = reader.readLine()) != null) { response.append(line); } reader.close(); ``` 使用HTTPClient4.5.5实现POST请求: ```java CloseableHttpClient client = HttpClients.createDefault(); HttpPost request = new HttpPost(url); List<NameValuePair> params = new ArrayList<>(); params.add(new BasicNameValuePair("param1", "value1")); params.add(new BasicNameValuePair("param2", "value2")); request.setEntity(new UrlEncodedFormEntity(params)); CloseableHttpResponse response = client.execute(request); String result = EntityUtils.toString(response.getEntity()); ``` 使用HttpURLConnection实现POST请求: ```java URL url = new URL("http://example.com"); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); connection.setRequestMethod("POST"); connection.setDoOutput(true); OutputStreamWriter writer = new OutputStreamWriter(connection.getOutputStream()); writer.write("param1=value1&param2=value2"); writer.flush(); int responseCode = connection.getResponseCode(); BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream())); String line; StringBuilder response = new StringBuilder(); while ((line = reader.readLine()) != null) { response.append(line); } reader.close(); ``` 以上是使用Java实现GET和POST请求的方法,可以根据具体需求选择适合的方式来发送请求获取响应结果。\[1\]\[2\] #### 引用[.reference_title] - *1* [用Java实现GET,POST请求](https://blog.csdn.net/lianzhang861/article/details/80364549)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [JAVA的GET和POST请求实现方式](https://blog.csdn.net/u012513972/article/details/79569888)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

EmineWang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值