Java发起GET/POST请求,接收或发送URL中的数据的问题

在文章开始,先来回忆一下GET、POST这两种请求方式的区别。

   Http定义了与服务器交互的不同方法,最基本的方法有4种,分别是GET,POST,PUT,DELETE。URL全称是资源描述符,我们可以这样认为:一个URL地址,它用于描述一个网络上的资源,而HTTP中的GET,POST,PUT,DELETE就对应着对这个资源的查,改,增,删4个操作。到这里,大家应该有个大概的了解了,GET一般用于获取/查询资源信息,而POST一般用于更新资源信息。

0、GET请求,请求的数据会附加在URL之后,以?分割URL和传输数据,多个参数用&连接。URL的编码格式采用的是ASCII编码,而不是uniclde,即是说所有的非ASCII字符都要编码之后再传输。
POST请求:POST请求会把请求的数据放置在HTTP请求包的包体中。上面的item=bandsaw就是实际的传输数据。
因此,GET请求的数据会暴露在地址栏中,而POST请求则不会。

1、传输数据的大小
在HTTP规范中,没有对URL的长度和传输的数据大小进行限制。但是在实际开发过程中,对于GET,特定的浏览器和服务器对URL的长度有限制。因此,在使用GET请求时,传输数据会受到URL长度的限制。
对于POST,由于不是URL传值,理论上是不会受限制的,但是实际上各个服务器会规定对POST提交数据大小进行限制,Apache、IIS都有各自的配置。

2、安全性
POST的安全性比GET的高。这里的安全是指真正的安全,而不同于上面GET提到的安全方法中的安全,上面提到的安全仅仅是不修改服务器的数据。比如,在进行登录操作,通过GET请求,用户名和密码都会暴露再URL上,因为登录页面有可能被浏览器缓存以及其他人查看浏览器的历史记录的原因,此时的用户名和密码就很容易被他人拿到了。除此之外,GET请求提交的数据还可能会造成Cross-site request frogery攻击

3、HTTP中的GET,POST,SOAP协议都是在HTTP上运行的

以上内容摘自?哪?如有雷同,不关我事。
=======================我是华丽的分割线=========================

以下内容是我在开发中对遇到的问题做的总结,能力一般,水平有限,如有错误,敬请指出。

0. 发出POST请求,获取某接口中的数据。
需求简述: 从指定的接口中获取到数据并存储,POST请求头的header中需要加接口发布方提供的串码,否则POST请求会被拦截,导致获取不到数据。

核心代码如下:一般在service层做处理

**使用IDEA,SpringBoot微服务架构,MongoDB数据库。**
public List<Document> getDataFromURL(){
        String result = "";//用来接收接口中的数据。
        String url = "获取数据的接口URL写在这里";
        /*
        *此处引入了commons-httpclient的jar包,jar包依赖如下:
        <dependency>
            <groupId>commons-httpclient</groupId>
            <artifactId>commons-httpclient</artifactId>
            <version>3.1</version>
        </dependency>
        */
        HttpClient httpClient = new HttpClient();
        PostMethod postMethod = new PostMethod(url);

        try {
            //设置header的名称和值。
            postMethod.setRequestHeader("headerKey","headerValue");
            int statusCode = 0;//设置请求结果的状态值,一般为200、404、500
            try {
                statusCode = httpClient.executeMethod(postMethod);
            }catch (Exception e ){
                e.printStackTrace();
            }
            if(statusCode == HttpStatus.SC_OK){
                try {
                    result = postMethod.getResponseBodyAsString();
                }catch (Exception e){
                    e.printStackTrace();
                }
            }else{
                System.out.println("请求有误,错误代码:"+statusCode);
            }
        }catch (Exception e){
            System.out.println(e.getMessage());
        }finally {
        //关闭HTTP连接,这两行代码一定要有。
            postMethod.releaseConnection();
            httpClient.getHttpConnectionManager().closeIdleConnections(0);
        }

        JSONObject jsonObject = new JSONObject(result);
        JSONArray jsonArray = new JSONArray();
        try {
        //我需要的是接口中的“data”值,具体get什么看自己需求。
            jsonArray = jsonObject.get("data");
        }catch (Exception e){
            System.out.println("获取不到data,检查串码是否过期");
        }

        List<Document> list = new ArrayList<>();
        for (int i = 0; i < jsonArray.length();i++){
            Document document = new Document();
//这个截字符串的方法不错。记住传参一般都是“包头不包尾”
            String time = ((JSONObject)jsonArray.get(i)).getString("time").replace("T"," ").substring(0,19);
           //获取JSON数组中的数据,按需求数据格式转换入库数据的格式。
           //这里就写上你对接口中数据的处理吧,想要什么get什么,之后在return它。
        }
        return list;
    }

1. 发出POST请求,将数据发送至某接口
需求简述 : 某模块发布出一个接口,规定了传数据的格式,我需要把数据库中的数据查出来,组合成为对方需求的格式并发出。

核心代码如下:一般在service层做处理,查询数据的过程不展示

**IDEA、SpringBoot、MongoDB**
//如果项目中多次使用到发数据至某接口的方法,可将此方法作为工具类,设置合理的参数列表即可
public class SendDataToURL {
    //参数列表:url--发送数据的目标地址。param--发送的内容,格式依据自身需求
    public static Boolean sendPost(String url, String param) {
        OutputStreamWriter out = null;
        BufferedReader in = null;
        String result = "";

        try {
            URL realUrl = new URL(url);
            HttpURLConnection conn = null;

            conn = (HttpURLConnection) realUrl.openConnection();

            // 发送POST请求必须设置如下两行
            conn.setDoOutput(true);
            conn.setDoInput(true);
            // 设置请求方式为POST方法
            conn.setRequestMethod("POST");    

            // 设置通用的请求属性
            conn.setRequestProperty("accept", "*/*");
            conn.setRequestProperty("connection", "Keep-Alive");
            conn.setRequestProperty("user-agent",
                    "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
            conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
            //此处可以设置请求参数,若接口的header中有串码可以在此设置。
            conn.setRequestProperty("headerKey", "headerValue");
            conn.connect();

            // 获取URLConnection对象对应的输出流
            out = new OutputStreamWriter(conn.getOutputStream(),"UTF-8");
            // 发送请求参数,发送的数据在此处发送。
            out.write(param);
            // flush输出流的缓冲
            out.flush();
            // 定义BufferedReader输入流来读取URL的响应
            in = new BufferedReader(
                    new InputStreamReader(conn.getInputStream(), "UTF-8"));
            String line ;
            while ((line = in.readLine()) != null) {
                result += line;
            }
        } catch (Exception e) {
            System.out.println("发送 POST 请求出现异常!"+e);
            e.printStackTrace();
        }
        //使用finally块来关闭输出流、输入流
        finally{
            try{
                if(out!=null){
                    out.close();
                }
                if(in!=null){
                    in.close();
                }
            }
            catch(IOException ex){
                ex.printStackTrace();
            }
        }
       //result为请求结束后返回的response,可以让接口发布方设置数据是否发送成功的标识,具体怎么返回还需要你们自己协商。
        if(result.contains("SUCCESS")){
            return true;
        }else{
            return false;
        }
    }

2.由页面发起GET请求,之后POST数据至指定接口,接口方收到数据后返回响应信息,由service层做处理,再由controller返回响应信息至GET请求发起方。

需求简述 : 页面中的button发起了GET请求,controller中调用相关的处理方法,将数据以POST的形式发送至某接口中,接口发布方收到数据之后,返回响应信息(其中包括对接收状态的标识),由返回信息判断是否成功接收数据,之后再返回响应信息至GET请求发起方,展示是否成功发送数据。

controller层发布接口,供页面发起GET请求用,返回值为String(也可为其他,视自身情况定)。

**IDEA、SpringBoot、MongoDB、RESTful**

@RestController//此注解包含了@ResponseBody和@Controller注解。
@RequestMapping(value = "/sendDataToURL")
public class TestController {

    @RequestMapping(value = "/test" , method = RequestMethod.GET)
    //使用@RequestParam注解获取GET请求发起方request中的信息。
    //如:http://localhost:8080/sendDataToURL/test?id=test
    public String testSendData(@RequestParam("id") String id){
        Boolean flag = 发送数据的方法,返回值可定义为boolean,可做响应信息的标识
        logger.info(flag ? "成功" : "失败";//打上日志,方便查看
        return flag ? "true" : "false";
    }
}

**在service层做对数据发送的处理,方法参照本文第1部分**

本文中还涉及到对JSON对象、JSON数组、Document对象、List集合等问题的处理,都属于基本操作,注意字段取值时的拼写问题即可,不做详述。

  • 3
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值