• 技术文章 >Java >java教程

    JAVA发送HTTP请求的方式有哪些

    王林王林2023-04-15 09:04:05转载24

    1. HttpURLConnection

    使用JDK原生提供的net,无需其他jar包,代码如下:

    import com.alibaba.fastjson.JSON;
    import java.io.BufferedReader;
    import java.io.InputStream;
    import java.io.InputStreamReader;
    import java.io.OutputStream;
    import java.net.HttpURLConnection;
    import java.net.URL;
    import java.util.HashMap;
    import java.util.Map;
     
    public class HttpTest1 {
     
        public static void main(String[] args) {
            HttpURLConnection con = null;
     
            BufferedReader buffer = null;
            StringBuffer resultBuffer = null;
     
            try {
                URL url = new URL("http://10.30.10.151:8012/gateway.do");
                //得到连接对象
                con = (HttpURLConnection) url.openConnection();
                //设置请求类型
                con.setRequestMethod("POST");
                //设置Content-Type,此处根据实际情况确定
                con.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
                //允许写出
                con.setDoOutput(true);
                //允许读入
                con.setDoInput(true);
                //不使用缓存
                con.setUseCaches(false);
                OutputStream os = con.getOutputStream();
                Map paraMap = new HashMap();
                paraMap.put("type", "wx");
                paraMap.put("mchid", "10101");
                //组装入参
                os.write(("consumerAppId=test&serviceName=queryMerchantService&params=" + JSON.toJSONString(paraMap)).getBytes());
                //得到响应码
                int responseCode = con.getResponseCode();
                if (responseCode == HttpURLConnection.HTTP_OK) {
                    //得到响应流
                    InputStream inputStream = con.getInputStream();
                    //将响应流转换成字符串
                    resultBuffer = new StringBuffer();
                    String line;
                    buffer = new BufferedReader(new InputStreamReader(inputStream, "GBK"));
                    while ((line = buffer.readLine()) != null) {
                        resultBuffer.append(line);
                    }
                    System.out.println("result:" + resultBuffer.toString());
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

    2. HttpClient

    需要用到commons-httpclient-3.1.jar,maven依赖如下:

    <dependency>
        <groupId>commons-httpclient</groupId>
        <artifactId>commons-httpclient</artifactId>
        <version>3.1</version>
    </dependency>

    代码如下:

    import com.alibaba.fastjson.JSON;
    import org.apache.commons.httpclient.HttpClient;
    import org.apache.commons.httpclient.methods.PostMethod;
     
    import java.io.IOException;
    import java.util.HashMap;
    import java.util.Map;
     
    public class HttpTest2 {
     
        public static void main(String[] args) {
            HttpClient httpClient = new HttpClient();
            PostMethod postMethod = new PostMethod("http://10.30.10.151:8012/gateway.do");
     
            postMethod.addRequestHeader("accept", "*/*");
            //设置Content-Type,此处根据实际情况确定
            postMethod.addRequestHeader("Content-Type", "application/x-www-form-urlencoded");
            //必须设置下面这个Header
            //添加请求参数
            Map paraMap = new HashMap();
            paraMap.put("type", "wx");
            paraMap.put("mchid", "10101");
            postMethod.addParameter("consumerAppId", "test");
            postMethod.addParameter("serviceName", "queryMerchantService");
            postMethod.addParameter("params", JSON.toJSONString(paraMap));
            String result = "";
            try {
                int code = httpClient.executeMethod(postMethod);
                if (code == 200){
                    result = postMethod.getResponseBodyAsString();
                    System.out.println("result:" + result);
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    3. CloseableHttpClient

    需要用到httpclient-4.5.6.jar,maven依赖如下:

    <dependency>
        <groupId>org.apache.httpcomponents</groupId>
        <artifactId>httpclient</artifactId>
        <version>4.5.6</version>
    </dependency>

    代码如下:

    import com.alibaba.fastjson.JSON;
    import org.apache.http.Consts;
    import org.apache.http.HttpEntity;
    import org.apache.http.NameValuePair;
    import org.apache.http.client.config.RequestConfig;
    import org.apache.http.client.entity.UrlEncodedFormEntity;
    import org.apache.http.client.methods.CloseableHttpResponse;
    import org.apache.http.client.methods.HttpPost;
    import org.apache.http.impl.client.CloseableHttpClient;
    import org.apache.http.impl.client.HttpClients;
    import org.apache.http.message.BasicNameValuePair;
    import org.apache.http.util.EntityUtils;
     
    import java.io.IOException;
    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
     
    public class HttpTest3 {
     
        public static void main(String[] args) {
            int timeout = 120000;
            CloseableHttpClient httpClient = HttpClients.createDefault();
            RequestConfig defaultRequestConfig = RequestConfig.custom().setConnectTimeout(timeout)
                    .setConnectionRequestTimeout(timeout).setSocketTimeout(timeout).build();
            HttpPost httpPost = null;
            List<NameValuePair> nvps = null;
            CloseableHttpResponse responses = null;// 命名冲突,换一个名字,response
            HttpEntity resEntity = null;
            String result;
            try {
                httpPost = new HttpPost("http://10.30.10.151:8012/gateway.do");
                httpPost.setConfig(defaultRequestConfig);
     
                Map paraMap = new HashMap();
                paraMap.put("type", "wx");
                paraMap.put("mchid", "10101");
                nvps = new ArrayList<NameValuePair>();
                nvps.add(new BasicNameValuePair("consumerAppId", "test"));
                nvps.add(new BasicNameValuePair("serviceName", "queryMerchantService"));
                nvps.add(new BasicNameValuePair("params", JSON.toJSONString(paraMap)));
                httpPost.setEntity(new UrlEncodedFormEntity(nvps, Consts.UTF_8));
     
                responses = httpClient.execute(httpPost);
                resEntity = responses.getEntity();
                result = EntityUtils.toString(resEntity, Consts.UTF_8);
                EntityUtils.consume(resEntity);
                System.out.println("result:" + result);
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                try {
                    responses.close();
                    httpClient.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    4. okhttp

    需要用到okhttp-3.10.0.jar,maven依赖如下:

    <dependency>
    	<groupId>com.squareup.okhttp3</groupId>
    	<artifactId>okhttp</artifactId>
    	<version>3.10.0</version>
    </dependency>

    代码如下:

    import com.alibaba.fastjson.JSON;
    import okhttp3.*;
     
    import java.io.IOException;
    import java.util.HashMap;
    import java.util.Map;
     
    public class HttpTest4 {
     
        public static void main(String[] args) throws IOException {
            String url = "http://10.30.10.151:8012/gateway.do";
            OkHttpClient client = new OkHttpClient();
            Map paraMap = new HashMap();
            paraMap.put("yybh", "1231231");
     
            RequestBody requestBody = new MultipartBody.Builder()
                    .addFormDataPart("consumerAppId", "tst")
                    .addFormDataPart("serviceName", "queryCipher")
                    .addFormDataPart("params", JSON.toJSONString(paraMap))
                    .build();
     
            Request request = new Request.Builder()
                    .url(url)
                    .post(requestBody)
                    .addHeader("Content-Type", "application/x-www-form-urlencoded")
                    .build();
            Response response = client
                    .newCall(request)
                    .execute();
            if (response.isSuccessful()) {
                System.out.println("result:" + response.body().string());
            } else {
                throw new IOException("Unexpected code " + response);
            }
        }
    }

    5. Socket

    使用JDK原生提供的net,无需其他jar包

    代码如下:

    import com.alibaba.fastjson.JSON;
     
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.OutputStreamWriter;
    import java.net.Socket;
    import java.net.URLEncoder;
    import java.net.UnknownHostException;
    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.Map;
     
    public class HttpTest6 {
     
        private static String encoding = "utf-8";
     
        public static void main(String[] args) {
            try {
                Map paraMap = new HashMap();
                paraMap.put("yybh", "12312311");
                String data = URLEncoder.encode("consumerAppId", "utf-8") + "=" + URLEncoder.encode("test", "utf-8") + "&" +
                        URLEncoder.encode("serviceName", "utf-8") + "=" + URLEncoder.encode("queryCipher", "utf-8")
                        + "&" +
                        URLEncoder.encode("params", "utf-8") + "=" + URLEncoder.encode(JSON.toJSONString(paraMap), "utf-8");
                Socket s = new Socket("10.30.10.151", 8012);
                OutputStreamWriter osw = new OutputStreamWriter(s.getOutputStream());
                StringBuffer sb = new StringBuffer();
                sb.append("POST /gateway.do HTTP/1.1\r\n");
                sb.append("Host: 10.30.10.151:8012\r\n");
                sb.append("Content-Length: " + data.length() + "\r\n");
                sb.append("Content-Type: application/x-www-form-urlencoded\r\n");
                //注,这里很关键。这里一定要一个回车换行,表示消息头完,不然服务器会等待
                sb.append("\r\n");
                osw.write(sb.toString());
                osw.write(data);
                osw.write("\r\n");
                osw.flush();
     
                //--输出服务器传回的消息的头信息
                InputStream is = s.getInputStream();
                String line = null;
                int contentLength = 0;//服务器发送回来的消息长度
                // 读取所有服务器发送过来的请求参数头部信息
                do {
                    line = readLine(is, 0);
                    //如果有Content-Length消息头时取出
                    if (line.startsWith("Content-Length")) {
                        contentLength = Integer.parseInt(line.split(":")[1].trim());
                    }
                    //打印请求部信息
                    System.out.print(line);
                    //如果遇到了一个单独的回车换行,则表示请求头结束
                } while (!line.equals("\r\n"));
     
                //--输消息的体
                System.out.print(readLine(is, contentLength));
     
                //关闭流
                is.close();
     
            } catch (UnknownHostException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
     
        /*
         * 这里我们自己模拟读取一行,因为如果使用API中的BufferedReader时,它是读取到一个回车换行后
         * 才返回,否则如果没有读取,则一直阻塞,直接服务器超时自动关闭为止,如果此时还使用BufferedReader
         * 来读时,因为读到最后一行时,最后一行后不会有回车换行符,所以就会等待。如果使用服务器发送回来的
         * 消息头里的Content-Length来截取消息体,这样就不会阻塞
         *
         * contentLe 参数 如果为0时,表示读头,读时我们还是一行一行的返回;如果不为0,表示读消息体,
         * 时我们根据消息体的长度来读完消息体后,客户端自动关闭流,这样不用先到服务器超时来关闭。
         */
        private static String readLine(InputStream is, int contentLe) throws IOException {
            ArrayList lineByteList = new ArrayList();
            byte readByte;
            int total = 0;
            if (contentLe != 0) {
                do {
                    readByte = (byte) is.read();
                    lineByteList.add(Byte.valueOf(readByte));
                    total++;
                } while (total < contentLe);//消息体读还未读完
            } else {
                do {
                    readByte = (byte) is.read();
                    lineByteList.add(Byte.valueOf(readByte));
                } while (readByte != 10);
            }
     
            byte[] tmpByteArr = new byte[lineByteList.size()];
            for (int i = 0; i < lineByteList.size(); i++) {
                tmpByteArr[i] = ((Byte) lineByteList.get(i)).byteValue();
            }
            lineByteList.clear();
     
            return new String(tmpByteArr, encoding);
        }
    }

    6. RestTemplate

    RestTemplate 是由Spring提供的一个HTTP请求工具。比传统的Apache和HttpCLient便捷许多,能够大大提高客户端的编写效率。代码如下:

    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.http.client.ClientHttpRequestFactory;
    import org.springframework.http.client.SimpleClientHttpRequestFactory;
    import org.springframework.web.client.RestTemplate;
     
    @Configuration
    public class RestTemplateConfig {
     
        @Bean
        public RestTemplate restTemplate(ClientHttpRequestFactory factory){
            return new RestTemplate(factory);
        }
     
        @Bean
        public ClientHttpRequestFactory simpleClientHttpRequestFactory(){
            SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory();
            factory.setConnectTimeout(15000);
            factory.setReadTimeout(5000);
            return factory;
        }
    }
     
     
    @Autowired
    RestTemplate restTemplate;
     
    @Test
    public void postTest() throws Exception {
        MultiValueMap<String, String> requestEntity = new LinkedMultiValueMap<>();
        Map paraMap = new HashMap();
        paraMap.put("type", "wx");
        paraMap.put("mchid", "10101");
        requestEntity.add("consumerAppId", "test");
        requestEntity.add("serviceName", "queryMerchant");
        requestEntity.add("params", JSON.toJSONString(paraMap));
        RestTemplate restTemplate = new RestTemplate();
        System.out.println(restTemplate.postForObject("http://10.30.10.151:8012/gateway.do",         requestEntity, String.class));
    }

    以上就是JAVA发送HTTP请求的方式有哪些的详细内容,更多请关注php中文网其它相关文章!

    声明:本文转载于:亿速云,如有侵犯,请联系admin@php.cn删除
    专题推荐:Java Http
    上一篇:Java @PostMapping和@GetMapping方法如何使用 下一篇:自己动手写 PHP MVC 框架(40节精讲/巨细/新人进阶必看)

    相关文章推荐

    • Java怎么实现HttpServer模拟前端接口调用• java线程之Happens before规则是什么• Java8 Lamdba函数式推导的语法怎么表达• Java工厂模式实例代码分析• Java中ThreadLocal的用法和原理是什么
    1/1

    PHP中文网