6赞
851
当前位置:  开发笔记 > 编程语言 > 正文

我应该使用HttpURLConnection还是RestTemplate

如何解决《我应该使用HttpURLConnection还是RestTemplate》经验,为你挑选了1个好方法。

我应该HttpURLConnectionSpring项目中使用还是更好地使用RestTemplate?换句话说,什么时候使用每个更好?



1> caco3..:

HttpURLConnectionRestTemplate不同种类的野兽。它们在不同的抽象级别上运行。

RestTemplate有助于消费RESTAPI和HttpURLConnection使用HTTP协议的工作。

您在问什么是更好的使用。答案取决于您要实现的目标:

如果您需要使用RESTapi,请坚持使用RestTemplate

如果你需要工作,http协议,然后使用HttpURLConnectionOkHttpClient,Apache的HttpClient,或者如果您使用的是Java 11你可以试试它HttpClient

此外,该RestTemplate应用HttpUrlConnection/ OkHttpClient/ ...做其工作(见ClientHttpRequestFactorySimpleClientHttpRequestFactoryOkHttp3ClientHttpRequestFactory


为什么不应该使用HttpURLConnection

最好显示一些代码:

在下面的示例中,使用了JSONPlaceholder

我们来GET个帖子:

public static void main(String[] args) {
  URL url;
  try {
    url = new URL("https://jsonplaceholder.typicode.com/posts/1");
  } catch (MalformedURLException e) {
    // Deal with it.
    throw new RuntimeException(e);
  }
  HttpURLConnection cOnnection= null;
  try {
    cOnnection= (HttpURLConnection) url.openConnection();
    try (InputStream inputStream = connection.getInputStream();
         InputStreamReader isr = new InputStreamReader(inputStream);
         BufferedReader bufferedReader = new BufferedReader(isr)) {
      // Wrap, wrap, wrap

      StringBuilder respOnse= new StringBuilder();
      String line;
      while ((line = bufferedReader.readLine()) != null) {
        response.append(line);
      }
      // Here is the response body
      System.out.println(response.toString());
    }

  } catch (IOException e) {
    throw new RuntimeException(e);
  } finally {
    if (connection != null) {
      connection.disconnect();
    }
  }
}

现在让我们POST发布一些内容:

cOnnection= (HttpURLConnection) url.openConnection();
connection.setDoInput(true);
connection.setDoOutput(true);
connection.setRequestMethod("POST");
connection.setRequestProperty("Content-type", "application/json; charset=UTF-8");

try (OutputStream os = connection.getOutputStream();
     OutputStreamWriter osw = new OutputStreamWriter(os);
     BufferedWriter wr = new BufferedWriter(osw)) {
  wr.write("{\"title\":\"foo\", \"body\": \"bar\", \"userId\": 1}");
}

如果需要响应:

try (InputStream inputStream = connection.getInputStream();
     InputStreamReader isr = new InputStreamReader(inputStream);
     BufferedReader bufferedReader = new BufferedReader(isr)) {
  // Wrap, wrap, wrap

  StringBuilder respOnse= new StringBuilder();
  String line;
  while ((line = bufferedReader.readLine()) != null) {
    response.append(line);
  }

  System.out.println(response.toString());
}

如您所见,HttpURLConnectionis苦行僧提供了api 。

你总是要处理“低层次” InputStreamReaderOutputStreamWriter,幸好有替代品。


OkHttpClient

OkHttpClient减轻了疼痛:

GET张贴文章:

OkHttpClient okHttpClient = new OkHttpClient();
Request request = new Request.Builder()
    .url("https://jsonplaceholder.typicode.com/posts/1")
    .build();
Call call = okHttpClient.newCall(request);
try (Response respOnse= call.execute();
     ResponseBody body = response.body()) {

  String string = body.string();
  System.out.println(string);
} catch (IOException e) {
  throw new RuntimeException(e);
}

POST发帖:

Request request = new Request.Builder()
    .post(RequestBody.create(MediaType.parse("application/json; charset=UTF-8"),
        "{\"title\":\"foo\", \"body\": \"bar\", \"userId\": 1}"))
    .url("https://jsonplaceholder.typicode.com/posts")
    .build();

Call call = okHttpClient.newCall(request);

try (Response respOnse= call.execute();
     ResponseBody body = response.body()) {

  String string = body.string();
  System.out.println(string);
} catch (IOException e) {
  throw new RuntimeException(e);
}

容易得多,对吗?

Java 11的 HttpClient

GET张贴文章:

HttpClient httpClient = HttpClient.newHttpClient();

HttpResponse respOnse= httpClient.send(HttpRequest.newBuilder()
    .uri(URI.create("https://jsonplaceholder.typicode.com/posts/1"))
    .GET()
    .build(), HttpResponse.BodyHandlers.ofString());

System.out.println(response.body());

POST发帖:

HttpResponse respOnse= httpClient.send(HttpRequest.newBuilder()
    .header("Content-Type", "application/json; charset=UTF-8")
    .uri(URI.create("https://jsonplaceholder.typicode.com/posts"))
    .POST(HttpRequest.BodyPublishers.ofString("{\"title\":\"foo\", \"body\": \"barzz\", \"userId\": 2}"))
    .build(), HttpResponse.BodyHandlers.ofString());

RestTemplate

根据其javadoc:

同步客户端执行HTTP请求,在基础HTTP客户端库(如JDK {@code HttpURLConnection},Apache HttpComponents等)上公开简单的模板方法API。

让我们做同样的

首先,为方便起见,Post创建了类。(当RestTemplate读取响应时,它将转换为Post使用HttpMessageConverter

public static class Post {
  public long userId;
  public long id;
  public String title;
  public String body;

  @Override
  public String toString() {
    return new ReflectionToStringBuilder(this)
        .toString();
  }
}

GET婷一帖。

RestTemplate restTemplate = new RestTemplate();
ResponseEntity entity = restTemplate.getForEntity("https://jsonplaceholder.typicode.com/posts/1", Post.class);
Post post = entity.getBody();
System.out.println(post);

POST发帖:

public static class PostRequest {
  public String body;
  public String title;
  public long userId;
}

public static class CreatedPost {
  public String body;
  public String title;
  public long userId;
  public long id;

  @Override
  public String toString() {
    return new ReflectionToStringBuilder(this)
        .toString();
  }
}

public static void main(String[] args) {

  PostRequest postRequest = new PostRequest();
  postRequest.body = "bar";
  postRequest.title = "foo";
  postRequest.userId = 11;


  RestTemplate restTemplate = new RestTemplate();
  CreatedPost createdPost = restTemplate.postForObject("https://jsonplaceholder.typicode.com/posts/", postRequest, CreatedPost.class);
  System.out.println(createdPost);
}

因此,回答您的问题:

什么时候比较好使用?

需要使用RESTapi吗?使用RestTemplate

需要使用http吗?使用一些HttpClient


还值得一提:

Retrofit

简介 Feign

声明式REST客户端

推荐阅读
  • 如何解决《如何安装Goinalpinelinux》经验,为你挑选了3个好方法。 ... [详细]
  • 如何解决《使用ajax发出http请求以获取基本授权和cors》经验,有好办法吗? ... [详细]
  • 如何在ajax授权和cors的第二个响应中显示内容?
    如何解决《如何在ajax授权和cors的第二个响应中显示内容?》经验,应该怎么弄,您有好建议吗? ... [详细]
  • 如何解决《C中未初始化的局部变量中包含的值究竟是什么?》经验,为你挑选了1个好方法。 ... [详细]
  • 详解phpstudy linux web面板(小皮面板)V0.2版本正式发布
    小皮面板,是由phpStudy官方团队针对Linux服务器开发推出的一款服务器环境搭建以及管理工具。这篇文章主要介绍了phpstudylinuxweb面板(小皮面板)V0.2版本正式发布,需要的朋友可以参考下 ... [详细]
  • 有人最近要求我们写一个关于MooTools1.2的30天的教程,这似乎也是个很不错的主意,于是我们决定现在就开始。在这些教程中,我们假设用户没有任何MooTools或者是JavaScript经验,但是至少有基本的HTML和CSS知识。 ... [详细]
  • 这篇文章主要介绍了JSON与XML的区别对比及案例应用的讲解。本文涉及到XML和JSON优缺点讲解及对比,非常不错,具有一定的参考借鉴价值,感兴趣的朋友一起看看吧 ... [详细]
  • centos磁盘空间不足的解决办法:首先通过命令“du-sh*|sort-n”进入根目录,并对指定的文件夹查询容量;然后查询已删除的文件;最后使用命令“ps-ef|pid号”重启对应的服务即可。 ... [详细]
  • 这篇文章主要介绍了centos6.9安装mysql的详细教程,非常不错,具有参考借鉴价值,需要的朋友可以参考下 ... [详细]
  • 这篇文章主要介绍了使用python客户端访问impala的操作方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧 ... [详细]
  • 我们知道AJAX技术能够使得每一次请求更加迅捷,对于每一次请求返回的不是整个页面,也仅仅是所需要返回的数据。 ... [详细]
  • 这篇文章主要介绍了JSON是什么?有哪些优点?JSON和XML的区别?下面就来详细的介绍两种的区别,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 ... [详细]
  • 大数据平台使用搭建脚本一键安装OS
    本文给大家分享的是如何在大数据平台使用脚本来实现一键安装定制OS,并给大家附上了脚本源码,有需要的小伙伴可以参考下 ... [详细]
  • Spring Boot系列教程之7步集成RabbitMQ的方法
    RabbitMQ即一个消息队列,主要是用来实现应用程序的异步和解耦,同时也能起到消息缓冲,消息分发的作用。下面这篇文章主要给大家介绍了关于SpringBoot之7步集成RabbitMQ的相关资料,需要的朋友可以参考下 ... [详细]
  • 这篇文章主要介绍了Shell脚本实现自动安装zookeeper,本文直接给出实现代码,需要的朋友可以参考下 ... [详细]
devbox
淘宝店名维衣潮都_233
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved PHP1.CN 第一PHP社区 版权所有 京ICP备19059560号-4