171JAVA8发送带有Body的HTTP GET请求

Posted zhangchao19890805

tags:

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

正常来讲,按照HTTP标准,GET请求事不能带有消息体BODY的。但是HTTP标准不是硬性规定,各个厂商可以根据自己的需求做成灵活的扩展。比如ES的搜索接口就要求客户端发送带有BODY的HTTP GET请求。

发送请求的代码分成两个类,接收返回数据的 StrResponse 和发起请求的工具栏 HttpUtils

StrResponse.java


import java.util.List;
import java.util.Map;

/**
 * 接收HTTP返回数据的对象
 * @author zhangchao
 */
public class StrResponse 
    private int code = 200;
    private Map<String, List<String>> headers = null;
    private String body = null;

    public Map<String, List<String>> getHeaders() 
        return headers;
    

    public String getBody() 
        return body;
    

    public void setHeaders(Map<String, List<String>> headers) 
        this.headers = headers;
    

    public void setBody(String body) 
        this.body = body;
    

    public int getCode() 
        return code;
    

    public void setCode(int code) 
        this.code = code;
    

    public String getHeaderStr (String key) 
        List<String> list = this.headers.get(key);
        StringBuilder sb = new StringBuilder();
        for (String str : list) 
            sb.append(str);
        
        return sb.toString();
    

    public String getAllHeaderStr() 
        if (null == headers || headers.isEmpty()) 
            return "";
        
        StringBuilder sb = new StringBuilder();
        for (String key : headers.keySet()) 
            List<String> list = headers.get(key);
            sb.append(key + ":\\n");
            for (String str : list) 
                sb.append("    " + str + "\\n");
            
        
        return sb.toString();
    

    @Override
    public String toString() 
        final StringBuffer sb = new StringBuffer("StrResponse");
        sb.append("code=").append(code);
        sb.append(", headers=").append(headers);
        sb.append(", body='").append(body).append('\\'');
        sb.append('');
        return sb.toString();
    


HttpUtils.java

import java.util.Map;
import java.util.List;
import java.io.*;
import java.net.*;

/**
 * 通用http发送方法
 *
 * @author zhangchao
 */
public class HttpUtils

	public static StrResponse requestByte_responseStr(final String url, final String method, 
			final byte[] requestBody,final Map<String, String> headerMap, String responseEncoding) 
        BufferedReader in = null;
        BufferedReader errorReader = null;
        HttpURLConnection connection = null;
        StrResponse strResponse = null;
        try 
            StringBuilder result = new StringBuilder();
            URL realUrl = new URL(url);
            // 打开和URL之间的连接
            connection = (HttpURLConnection) realUrl.openConnection();
            connection.setRequestMethod(method);
            // 请求内容的长度
            if (null != requestBody && requestBody.length > 0) 
                connection.setRequestProperty("Content-Length", String.valueOf(requestBody.length));
            
            // 自定义请求头
            if (null != headerMap && false == headerMap.isEmpty()) 
                Set<String> keySet = headerMap.keySet();
                for (String key : keySet) 
                    connection.setRequestProperty(key, headerMap.get(key));
                
            
            connection.setConnectTimeout(5000);
            connection.setReadTimeout(5000);
            // 把JSON作为字节流写入post请求的body中
            connection.setDoOutput(true);
            if (null != requestBody && requestBody.length > 0) 
                connection.getOutputStream().write(requestBody);
            
            // 定义 BufferedReader输入流来读取URL的响应
            in = new BufferedReader(new InputStreamReader(
                    connection.getInputStream(), responseEncoding));
            String line;
            while ((line = in.readLine()) != null) 
                result.append(line).append("\\n");
            
            strResponse = new StrResponse();
            strResponse.setCode(connection.getResponseCode());
            // 返回的header
            Map<String, List<String>> map = connection.getHeaderFields();
            strResponse.setHeaders(map);
            // 返回的body
            String responseBody = result.toString();
            strResponse.setBody(responseBody);
         catch (Exception e) 
            e.printStackTrace();
            try 
                if (null != connection) 
                    StringBuilder result = new StringBuilder();
                    // 定义 BufferedReader输入流来读取URL的响应
                    errorReader = new BufferedReader(new InputStreamReader(
                            connection.getErrorStream(), responseEncoding));
                    String line;
                    while ((line = errorReader.readLine()) != null) 
                        result.append(line).append("\\n");
                    
                    strResponse = new StrResponse();
                    strResponse.setCode(connection.getResponseCode());
                    // 返回的header
                    Map<String, List<String>> map = connection.getHeaderFields();
                    strResponse.setHeaders(map);
                    // 返回的body
                    String responseBody = result.toString();
                    strResponse.setBody(responseBody);
                
             catch (Exception e2) 
                e2.printStackTrace();
            
         finally 
            try 
                if (null != in) 
                    in.close();
                
                if (null != errorReader) 
                    errorReader.close();
                
             catch (IOException e) 
                e.printStackTrace();
            
        
        return strResponse;
    

    public static StrResponse requestStr_responseStr(final String url, final String method, final String requestBody,
                                               final Map<String, String> headerMap, final String encoding) 
        // 字符串转成字节流
        byte[] bodyBytes = null;
        try 
            if (requestBody != null) 
                bodyBytes = requestBody.getBytes(encoding);
            
         catch (UnsupportedEncodingException e) 
            throw new RuntimeException(e);
        
        return requestByte_responseStr(url, method, bodyBytes, headerMap, encoding);
    

使用方法

public class Main
	public static void main(String[] args) 
		String url = "http://192.168.19.11:9200/yourindex/_search";
        String requestBody = "" +
                "\\"query\\": " +
                "    \\"bool\\": " +
                "      \\"must\\": [" +
                "        " +
                "          \\"term\\": " +
                "            \\"areaName.keyword\\": \\"" + areaName + "\\"" +
                "          " +
                "        ," +
                "        " +
                "          \\"term\\": " +
                "            \\"date.keyword\\": \\"" + date+ "\\"" +
                "          " +
                "        ," +
                "        " +
                "          \\"term\\": \\"rytype.keyword\\": \\"root\\"" +
                "        " +
                "      ]" +
                "    " +
                "    " +
                "  " +
                "";
        Map<String, String> headerMap = new HashMap<>();
        headerMap.put("Content-Type", "application/json");
        headerMap.put("Referer", url);
        String encoding = "UTF-8";
        StrResponse strResponse = HttpUtils.requestStr_responseStr(url, "GET", requestBody, 
        		headerMap, encoding);
        String body = strResponse.getBody();
        logger.info(body);
	

以上是关于171JAVA8发送带有Body的HTTP GET请求的主要内容,如果未能解决你的问题,请参考以下文章

Zapier 应用程序:使用 GET 请求发送正文

Discord.js 和带有 GET 请求的 http 监听器

请简要描述客户端发送的http request header都包含哪些内容

带有分页、排序和过滤的 WebAPI Get 方法

HTTP请求主体

发送带有 http 标头的 curl 请求