精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

如此強大的REST Client API為什么都不用?

開發 前端
JAX-RS(Java API for RESTful Web Services)是一個用于構建和管理 RESTful Web 服務的標準規范。JAX-RS 提供了一系列強大的功能,使得開發者可以輕松地創建、消費和管理 RESTful 服務。

1. 簡介

本篇文章我們將介紹JAX-RS,使用Client API實現REST API接口的調用。

JAX-RS(Java API for RESTful Web Services)是一個用于構建和管理 RESTful Web 服務的標準規范。JAX-RS 提供了一系列強大的功能,使得開發者可以輕松地創建、消費和管理 RESTful 服務。

我們可以通過JAX-RS API編寫REST接口(Spring對應的Controller接口),也可以使用其提供的Client API實現 REST接口的調用。如下,我們實現REST API的定義:

import javax.ws.rs.*;
import javax.ws.rs.core.MediaType;
@Path("/users")
public class UserResource {
  @GET
  @Produces(MediaType.APPLICATION_JSON)
  public List<User> getUsers() {}
  @POST
  @Consumes(MediaType.APPLICATION_JSON)
  public void createUser(User user) {}
  @PUT
  @Path("/{id}")
  @Consumes(MediaType.APPLICATION_JSON)
  public void updateUser(@PathParam("id") int id, User user) {}
  @DELETE
  @Path("/{id}")
  public void deleteUser(@PathParam("id") int id) {}
}

與Spring MVC的Controller接口相比,除了注解不一樣也沒有什么區別了,但是這里的JAX-RS是 Jakarta EE 的一部分是標準。

本篇文章的重點是通過JAX-RS的Client API實現遠程接口的調用,所以上面對服務接口的實現有興趣的可以查看《jaxrs-2_1-final-spec.pdf》規范文檔。

既然有了這么多的方式調用,為什么還要使用JAX-RS呢?我們這里就與Spring的RestTemplate,WebClient進行對比。

  • 標準化和兼容性JAX-RS:作為 Jakarta EE 的標準規范,JAX-RS 具有廣泛的兼容性和標準化支持。這意味著無論你使用哪種 JAX-RS 實現(如 Jersey、RESTEasy),都具有一致的行為。RestTemplate:Spring 框架的一部分,主要用于 Spring 生態系統中的應用。雖然功能強大,但其使用限于 Spring 應用。WebClient:也是 Spring 框架的一部分,主要用于響應式編程。同樣,其使用限于 Spring 應用。
  • 易用性和靈活性JAX-RS:提供了一套簡潔且靈活的接口,使得開發者可以輕松構建復雜的 HTTP 請求。支持多種請求方法和響應處理方式,且與 JAX-RS 提供者無縫集成。RestTemplate:提供了豐富的模板方法,使得發送 HTTP 請求變得簡單。WebClient:支持響應式編程模型,提供了流式 API,使得異步和非阻塞操作更加自然和高效。但學習曲線較陡峭
  • 異步支持JAX-RS:支持異步請求,對于耗時的任務,提高應用性能和響應性。RestTemplate:主要支持同步操作,雖然可以通過 AsyncRestTemplate 實現異步請求,但已經不推薦使用,過時了。WebClient:天然支持異步和響應式編程,非常適合處理高并發和延遲敏感的應用。 

接下來,我們將詳細介紹JAX-RS 使用Client API實現三方接口的調用。

2. 實戰案例

2.1 準備三方接口

@GetMapping("/{id}")
public User queryUser(@PathVariable Long id) {
  return new User(id, "姓名 - " + new Random().nextInt(100000)) ;
}


@GetMapping("/header")
public String header(@RequestHeader("x-token") String token) {
  return token ;
}


@GetMapping("/exception")
public User exception(Long id, String name) {
  System.out.println(1 / 0) ;
  return new User(id, name) ;
}


@GetMapping("")
public List<User> queryUsers() throws Exception {
  TimeUnit.SECONDS.sleep(2);
  return List.of(
      new User(1L, "姓名 - " + new Random().nextInt(100000)),
      new User(2L, "姓名 - " + new Random().nextInt(100000)),
      new User(3L, "姓名 - " + new Random().nextInt(100000))) ;
}

上面定義了4個接口,接下來,我們將圍繞這4個接口講解JAX-RS Client API的各種使用方法。

2.2 基本使用

Response response = ClientBuilder.newClient()
      .target("http://localhost:9100/users/666")
      .request()
      .get() ;
String ret = response.readEntity(String.class) ;
System.out.println(ret) ;

輸出結果

{"id":666,"name":"姓名 - 57414"}

是不是非常的簡單?

2.3 注冊Provider(類型轉換器)

在上面的示例中,我們以String字符串的形式獲取到數據,那能不能以對象如User來獲取結果呢?當然可以,如下示例:

public class JSONToObjectReader implements MessageBodyReader<Object> {


  @Override
  public boolean isReadable(Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType) {
    return !type.isPrimitive() ;
  }


  @Override
  public Object readFrom(Class<Object> type, Type genericType, Annotation[] annotations, MediaType mediaType,
      MultivaluedMap<String, String> httpHeaders, InputStream entityStream)
      throws IOException, WebApplicationException {
    return new ObjectMapper().readValue(entityStream, type) ;
  }
}

這里,我們自定義了 MessageBodyReader 這樣我們就可以實現自己的邏輯如何進行數據的轉換了,我們這里直接將 Stream 通過Jackson轉換為對象。接下來就是將上面的轉換器進行注冊

Response response = ClientBuilder.newClient()
    // 注冊轉換器
    .register(JSONToObjectReader.class)
    // ...
User ret = response.readEntity(User.class) ;
System.out.println(ret) ;

其實上面的注冊我們還可以全局注冊,如下方式:

ClientBuilder builder = ClientBuilder.newBuilder() ;
builder.register(JSONToObjectReader.class);
Client client = builder.client() ;
// ...

這樣所有三方接口調用都通過該Client即可。

2.4 注冊Filter組件

如果你想在請求發送前進行修改請求數據,或者返回結果后進行相應的處理,那么你可以自定義ClientRequestFilter,ClientResponseFilter。

public class LoggingFilter implements ClientRequestFilter, ClientResponseFilter {


  private final Logger logger = LoggerFactory.getLogger(getClass()) ;
  
  @Override
  public void filter(ClientRequestContext requestContext, ClientResponseContext responseContext) throws IOException {
    logger.info("已經得到響應結果, 響應header: {}", responseContext.getHeaders()) ;
  }


  @Override
  public void filter(ClientRequestContext requestContext) throws IOException {
    logger.info("準備發送請求, 請求Headers: {}", requestContext.getHeaders()) ;
    // 我們可以在這里進行修改請求的數據(你還可以修改請求的uri等)
    requestContext.getHeaders().replace("x-token", List.of("88888888888")) ;
  }
}

接下來,就是注冊該過濾器,與上面注冊轉換器是一樣的。

Response response = client
  .target("http://localhost:9100/users/header")
  .register(LoggingFilter.class)
  // ...

控制臺輸出

圖片圖片

2.5 定義組件順序

如上的示例,如果我們還有一個AuthFilter,希望AuthFilter先執行,那么我們就可以通過 @Provider 注解控制他們的執行順序。

@Priority(-1)
public class AuthFilter implements 
    ClientRequestFilter, ClientResponseFilter {}
    
@Priority(0)
public class LoggingFilter implements 
  ClientRequestFilter, ClientResponseFilter {}

運行結果

圖片圖片

2.6 異步調用

要使用異步調用,我們可以使用默認的線程池,也可以自定義線程池,如下自定義線程池。

int core = Runtime.getRuntime().availableProcessors() ;
ExecutorService executorService = new ThreadPoolExecutor(core, core, 60, TimeUnit.SECONDS, new ArrayBlockingQueue<>(100)) ;
// 配置異步線程池
ClientBuilder builder = ClientBuilder.newBuilder().executorService(executorService) ;
Client client = builder.build().register(JSONToObjectReader.class) ;


Future<User> future = client
  .target("http://localhost:9100/users/666")
  .request(MediaType.APPLICATION_JSON)
  // 設置異步調用
  .async()
  .get(new InvocationCallback<User>() {
    @Override
    public void completed(User response) {
      System.out.printf("%s - 請求完成: %s%n", Thread.currentThread().getName(), response) ;
    }
    @Override
    public void failed(Throwable throwable) {
      System.err.printf("請求失敗: %s%n", throwable.getMessage()) ;
    }
  }) ;
User ret = future.get() ;
System.out.printf("返回結果: %s%n", ret) ;

運行結果

pool-1-thread-1 - 請求完成: User [id=666, name=姓名 - 34158]
返回結果: User [id=666, name=姓名 - 34158]

大多數情況你可以直接在回調的completed方法中執行其它邏輯。

2.7 反應式支持

在上面的異步請求中,我們通過回調的機制來獲取結果。回調適用于簡單的場景,但在多個事件同時存在時,源代碼會變得更難理解。例如,當異步調用需要組合、合并或以任何方式操作時,這些場景可能導致回調嵌套在其他回調中,從而使代碼的可讀性大大降低——這種情況通常被稱為“回調地獄”,因為調用的嵌套性質。

為了提高可讀性并使程序員能夠更好地理解異步計算,Java 8 引入了一個新的接口 CompletionStage,該接口包含大量專門用于管理異步計算的方法。

JAX-RS 2.1 定義了一種新的調用者類型 RxInvoker,以及基于 Java 8 的 CompletionStage 類型的默認實現 CompletionStageRxInvoker。

CompletionStage<User> stage = ClientBuilder.newClient()
    .target("http://localhost:9100/users/666")
    .register(JSONToObjectReader.class)
    .request(MediaType.APPLICATION_JSON)
    .rx()
    .get(User.class) ;
stage.whenComplete((res, ex) -> {
  if (ex != null) {
    System.err.printf("發生錯誤: %s%n", ex.getMessage()) ;
  } else {
    System.out.println(res) ;
  }
}) ;

這里我們可以利用CompletionState完成更多復雜的操作。有關CompletionState更多的用法,查看下面這篇文章:

強大的異步任務處理類CompletableFuture使用詳解

2.8 更多的配置

如果你需要進行更多的精細配置,如:超時時間,我們可以通過如下的方式進行配置:

ClientBuilder builder = ClientBuilder.newBuilder() ;
builder.connectTimeout(1000, TimeUnit.MILLISECONDS) ;
builder.readTimeout(1000, TimeUnit.MILLISECONDS) ;
builder.register(JSONToObjectReader.class) ;
Client client = builder.build() ;
client.target("http://localhost:9100/users")
  .register(JSONToObjectReader.class)
  .request(MediaType.APPLICATION_JSON)
  .buildGet()
  .submit(new InvocationCallback<List<User>>() {
    @Override
    public void completed(List<User> response) {
      System.out.printf("返回結果: %s%n", response) ;
    }
    @Override
    public void failed(Throwable throwable) {
      System.err.printf("發生錯誤: %s%n", throwable.getMessage()) ;
    }
  }) ;

運行結果

發生錯誤: java.net.SocketTimeoutException: Read timed out

異常處理也是非常的便捷。

責任編輯:武曉燕 來源: Spring全家桶實戰案例源碼
相關推薦

2020-05-29 17:21:33

神經網絡學習函數

2010-03-10 18:42:30

Python性能

2025-03-25 07:10:00

開發前端JavaScript

2025-04-08 07:30:00

前端開發JavaScript

2025-02-12 12:00:00

前端try-catchJavaScrip

2012-04-09 13:35:10

Instagram

2023-12-06 07:13:16

RESTAPI客戶端

2021-09-06 08:59:00

程序員技能開發

2019-02-26 10:57:54

消息簽名算法

2019-01-15 17:50:18

存儲技術容器

2020-09-25 08:10:55

Rust系統編程

2021-11-18 11:23:09

微信WhatsAppAPP

2023-06-06 09:03:06

InnodbMySQL

2020-06-02 19:14:59

Kubernetes容器開發

2022-06-01 23:27:38

區塊鏈加密貨幣數字資產

2020-11-05 10:50:09

物聯網數據技術

2017-07-26 10:21:46

DockerLinux容器

2014-12-19 09:59:50

代碼

2022-11-28 09:00:03

編程bug開發

2020-09-22 15:29:03

UnixC++C
點贊
收藏

51CTO技術棧公眾號

黄色一级免费大片| 九九九九久久久久| 久久免费公开视频| 米奇精品关键词| 日韩欧美一区二区三区久久| 亚洲激情啪啪| 欧美熟妇交换久久久久久分类| 性欧美xxxx大乳国产app| 色偷偷91综合久久噜噜| 无码国产69精品久久久久网站| a一区二区三区| 最近日韩中文字幕| 国产精品区一区| 中文字幕在线观看高清| 狠狠色狠狠色综合日日tαg| 亚洲视屏在线播放| 国产精品二区视频| 精品国模一区二区三区| 亚洲国产日韩a在线播放性色| 日本精品二区| 人妻视频一区二区三区| 久久99精品国产| 欧美一区二区三区精品电影| a级片在线观看免费| 中文字幕中文字幕精品| 精品乱人伦一区二区三区| 黑人粗进入欧美aaaaa| 乱插在线www| 中文字幕中文字幕中文字幕亚洲无线| 黄色小网站91| 亚洲国产剧情在线观看| 久久国内精品视频| 日产日韩在线亚洲欧美| 国产精品二区一区二区aⅴ| 91精品国产乱码久久久久久| 国产一区二区三区18| 中国一级特黄录像播放| 久久久久久亚洲精品美女| 欧美日韩一本到| 国产xxxxx在线观看| av电影在线地址| 一区二区三区91| 一区二区三区精品国产| av大片在线播放| 久久久久久一二三区| 国产一区二区中文字幕免费看| 国产三级午夜理伦三级| 久久福利视频一区二区| 国产精品久久久久久超碰 | 色愁久久久久久| 日韩视频在线永久播放| 天天久久综合网| 亚洲精品成人一区| 欧美日韩国产色站一区二区三区| 亚洲人辣妹窥探嘘嘘| 亚洲最大网站| 色狠狠色噜噜噜综合网| 日本熟妇人妻xxxxx| 亚洲精品成人图区| 色综合久久综合网| 国产极品美女高潮无套久久久| 厕沟全景美女厕沟精品| 日韩欧美一区二区在线| 久久久国产欧美| 成人在线视频观看| 欧美猛男超大videosgay| 污污的网站免费| 久久久久毛片免费观看| 精品对白一区国产伦| 国产精品入口麻豆| 先锋影音国产精品| 亚洲最新av在线网站| 在线观看免费小视频| 99精品视频在线观看免费播放| 日韩中文字幕在线视频| 国产精品丝袜一区二区| 亚洲一级特黄| 日韩av色综合| 91免费视频播放| 国产激情一区二区三区四区 | 免费精品国产| 在线看片第一页欧美| 顶级黑人搡bbw搡bbbb搡| 欧美a级一区| 久久久久久综合网天天| 欧美日韩一二三四区| 美国一区二区三区在线播放| 成人在线中文字幕| 男人天堂网在线视频| 91视频一区二区三区| 亚洲精品中字| 精品极品在线| 欧美日韩国产精品自在自线| 欧美日韩一区二区区| 无码少妇一区二区三区| 日韩专区在线观看| 日本在线观看视频网站| 日本人妖一区二区| 国产精品免费区二区三区观看| 黄色毛片在线观看| 夜夜夜精品看看| 少妇性l交大片| 亚洲日本va午夜在线电影| 亚洲男人天堂2024| 福利所第一导航| 免费观看日韩电影| 精品国产一区二区三区久久久久久| www亚洲人| 亚洲图片有声小说| mm131国产精品| 婷婷五月色综合香五月| 九九久久久久久久久激情| 久久国产精品免费看| 国产一区二区在线观看视频| 日韩av不卡在线播放| 欧美日韩欧美| 日本道色综合久久| 国产一线在线观看| 亚洲精品电影| 国产精品激情自拍| 头脑特工队2在线播放| 亚洲精品第1页| 日本三级黄色网址| 校花撩起jk露出白色内裤国产精品| 精品国产一区二区三区久久狼黑人| 久久国产视频播放| 成人成人成人在线视频| 三级网在线观看| 六九午夜精品视频| 国产一区二区久久精品| 久久夜色精品国产噜噜亚洲av| 国产麻豆精品在线| 在线看无码的免费网站| 精品欧美一区二区三区在线观看| 日韩国产精品视频| 久久久久久激情| 国产一区二区伦理片| 五月天亚洲综合情| 色豆豆成人网| 亚洲日本成人网| 丰满少妇xoxoxo视频| 91免费在线看| 内射国产内射夫妻免费频道| jizz性欧美2| 久久久久久久久久婷婷| 亚洲AV无码国产精品午夜字幕| 亚洲欧美另类久久久精品| www.五月天色| 欧美一区二区三区久久精品茉莉花 | 蜜桃视频动漫在线播放| 亚洲国产精品大全| 日本在线小视频| 99久久精品免费看| 国产91美女视频| 天堂在线精品| 国产精品电影在线观看| 成年人在线视频免费观看| 欧美在线观看视频一区二区三区| 91资源在线播放| 日本不卡高清视频| 中文字幕久精品免| 粉嫩av国产一区二区三区| 美女精品视频一区| 亚洲爆乳无码一区二区三区| 亚洲成年人影院| 制服丝袜第二页| 青草国产精品久久久久久| 一本色道久久综合亚洲二区三区| 亚洲黑人在线| 久久久久国产精品www| 日本韩国免费观看| 日本高清不卡在线观看| 美女av免费看| 国产传媒久久文化传媒| 国产中文字幕二区| 国产精品美女久久久久久不卡| 国产精品色午夜在线观看| a天堂中文在线官网在线| 欧美sm美女调教| 日韩中文字幕在线观看视频| 中文字幕一区二区三区不卡在线 | 国产精品nxnn| 国产成人精品视频| 成a人片在线观看| 亚洲精品国产拍免费91在线| 姑娘第5集在线观看免费好剧| 亚洲视频狠狠干| 亚洲一区二区三区无码久久| 蜜臀av一区二区在线免费观看| 国产精品视频网站在线观看| 免费国产自久久久久三四区久久| 91精品视频在线免费观看| av今日在线| xxxxxxxxx欧美| 无码精品人妻一区二区三区影院| 欧美性受极品xxxx喷水| 久久网免费视频| 国产精品午夜在线| 黄色性视频网站| 精品无人码麻豆乱码1区2区| 久久黄色片视频| 亚洲国产精品91| 日本一区二区三区在线视频| 亚洲一区二区三区日本久久九| 国产大片精品免费永久看nba| 岛国中文字幕在线| 亚洲精品在线91| 国产福利免费视频| 91久久奴性调教| 天天操天天射天天爽| 国产精品久久三区| a级在线观看视频| 国产一区在线观看视频| 午夜免费一区二区| 国产精品嫩草99av在线| 300部国产真实乱| 日韩dvd碟片| 欧美日韩精品久久| 国产乱人伦精品一区| 91久久精品日日躁夜夜躁国产| 性欧美18一19sex性欧美| 欧美精品www| 综合久久2o19| 久久久精品在线观看| 国产小视频免费在线网址| 精品国产乱码久久久久久蜜臀| 国产精品久久久久毛片| 欧日韩精品视频| 一级成人黄色片| 狠狠久久亚洲欧美专区| 精品视频在线观看免费| 亚洲人成精品久久久久久| 成人小视频免费看| 国产亚洲成av人在线观看导航| 人妻无码中文久久久久专区| 成人在线一区二区三区| 麻豆av免费看| 国产aⅴ综合色| 久久久久亚洲av无码麻豆| 久久国产精品露脸对白| 狠狠干狠狠操视频| 精品一二三四在线| 一级做a免费视频| 狠狠色狠狠色综合| 日日夜夜精品视频免费观看| 国产综合久久久久久鬼色| 日韩成人av免费| 国产一区二区三区四| 日本高清免费在线视频| 国产酒店精品激情| 国产精品二区视频| 国产.精品.日韩.另类.中文.在线.播放| gogo亚洲国模私拍人体| 国产成a人亚洲| 中文字幕在线视频播放| 91美女片黄在线| 国产小视频自拍| 国产精品天干天干在观线| 91香蕉视频污在线观看| 亚洲视频一区二区免费在线观看| 欧美日韩一级大片| 亚洲午夜久久久久中文字幕久| 日本视频免费在线| 欧美特黄级在线| 中文字幕天堂在线| 欧美日韩国产在线观看| 国产美女永久免费| 精品国产乱码91久久久久久网站| 五月激情婷婷综合| 亚洲女人被黑人巨大进入al| av一本在线| 欧美大尺度在线观看| 久草在线视频网站| 全球成人中文在线| 激情久久一区二区| 亚洲综合日韩在线| 欧美在线导航| 亚洲欧美丝袜| 亚洲高清二区| 久久久精品麻豆| 粉嫩一区二区三区性色av| 黄瓜视频污在线观看| 国产精品美女www爽爽爽| 久久久国产精品黄毛片| 色综合一个色综合亚洲| 91免费视频播放| 精品一区二区三区三区| 欧洲日本在线| 91精品国产91久久久久| 日韩成人综合网站| 精品国产一区二区三区麻豆小说 | 97精品国产91久久久久久| 美女日韩欧美| 97久久精品午夜一区二区| 五月天亚洲色图| 欧美日韩dvd| 天堂va蜜桃一区二区三区| 免费黄视频在线观看| 久久蜜桃一区二区| 久久久久久久久97| 在线观看一区日韩| 人妻少妇精品无码专区久久| 久久精品青青大伊人av| 亚洲美女久久精品| 91入口在线观看| 成人国产精品一级毛片视频| 欧美图片激情小说| 免费视频最近日韩| 菠萝菠萝蜜网站| 亚洲精品成人少妇| 亚洲性猛交富婆| 亚洲精品大尺度| 97超碰资源站在线观看| 国产精品欧美日韩久久| 亚洲婷婷丁香| 成人免费毛片在线观看| 精品一区二区三区av| 小早川怜子久久精品中文字幕| 亚洲成人你懂的| 精品国产无码一区二区| 日韩中文字幕免费看| 美女18一级毛片一品久道久久综合| 国产免费一区二区三区| 欧美黄色精品| 香蕉视频色在线观看| 国产精品理论片| 亚洲 小说区 图片区| 亚洲女人被黑人巨大进入al| 日本免费一区二区六区| 国产伦理一区二区三区| 好吊一区二区三区| 国产成人强伦免费视频网站| 亚洲视频一区二区在线观看| 一区二区三区午夜| 中文字幕九色91在线| 欧美韩国亚洲| 青青草原亚洲| 日韩中文欧美在线| 午夜理伦三级做爰电影| 狠狠久久五月精品中文字幕| 五月婷婷六月色| 欧美中在线观看| 伊人久久大香线蕉| 久热免费在线观看| 国产亚洲综合色| 亚洲精品国产无码| 国产一区二区动漫| 久久不卡日韩美女| 日韩高清在线播放| 男人的天堂久久精品| 国产又黄又粗又猛又爽的| 欧美三级日韩三级| 免费黄色在线网站| 亚洲精品欧美极品| 欧美影院一区| 国产a√精品区二区三区四区| 亚洲国产一区视频| 天天色棕合合合合合合合| 97超碰蝌蚪网人人做人人爽| 免费久久久久久久久| 美女少妇一区二区| 中文字幕一区二区三区在线不卡| 99国产揄拍国产精品| 色综合久久悠悠| 日韩精品导航| 少妇黄色一级片| 亚洲欧美日韩综合aⅴ视频| www.麻豆av| 欧美与欧洲交xxxx免费观看| 国产探花一区| www.com污| 亚洲国产wwwccc36天堂| 欧洲亚洲在线| 国产欧美日韩中文字幕在线| 欧美日韩亚洲一区| 国产精品第七页| 欧美日韩在线播放| 深夜国产在线播放| 久久久久一区二区三区| 蜜臀av性久久久久蜜臀aⅴ流畅| 国产高清视频免费在线观看| 亚洲精品www久久久| 成人精品国产| 国产美女永久无遮挡| 久久综合九色综合欧美亚洲| 国产一区二区三区黄片| 欧美黄色小视频| 国产一区二区三区日韩精品| 一级淫片在线观看| 婷婷六月综合网| 日本中文字幕在线播放| 国产欧美日韩一区| 美女一区二区三区在线观看| 午夜偷拍福利视频| 在线观看日韩欧美| av综合网站| 玖玖爱视频在线| 精品日本高清在线播放| 蜜桃视频在线观看www社区| 精品不卡在线|