`
Iam品种
  • 浏览: 1380 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

关于使用HttpURLConnetion发送get请求

 
阅读更多

   前几天使用HttptUrlConnection调用SpringBoot框架下的接口时遇到了一点超出预期的东西。

   想必大家都知道,为了安全起见,都会在单点登录中使用tonken类似的验证,很不幸,我也遇到了,在使用post请求服务器时需要一个验证码,并且这个验证码是有服务器给Post请求的,无法使用手工拼接。然后我不得不使用get方法来调用接口。然后,并没有预想的顺利!

public class HttpClient {
    private static Logger logger = Logger.getLogger(HttpClient.class);
    /**
     * @param url=ip+?+para
     * @param method POST 或者GET
     * @param charset 编码格式
     * @return
     */
    public static String getHttpConnection(String url, String method, String charset) {
       
        String message = ""; // 返回信息
        OutputStream os = null; // 输出流
        StringBuffer sb = null; // 字符串缓冲流
        BufferedReader br = null; // 缓冲字符串输入流
        HttpURLConnection conn = null;
       
        try {
            // 创建HTTP的URL对象
            URL getURL = new URL(url);
            // 获取一个 HttpURLConnection 链接对象
            conn = (HttpURLConnection) getURL.openConnection();
            // 使用 java.net.URL 链接进行输出时,须将DoOutput标志设true
            conn.setDoOutput(true);
            // 设置通用的请求属性
            // conn.setRequestProperty("ContentType","text/xml;charset=UTF-8");
            // 用 get 方式传递数据
            conn.setRequestMethod(method);
            // 设置链接超时时间 5秒
            conn.setConnectTimeout(60 * 1000);
            // 设置读取超时时间 20秒
            conn.setReadTimeout(20 * 1000);
            // 取得输出流
            os = conn.getOutputStream();
            // 设置输出流格式 UTF-8
            os.write(message.getBytes(charset));
            // 接口调用后,获取返回的输入流,并把返回的流转换为字符串String
            br = new BufferedReader(new InputStreamReader( conn.getInputStream(), charset) );
            sb = new StringBuffer();
            while (br.ready()) {
                sb.append(br.readLine());
            }
            message = sb.toString();
            logger.info("HttpClient请求返回的字符串:" + message);
            System.out.println("HttpClient请求返回的字符串:" + message);
            return message;
        } catch (Exception e) {
            logger.error("连接HTTP出现异常,请排查! message:" + e.getMessage());
            e.printStackTrace();
            return message;
        } finally {
            try {
                if (os != null) {
                    os.flush();
                    os.close();
                }
                br.close();
                conn.disconnect();// 断开连接
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

    对于代码不多做解释。这个方法一开始是用于Post请求的,对于没有tonken验证的程序也可以正常调用接口,但是当我把method的值设为GET时,这个请求任然是一个Post请求。找了网上各种资历,找了大牛~~任然没找到病原所在!于是,自己开了断点,最后找到症结所在,竟然是它:os = conn.getOutputStream();

os.write(message.getBytes(charset));

  一开始也很纳闷,这是为什么。自己看了一下,这个输出流到底是干嘛用的:众所周知POST请求和GET请求的区别,这个输出流就是用来设置参数的!然而,get请求的参数都在地址后面,以?分隔,用&连接,只有post请求才有单独存放参数的空间。

  到此,问题很明显了,在设置这个输出流的时候你就已经告诉HttpURLConnection你要发送的是POST请求!所以,最终的结果就是你期待的GEt请求变为了POST请求!

  然后把输出流干掉,GET请求成功!

  

  最后说一个自己发现的小问题,就是这个GET请求,当你连续发送多次时会出现数据丢失的现象:目标接口返回的数据是{"status":"1","message":"请求成功"},但是HttpURLConnection.getInputStream(),的值却是""!我在一直寻找原因,但是到现在也没有发现!如果有朋友知道原因何在,希望能告知!

0
0
分享到:
评论

相关推荐

    使用java发送get和post请求实践

    在 Java 中发送 GET 和 POST 请求是非常常见的操作,今天我们将通过使用 Apache HttpClient 库来实现这些操作。 什么是 Apache HttpClient 库? Apache HttpClient 库是 Apache 软件基金会提供的一个开源库,用于...

    java HttpClient 发送GET请求和带有表单参数的POST请求教程例子

    - 在发送请求之前,确保网络连接正常。 - 使用`try-catch-finally`结构来捕获可能的异常,并确保在`finally`块中释放资源,避免内存泄漏。 - 在处理响应时,注意编码问题,例如上述代码中的“UTF-8”。 - 如果在生产...

    java 发送https get请求工具类

    java 发送https get请求工具类

    jsp+ajax发送GET请求的方法

    在发送请求之前,我们使用`open`方法初始化请求,并将请求方法设置为"GET"。 当XMLHttpRequest对象的请求状态发生变化时,会触发`onreadystatechange`事件,并执行回调函数`finish`。在此函数中,我们根据`...

    jsp+ajax发送GET请求的方法.docx

    在 JSP 文件中,我们可以使用 Servlet 来处理 Ajax 发送的 GET 请求。在本文中,我们使用 LoginServlet 来处理用户名的验证。 首先,我们需要在 web.xml 文件中配置 Servlet 的信息: ```xml <servlet-name>...

    feignclient发送get请求使用dto接收参数demo

    在这个“feignclient发送get请求使用dto接收参数demo”中,我们将探讨如何利用FeignClient来发送GET请求,并通过DTO(Data Transfer Object)来接收和处理参数。 1. **FeignClient介绍** Feign是一个Java到Java的...

    C#的http发送post和get请求源码

    在C#编程中,HTTP(超文本传输协议)是用于客户端和服务器之间通信的主要协议,主要涉及GET和POST...这个程序可能包含一个窗口,用户输入请求参数,点击按钮后,程序使用`HttpClient`发送请求,并将结果展示在界面上。

    HttpClient(用CloseableHttpClient发送get/post请求)

    HttpClient(用CloseableHttpClient发送get/post请求)

    后台模拟发送GET和POST请求

    5. 执行请求:使用HttpClient的`execute()`方法发送请求。 ```java CloseableHttpResponse response = httpClient.execute(req); ``` 6. 处理响应:获取并解析服务器返回的响应,例如,获取状态码、响应头和响应体...

    通过socket发送GET请求查询IP归属地,Json格式数据解析

    这个文件可能包含了设置socket连接、构建GET请求、发送请求、接收响应、解析Json数据等功能的实现。如果需要进一步了解或使用这个工具,需要查看文件内容并根据其结构进行编译和运行。 总的来说,通过socket发送GET...

    C# 使用Get和Post请求获取数据

    在C#中,你可以使用`HttpClient`类的`GetStringAsync`方法来发送GET请求,如下所示: ```csharp using System.Net.Http; using System.Threading.Tasks; public async Task<string> GetDataFromGet(string url) { ...

    Feign发送Get请求时,采用POJO对象传递参数的最终解决方案.docx

    在使用Feign客户端发送GET请求时,如果需要传递复杂的查询条件或分页参数,开发人员往往会倾向于使用Java POJO(Plain Old Java Object)对象作为方法参数。例如: ```java @FeignClient("microservice-provider-...

    HttpClient模拟get,post请求并发送请求参数(json等)

    接下来,我们讨论如何使用HttpClient进行GET请求。GET请求通常用于获取资源,不涉及请求体: ```java CloseableHttpClient httpClient = HttpClients.createDefault(); HttpGet httpGet = new HttpGet(...

    java使用url发送post和get请求:HttpConnUtils.jar

    - POST请求用于向服务器发送数据,通常用于表单提交、文件上传等场景。数据包含在请求体中。 - `HttpConnUtils.jar`的`sendPostRequest()`方法可能接收URL、请求参数和可能的请求头。它使用`setDoOutput(true)`...

    简单使用curl进行get请求并将服务器返回存进本地文件

    本文将详细介绍如何使用`curl`进行简单的GET请求,并将服务器的响应内容保存到本地文件。 首先,我们需要理解GET请求是HTTP协议中最基础的一种请求方法,它用于从服务器获取资源。在`curl`命令中执行GET请求非常...

    Qt工程中加入curl用于发送Post请求Get请求,数据为json格式

    qt工程中引入编译好的curl库,封装了一个类来执行post请求 可以直接拿来改造。 数据格式为json格式

    java发送http/https请求(get/post)代码

    本文将详细讲解如何使用Java发送GET和POST请求,以及涉及的HTTPS安全连接。 首先,理解HTTP和HTTPS的区别至关重要。HTTP(超文本传输协议)是一种用于分发超媒体信息的应用层协议,而HTTPS(超文本传输安全协议)是...

    c/c++ 发送HTTP POST/GET请求50行代码搞定

    50行代码http发送Post/Get请求,直接在linux gcc编译即可使用,或在win下任意c/c++编译器都可

    java实现get请求post请求,文件传输

    java实现get请求post请求,文件传输 /** * 发送https请求 * @param requestUrl 请求地址 * @param requestMethod 请求方式(GET、POST) * @param outputStr 提交的数据 * @return 返回微信服务器响应的信息 ...

Global site tag (gtag.js) - Google Analytics