首页 > 编程语言 >JAVA Response 返回值再拿

JAVA Response 返回值再拿

时间:2024-09-13 21:52:31浏览次数:9  
标签:HTTP JAVA String import public new 返回值 response Response

一:概述

在现代Web开发中,与外部服务交互是一个常见的需求。Java作为一门广泛使用的编程语言,提供了多种方法来发送HTTP请求并处理响应。本文将探讨在Java中获取HTTP响应的不同方法,并提供实际案例。

二:具体说明

<1>使用java.net.HttpURLConnection

HttpURLConnection是Java标准库中一个古老的类,用于处理HTTP请求和响应。它提供了一种简单的方式来发送请求和接收响应。

案例:获取天气信息 假设我们需要从一个天气API获取当前的天气情况。
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;

public class WeatherFetcher {
    public static void main(String[] args) {
        try {
            URL url = new URL("https://api.weatherapi.com/v1/current.json?key=YOUR_API_KEY&q=London");
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
            conn.setRequestMethod("GET");
            
            int responseCode = conn.getResponseCode();
            System.out.println("Response Code : " + responseCode);
            if (responseCode == HttpURLConnection.HTTP_OK) { // success
                BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream()));
                String inputLine;
                StringBuffer response = new StringBuffer();

                while ((inputLine = in.readLine()) != null) {
                    response.append(inputLine);
                }
                in.close();

                // 打印响应内容
                System.out.println(response.toString());
            } else {
                System.out.println("GET request not worked");
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

优点:无需额外的库。简单易用。

缺点 :代码较为冗长。不支持异步处理。

<2>使用Apache HttpClient

Apache HttpClient是一个强大的HTTP客户端库,支持同步和异步请求。

案例:下载文件 假设我们需要从一个服务器下载一个文件。
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 java.io.FileOutputStream;
import java.io.InputStream;

public class FileDownloader {
    public static void main(String[] args) {
        try (CloseableHttpClient httpClient = HttpClients.createDefault()) {
            HttpGet request = new HttpGet("https://example.com/file.zip");
            try (CloseableHttpResponse response = httpClient.execute(request)) {
                InputStream inputStream = response.getEntity().getContent();
                FileOutputStream outputStream = new FileOutputStream("file.zip");
                byte[] buffer = new byte[1024];
                int bytesRead;
                while ((bytesRead = inputStream.read(buffer)) != -1) {
                    outputStream.write(buffer, 0, bytesRead);
                }
                outputStream.close();
                System.out.println("File downloaded successfully.");
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

优点: - 支持异步处理。 - 功能丰富,支持高级特性如连接池、代理等。

缺点: - 需要额外的库依赖。

<3>使用OkHttp

OkHttp是一个高效的HTTP客户端,支持同步阻塞调用和异步调用。

案例:发送JSON数据 假设我们需要向一个API发送JSON数据并接收响应。
import okhttp3.MediaType;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;

public class JsonDataSender {
    public static void main(String[] args) {
        OkHttpClient client = new OkHttpClient();
        MediaType MEDIA_TYPE_JSON = MediaType.parse("application/json; charset=utf-8");
        RequestBody body = RequestBody.create("{\"name\":\"John Doe\",\"age\":30}", MEDIA_TYPE_JSON);
        Request request = new Request.Builder()
                .url("https://api.example.com/users")
                .post(body)
                .build();

        try (Response response = client.newCall(request).execute()) {
            System.out.println(response.body().string());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

优点: - 性能优秀,支持异步处理。

简洁的API设计。  缺点: - 需要额外的库依赖。

<4>使用Spring's RestTemplate

如果你在使用Spring框架,RestTemplate是一个非常方便的工具,用于同步客户端HTTP请求。

案例:调用REST API 假设我们需要调用一个REST API并获取数据。
import org.springframework.web.client.RestTemplate;

public class RestClient {
    public static void main(String[] args) {
        RestTemplate restTemplate = new RestTemplate();
        String url = "https://api.example.com/data";
        String result = restTemplate.getForObject(url, String.class); System.out.println(result); } }

优点:与Spring框架集成良好,使用方便。

提供了丰富的方法来处理HTTP请求和响应。

缺点:仅支持同步调用。

从Spring 5开始,官方推荐使用更现代的WebClient

<5>使用Spring WebFlux的 WebClient

WebClient是Spring 5引入的用于异步非阻塞HTTP客户端的工具,它是响应式编程模型的一部分。

案例:异步获取数据

假设我们需要异步地从一个REST API获取数据。

java import org.springframework.web.reactive.function.client.WebClient;
import reactor.core.publisher.Mono; 
public class AsyncDataFetcher { public static void main(String[] args){ 
WebClient webClient = WebClient.create("https://api.example.com"); 
Mono<String> 
response = webClient.get() .uri("/data") .retrieve() .bodyToMono(String.class); 
response.subscribe( data -> 
System.out.println("Received data: " + data), error -> 
System.err.println("Error: " + error) ); } }

优点:

  • 支持异步非阻塞调用。
  • 与Spring WebFlux集成,适合构建响应式应用程序。

缺点:

  • 需要理解响应式编程模型。
  • 可能与阻塞式代码集成时存在挑战。

<6>总结

Java中处理HTTP请求和响应有多种方法,每种方法都有其适用场景和优缺点。HttpURLConnection适合简单的需求且不需要额外依赖;Apache HttpClient和OkHttp提供了更丰富的功能和更好的性能,但需要额外的库支持;Spring的RestTemplateWebClient则为Spring应用程序提供了集成度更高的解决方案,尤其是WebClient,它支持现代的响应式编程模式。

标签:HTTP,JAVA,String,import,public,new,返回值,response,Response
From: https://blog.51cto.com/u_15912723/12008868

相关文章

  • Java学习全套视频教程网盘资源下载
    如大家所了解的,Java是一门面向对象编程语言,可以编写桌面应用程序、Web应用程序、分布式系统和嵌入式系统应用程序。Java之所以可以让计算机识别,是因为Java的编译器和Java虚拟机,它会将人按照一定规范写成的信息翻译成机器所能识别二进制的信息,这样就可以让我们很好的和计算机进......
  • Java Server Page动态包含与重定向
    一、动态包含需求:我希望能够在我的页面中包含一个音频分析:在页面被请求的时候动态地包含另一个JSP页面或者静态资源(如HTML页面、图片等)的内容。假设我已经有一个名为audio.jsp的页面。当服务器处理包含<jsp:includepage="audio.jsp"/>的JSP页面时,它会将audio.jsp页面的......
  • 为什么在EffectiveJava中建议用EnumSet替代位字段,以及使用EnumMap替换序数索引
    在EffectiveJava中的第36条中建议用EnumSet替代位字段,在第37条中建议用EnumMap替换序数索引,为什么?EnumSet在EffectiveJava中的第36条中建议用EnumSet替代位字段36、用EnumSet替代位字段如果枚举类型的元素主要在Set中使用,传统上使用int枚举模式,通过不同的......
  • Java方法:重载
    重载是在一个类中,有相同的函数名称,但是形参不同的函数。方法的重载的规则:方法名称必须相同。参数列表必须不同(个数不同、类型不同、参数排列顺序不同等)。方法的返回类型可以相同也可以不同。仅仅返回类型不同不足以成为方法的重载。实现理论:方法名称相同时,编译器会根......
  • 学习笔记 韩顺平 零基础30天学会Java(2024.9.13)
    P545TreeMap源码解读     TreeSet的k-v其中的v是一个静态的对象,但是TreeMap的v是可以变化的     TreeMap使用默认构造器取出的顺序和添加的顺序是不一样的,但是有构造器实现了Comparator接口的匿名内部类,可以按顺序排序P546Collections工具类1P547Collect......
  • 为什么在EffectiveJava中建议用EnumSet替代位字段,以及使用EnumMap替换序数索引
    在EffectiveJava中的第36条中建议用EnumSet替代位字段,在第37条中建议用EnumMap替换序数索引,为什么?EnumSet在EffectiveJava中的第36条中建议用EnumSet替代位字段36、用EnumSet替代位字段如果枚举类型的元素主要在Set中使用,传统上使用int枚举模式,通过不同的2的......
  • 计算机毕业设计-基于Java+SSM架构的演唱会购票系统项目开发实战(附源码+论文)
    大家好!我是职场程序猿,感谢您阅读本文,欢迎一键三连哦。......
  • 基于java+springboot+vue的网上宠物店系统
    ......
  • 基于java+ssm+vue的垃圾分类微信小程序
    项目介绍现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储,归纳,集中处理数据信息的管理方式。本垃圾分类小程序就是在这样的大环境下诞生,其可以帮助管理者在短时间内处理完毕庞大的数据信息,使用这种软件工具可以帮助管理人员提高事务处理......
  • 基于java+ssm+vue的医院挂号预约微信小程序
    项目介绍现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储,归纳,集中处理数据信息的管理方式。本微信小程序医院挂号预约系统就是在这样的大环境下诞生,其可以帮助管理者在短时间内处理完毕庞大的数据信息,使用这种软件工具可以帮助管理人员......