WebSocket java客户端请求WSS

package com.cdr.wsc;

import java.net.URI;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;

import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSession;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;

import org.java_websocket.client.DefaultSSLWebSocketClientFactory;
import org.java_websocket.client.WebSocketClient;
import org.java_websocket.drafts.Draft;

abstract class SimpleWss extends WebSocketClient {

    public SimpleWss(URI serverURI) {
        super(serverURI);
        if(serverURI.toString().contains("wss://"))
            trustAllHosts(this);
    }

    public SimpleWss(URI serverURI,Draft draft) {
        super(serverURI,draft);
        if(serverURI.toString().contains("wss://"))
            trustAllHosts(this);
    }

    final static HostnameVerifier DO_NOT_VERIFY = new HostnameVerifier() {
        public boolean verify(String hostname, SSLSession session) {
            return true;
        }
    };


    static void trustAllHosts(SimpleWss appClient) {
        System.out.println("wss");
        TrustManager[] trustAllCerts = new TrustManager[]{new X509TrustManager() {
            public java.security.cert.X509Certificate[] getAcceptedIssuers() {
                return new java.security.cert.X509Certificate[]{};
            }

            @Override
            public void checkClientTrusted(X509Certificate[] arg0, String arg1) throws CertificateException {
                // TODO Auto-generated method stub

            }

            @Override
            public void checkServerTrusted(X509Certificate[] arg0, String arg1) throws CertificateException {
                // TODO Auto-generated method stub

            }
        }};

        try {
            SSLContext sc = SSLContext.getInstance("TLS");
            sc.init(null, trustAllCerts, new java.security.SecureRandom());
            appClient.setWebSocketFactory(new DefaultSSLWebSocketClientFactory(sc));
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

这里封装得到的SimpleWss和WebSocketClient的用法基本一致,如:

import java.net.URI;
import java.net.URISyntaxException;

import org.java_websocket.handshake.ServerHandshake;

public class EscTest {
    public static String initmsg = "{'cmd':'login','data':{'username':'xinji','password':'PASSWORD'}}"
            .replaceAll("'", "\"").replaceAll("PASSWORD", "1402");
    public static void main(String[] args) throws URISyntaxException {
        new SimpleWss(new URI("wss://tjpu.edu.org/websocket")) {

            @Override
            public void onClose(int arg0, String arg1, boolean arg2) {
                System.out.println("onClose");
            }

            @Override
            public void onError(Exception arg0) {
                System.out.println("onError");

            }

            @Override
            public void onMessage(String arg0) {
                System.out.println("onMessage");
                this.send(arg0);
            }

            @Override
            public void onOpen(ServerHandshake arg0) {
                System.out.println("onOpen");
                this.send(initmsg);
            }}.connect();
    }
}

 

<think>好的,我现在需要帮助用户解决如何用Java代码从HttpResponse对象中获取Response Body的问题。用户提供了一个具体的响应头和响应体的例子,我需要根据这些信息来指导用户。 首先,我需要确认用户使用的Java网络库是什么。常见的库有原生的HttpURLConnection、Apache HttpClient、或者Spring的RestTemplate等。不同的库有不同的处理方法。不过用户提到的是HttpResponse对象,这可能指的是Apache HttpClient的HttpResponse接口,或者也可能是其他类似名称的类,比如Java 11+的HttpClient的HttpResponse。需要进一步分析。 用户提供的响应头中有Transfer-Encoding: chunked,说明响应体是分块传输的,但大多数HTTP库会自动处理分块编码,将实体转换为连续的字节流,所以用户可能不需要手动处理分块。接下来,用户给出的响应体是JSON格式,Content-Type是application/json,并且经过gzip压缩(Content-Encoding: gzip)。因此,处理时可能需要解压缩。 假设用户使用的是Apache HttpClient,那么处理步骤大致如下: 1. 执行HTTP请求,获取HttpResponse对象。 2. 从HttpResponse中获取EntityUtils.toString(),处理可能的gzip压缩。 3. 或者,如果库自动处理了压缩,可以直接读取内容。 但用户提供的响应头中有Content-Encoding: gzip,所以需要确保在读取实体时正确处理gzip压缩。Apache HttpClient的EntityUtils.toString()方法会自动处理压缩吗?可能需要检查HttpClient的配置,是否启用了自动解压。例如,创建HttpClient时使用ContentEncodingAutoInterceptor,或者在请求中添加Accept-Encoding头,并配置客户端自动解码。 如果用户没有启用自动解压,则需要手动处理gzip流。例如,从响应实体中获取输入流,并用GZIPInputStream包装,再读取内容。 另外,用户提供的响应头中有一个Set-Cookie字段,但处理响应体可能不需要关心Cookie,除非后续请求需要,但当前问题只关注获取响应体。 现在,我需要给出具体的代码示例。假设用户使用Apache HttpClient 4.x版本: 步骤一:添加依赖,比如Maven的依赖。 步骤二:创建CloseableHttpClient实例,并执行请求。 步骤三:获取HttpResponse对象。 步骤四:从HttpResponse中获取HttpEntity。 步骤五:处理实体内容,注意编码和压缩。 可能的代码示例: CloseableHttpClient httpClient = HttpClients.createDefault(); HttpGet httpGet = new HttpGet("http://example.com/api"); CloseableHttpResponse response = httpClient.execute(httpGet); // 获取实体 HttpEntity entity = response.getEntity(); String responseBody = EntityUtils.toString(entity, "UTF-8"); // 如果自动处理了gzip,这里直接得到解压后的内容 EntityUtils.consume(entity); // 处理responseBody,解析JSON System.out.println(responseBody); 但需要确认是否自动处理Content-Encoding。如果服务器返回gzip压缩,并且客户端支持自动解压,则需要在创建HttpClient时配置。例如: httpClient = HttpClients.custom() .setContentDecoderRegistry( RegistryBuilder.<InputStreamFactory>create() .register("gzip", GZIPInputStreamFactory.getInstance()) .build()) .build(); 或者在请求时添加Accept-Encoding头,并让HttpClient自动处理解压。可能默认情况下,HttpClient会自动处理常见的编码方式,如gzip和deflate。 如果用户遇到乱码或无法解析的情况,可能需要手动处理GZIP输入流。例如: InputStream inputStream = entity.getContent(); if ("gzip".equalsIgnoreCase(entity.getContentEncoding().getValue())) { inputStream = new GZIPInputStream(inputStream); } BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream, StandardCharsets.UTF_8)); StringBuilder sb = new StringBuilder(); String line; while ((line = reader.readLine()) != null) { sb.append(line); } String responseBody = sb.toString(); 不过,EntityUtils.toString应该已经处理了这些,只要编码正确配置。 另一种情况,如果用户使用的是Java原生的HttpURLConnection,处理方式会不同。需要获取输入流,并检查是否需要解压: HttpURLConnection connection = (HttpURLConnection) url.openConnection(); // 设置请求头等 InputStream inputStream = connection.getInputStream(); if ("gzip".equals(connection.getContentEncoding())) { inputStream = new GZIPInputStream(inputStream); } BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream, StandardCharsets.UTF_8)); String line; StringBuilder responseBody = new StringBuilder(); while ((line = reader.readLine()) != null) { responseBody.append(line); } 然后解析JSON。 总结,关键点在于: 1. 确定使用的HTTP库。 2. 处理可能的gzip压缩,确保正确解压。 3. 将输入流转换为字符串,注意字符编码。 4. 解析JSON响应体。 需要提醒用户注意异常处理和资源关闭,比如在finally块中关闭流和响应对象,或使用try-with-resources语句。此外,如果使用EntityUtils.toString,记得调用consume来确保资源释放。 用户提供的示例响应体是JSON,可以使用诸如Jackson、Gson等库来解析成Java对象。例如,将responseBody转换为对应的POJO,包含code、data、error等字段。 最后,根据用户提供的响应头,可能需要注意的其他问题,比如连接保持(keep-alive),缓存控制等,但获取响应体可能不需要特别处理这些。</think>要使用Java代码从`HttpResponse`对象中获取响应体(Response Body),具体步骤如下: --- ### 一、确认使用的HTTP库 常见的Java HTTP库有 **Apache HttpClient**、**Java原生HttpURLConnection** 或 **Spring的RestTemplate**。以下是两种主流库的实现方法: --- ### 二、使用 Apache HttpClient(推荐) #### 1. 添加依赖(Maven) ```xml <dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpclient</artifactId> <version>4.5.13</version> </dependency> ``` #### 2. 发送请求并获取响应体 ```java import org.apache.http.HttpEntity; import org.apache.http.client.methods.CloseableHttpResponse; import org.apache.http.client.methods.HttpGet; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClients; import org.apache.http.util.EntityUtils; public class HttpClientExample { public static void main(String[] args) { try (CloseableHttpClient httpClient = HttpClients.createDefault()) { HttpGet httpGet = new HttpGet("http://your-api-url"); // 执行请求 try (CloseableHttpResponse response = httpClient.execute(httpGet)) { // 获取响应实体 HttpEntity entity = response.getEntity(); // 将实体转换为字符串(自动处理gzip压缩) String responseBody = EntityUtils.toString(entity, "UTF-8"); // 输出结果 System.out.println("Response Body: " + responseBody); // 确保资源释放 EntityUtils.consume(entity); } } catch (Exception e) { e.printStackTrace(); } } } ``` #### 关键点说明: - **自动解压**:Apache HttpClient默认支持`gzip`解压,无需手动处理。 - **字符编码**:使用`UTF-8`确保正确解析中文字符。 - **资源释放**:通过`EntityUtils.consume(entity)`释放底层资源。 --- ### 三、使用 Java原生 HttpURLConnection #### 1. 发送请求并处理响应体 ```java import java.io.BufferedReader; import java.io.InputStream; import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.URL; import java.util.zip.GZIPInputStream; public class HttpUrlConnectionExample { public static void main(String[] args) { try { URL url = new URL("http://your-api-url"); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); // 设置请求方法 connection.setRequestMethod("GET"); // 获取输入流 try (InputStream inputStream = connection.getInputStream()) { // 检查是否为gzip压缩 String contentEncoding = connection.getContentEncoding(); InputStream decodedStream = inputStream; if ("gzip".equalsIgnoreCase(contentEncoding)) { decodedStream = new GZIPInputStream(inputStream); } // 读取响应内容 BufferedReader reader = new BufferedReader( new InputStreamReader(decodedStream, "UTF-8")); StringBuilder responseBody = new StringBuilder(); String line; while ((line = reader.readLine()) != null) { responseBody.append(line); } // 输出结果 System.out.println("Response Body: " + responseBody); } } catch (Exception e) { e.printStackTrace(); } } } ``` #### 关键点说明: - **手动解压**:通过检查`Content-Encoding`头,手动处理`gzip`压缩。 - **字符编码**:使用`UTF-8`确保兼容性。 --- ### 四、解析JSON响应体 获取到响应体的字符串后,可以用JSON库(如Jackson、Gson)解析成对象: #### 示例(使用 Jackson): ```java import com.fasterxml.jackson.databind.ObjectMapper; public class JsonParseExample { public static void main(String[] args) { String responseBody = "{\"code\":1,\"data\":[...]}"; // 实际从HTTP响应获取 ObjectMapper mapper = new ObjectMapper(); try { ApiResponse apiResponse = mapper.readValue(responseBody, ApiResponse.class); System.out.println("Code: " + apiResponse.getCode()); } catch (Exception e) { e.printStackTrace(); } } } // 定义对应的Java类 class ApiResponse { private int code; private List<DataItem> data; private ErrorInfo error; // Getters and Setters } class DataItem { private String alarmSeq; private String neIp; // Getters and Setters } class ErrorInfo { private String type; // 其他字段... } ``` --- ### 五、注意事项 1. **异常处理**:务必添加`try-catch`块,处理网络请求和解析异常。 2. **资源释放**:确保关闭`HttpResponse`、`InputStream`等资源,推荐使用`try-with-resources`语法。 3. **编码与压缩**:如果服务器返回`gzip`压缩内容,需确认客户端是否支持自动解压。 通过以上步骤,即可从`HttpResponse`中提取并解析响应体数据。
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值