Java代码发送Http请求

Posted 十木禾

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java代码发送Http请求相关的知识,希望对你有一定的参考价值。

最近在项目中要使用Java代码来发送Http请求,在查找资料的过程中收获颇多,故记此文,以备后看。

这里我将报文头,报文体等信息都存储在Map里面传到方法里面来。


使用GET方式向URL发送请求

    /**
     * 获取接口返回的结果(GET).
     *
     * @param getUrl          请求接口的url
     * @param requestParam     请求接口的参数
     * @param requestHeader    请求接口的Header
     * @return 请求接口的返回值
     * @throws IOException the io exception
     */
    public static String getGetResponseMess(String getUrl, Map<Object, Object> requestParam,Map<Object, Object> requestHeader) throws IOException 

        String param = "";
        if (requestParam != null) 
            for (Map.Entry<Object, Object> entry : requestParam.entrySet()) 
                if ("".equals(param) || param == "") 
                    param = entry.getKey() + "=" +URLEncoder.encode(entry.getValue().toString(), "utf-8");
                 else 
                    param = param + "&" + entry.getKey() + "=" +URLEncoder.encode( entry.getValue().toString(), "utf-8");
                
            
        
        getUrl=getUrl+"?"+param;
        URL url = new URL(getUrl);
        // 将url 以 open方法返回的urlConnection  连接强转为HttpURLConnection连接  (标识一个url所引用的远程对象连接)
        HttpURLConnection connection = (HttpURLConnection) url.openConnection();// 此时cnnection只是为一个连接对象,待连接中
        if (requestHeader != null) 
            // 设置 Header 信息
            for (Map.Entry<Object, Object> entry : requestHeader.entrySet()) 
                connection.setRequestProperty(entry.getKey().toString(), entry.getValue().toString());
            
        
        connection.connect();//建立连接

        // 获取输入流
        BufferedReader br = new BufferedReader(new InputStreamReader(connection.getInputStream(), "UTF-8"));
        String line;
        StringBuilder sb = new StringBuilder();
        while ((line = br.readLine()) != null) // 循环读取流
            sb.append(line);
        
        br.close();// 关闭流
        connection.disconnect();// 断开连接
        return sb.toString();
    

使用POST方式向URL发送请求

    /**
     * 获取接口返回的结果(POST).
     *
     * @param postUrl          请求接口的url
     * @param requestParam     请求接口的参数
     * @param requestBodyParam 请求接口的Body
     * @param requestHeader    请求接口的Header
     * @return 请求接口的返回值
     * @throws IOException the io exception
     */
    public static String getResponseMess(String postUrl, Map<Object, Object> requestParam,Map<Object, Object> requestHeader) throws IOException 
        URL url = new URL(postUrl);
        // 将url 以 open方法返回的urlConnection  连接强转为HttpURLConnection连接  (标识一个url所引用的远程对象连接)
        HttpURLConnection connection = (HttpURLConnection) url.openConnection();// 此时cnnection只是为一个连接对象,待连接中
        // 设置连接输出流为true,默认false (post 请求是以流的方式隐式的传递参数)
        connection.setDoOutput(true);
        // 设置连接输入流为true
        connection.setDoInput(true);
        // 设置请求方式为post
        connection.setRequestMethod("POST");
        // post请求缓存设为false
        connection.setUseCaches(false);
        // 设置该HttpURLConnection实例是否自动执行重定向
        connection.setInstanceFollowRedirects(true);

        if (requestHeader != null) 
            // 设置 Header 信息
            for (Map.Entry<Object, Object> entry : requestHeader.entrySet()) 
                connection.setRequestProperty(entry.getKey().toString(), entry.getValue().toString());
            
        
        connection.connect();//建立连接

        DataOutputStream outputStream = new DataOutputStream(connection.getOutputStream());
        String param = "";
        if (requestParam != null) 
            for (Map.Entry<Object, Object> entry : requestParam.entrySet()) 
                if ("".equals(param) || param == "") 
                    param = entry.getKey() + "=" +URLEncoder.encode(entry.getValue().toString(), "utf-8");
                 else 
                    param = param + "&" + entry.getKey() + "=" +URLEncoder.encode( entry.getValue().toString(), "utf-8");
                
            
        
        outputStream.writeBytes(param);

        outputStream.flush();
        outputStream.close();

        // 连接发起请求,处理服务器响应  (从连接获取到输入流并包装为bufferedReader)
        BufferedReader bf = new BufferedReader(new InputStreamReader(connection.getInputStream(), "UTF-8"));
        String line;
        StringBuilder sb = new StringBuilder();
        // 循环读取流,若不到结尾处
        while ((line = bf.readLine()) != null) 
            sb.append(line).append(System.getProperty("line.separator"));
        
        bf.close();    // 关闭流
        connection.disconnect(); // 销毁连接

        return sb.toString();
    

考虑一种情况,如果相应的请求参数存放在 Raw 里面呢?
我们可以使用HttpClient这个包。
下载地址http://download.csdn.net/download/zjq_1314520/10026953

下载完成之后,我们在项目中导入相应的Jar包即可!

对应我封装的Java代码如下:

    /**
     * 获取接口返回的结果(Raw版本).
     *
     * @param postUrl          请求接口的url
     * @param requestBodyParam 请求Body里面Raw的值
     * @param requestHeader    请求头的值
     * @return 接口返回参数
     * @throws ClientProtocolException the client protocol exception
     * @throws IOException             the io exception
     */
    public static String getResponseMess(String postUrl, String requestBodyParam, Map<Object, Object> requestHeader) throws ClientProtocolException, IOException 
        HttpClient httpClient = new DefaultHttpClient();
        HttpPost post = new HttpPost(postUrl);
        StringEntity postingString = new StringEntity(requestBodyParam);// Raw等里面的数据
        post.setEntity(postingString);

        if (requestHeader != null) 
            for (Map.Entry<Object, Object> entry : requestHeader.entrySet()) 
                post.setHeader(entry.getKey().toString(), entry.getValue().toString());
            
        
        HttpResponse response = httpClient.execute(post);
        String responseMess = EntityUtils.toString(response.getEntity());
        return responseMess;
    

以上就是有关Java代码发送Http请求的相关内容了。
参考博客:
java中的post请求之raw请求–微信api调用java代码示例
java调用http接口

以上是关于Java代码发送Http请求的主要内容,如果未能解决你的问题,请参考以下文章

java中如何判断发送的请求是不是得到响应

JAVA代码发送HTTP请求问题(我想实现和服务器进行一次连接时发送两次请求)

Get和Post的请求

04 FastApi的请求体

通过java代码HttpRequestUtil(服务器端)发送HTTP请求并解析

用java做一个httpClient 发送https 的get请求,需要证书验证的那种,求大神指点一下!