zoukankan      html  css  js  c++  java
  • Unirest

    ---恢复内容开始---

    Unirest的特性
    1.能够伪造GET, POST, PUT, PATCH, DELETE, HEAD, OPTIONS 这些请求。

    2.支持同步/异步请求。

    3.支持表单提交,文件上传,自定义实体。

    4.支持路径参数

    5.支持gzip

    6.支持本地的 Basic Authentication

    7.自定义超时,并发级别和代理设置。

    8.为每个请求自定义默认请求头。

    9.自定义HttpClient和HttpAsyncClient

    10.自动解析JSON

    11.自定义的将返回的json数据转换成Java对象。

    Maven:

    <dependency>
    <groupId>com.mashape.unirest</groupId>
    <artifactId>unirest-java</artifactId>
    <version>1.4.9</version>
    </dependency>

    响应
    在接收到响应Unirest以对象的形式返回结果时,对于响应细节,该对象应该始终具有与每种语言相同的键。
    .getStatus() - HTTP响应状态代码(示例:200)
    .getStatusText() - HTTP响应状态文本(示例:“OK”)
    .getHeaders() - HTTP响应标头
    .getBody() - 解析响应正文(如适用),例如JSON响应将解析为对象/关联数组。
    .getRawBody() - 未解析的响应正文

    使用Unirest请求的数据一般是 JsonNode,若返回类型报错,一般为String,最后得到的为.asString();
    .header用了设置header的各种参数,包括token
    .routeParam用于设置路径中带有参数的如{cid}之类的
    .paramString用于设置get命令中 &的键值对
    .field用于设置post的参数,也可以直接用一个map,.fields(prams) //prams是一个map,put了很多参数进去,和直接多个fields一样的效果
    返回的结果打印一般用,response.getBody( ).getObject( ) 得到的JSON对象,之后的JSON解析出需要的内容都是以此为基础分层剥离。
    返回的状态用response.getStatus(),即返回的状态码,注意有个别成功码并不一样,如前台是200,后台是302

    创建请求
    HttpResponse<JsonNode> jsonResponse = Unirest.post("http://httpbin.org/post")
    .header("accept", "application/json")
    .queryString("apiKey", "123")
    .field("parameter", "value")
    .field("foo", "bar")
    .asJson();
    如上,当调用asJson()这个方法的时候,这个post请求就被发送了。不只包含json这种类型,还可以是JSON,Binary,String,Object等类型。

    queryString和field比较类似,我理解queryString是get请求中用于拼接问好后面的参数,field用于post请求,但是该类并没有很严格的要求,get和post都可以使用。

    序列化
    如果要求返回的直接是一个Java对象,那么我们需要将json格式的数据转成Java对象,这中间需要一些序列化的工具,个人比较喜欢Gson。

    所以,在调用asObject(Class)或.body(Object)方法 之前,有必要实现一个自定义的ObjectMapper接口。这应该只在第一次完成,因为ObjectMapper的实例将在全局共享。

    // Only one time
    Unirest.setObjectMapper(new ObjectMapper() {
    private com.fasterxml.jackson.databind.ObjectMapper jacksonObjectMapper
    = new com.fasterxml.jackson.databind.ObjectMapper();

    public <T> T readValue(String value, Class<T> valueType) {
    try {
    return jacksonObjectMapper.readValue(value, valueType);
    } catch (IOException e) {
    throw new RuntimeException(e);
    }
    }

    public String writeValue(Object value) {
    try {
    return jacksonObjectMapper.writeValueAsString(value);
    } catch (JsonProcessingException e) {
    throw new RuntimeException(e);
    }
    }
    });

    // Response to Object
    HttpResponse<Book> bookResponse = Unirest.get("http://httpbin.org/books/1").asObject(Book.class);
    Book bookObject = bookResponse.getBody();

    HttpResponse<Author> authorResponse = Unirest.get("http://httpbin.org/books/{id}/author")
    .routeParam("id", bookObject.getId())
    .asObject(Author.class);

    Author authorObject = authorResponse.getBody();

    // Object to Json
    HttpResponse<JsonNode> postResponse = Unirest.post("http://httpbin.org/authors/post")
    .header("accept", "application/json")
    .header("Content-Type", "application/json")
    .body(authorObject)
    .asJson();
     

    路径参数
    可以通过routeParam来设置路径参数,比如:

    Unirest.get("http://httpbin.org/{method}")
    .routeParam("method", "get")
    .queryString("name", "Mark")
    .asJson();
    {method}这个占位符就会变成get。

    异步请求
    有时候我们需要请求是异步的而不是阻塞的,Unirest支持回调方法,如下:

    Future<HttpResponse<JsonNode>> future = Unirest.post("http://httpbin.org/post")
    .header("accept", "application/json")
    .field("param1", "value1")
    .field("param2", "value2")
    .asJsonAsync(new Callback<JsonNode>() {

    public void failed(UnirestException e) {
    System.out.println("The request has failed");
    }

    public void completed(HttpResponse<JsonNode> response) {
    int code = response.getStatus();
    Map<String, String> headers = response.getHeaders();
    JsonNode body = response.getBody();
    InputStream rawBody = response.getRawBody();
    }

    public void cancelled() {
    System.out.println("The request has been cancelled");
    }

    });
     

    文件上传
    只需将一个File或一个InputStream对象作为字段传递即可,如下:

    HttpResponse<JsonNode> jsonResponse = Unirest.post("http://httpbin.org/post")
    .header("accept", "application/json")
    .field("parameter", "value")
    .field("file", new File("/tmp/file"))
    .asJson();


    自定义实体
    HttpResponse<JsonNode> jsonResponse = Unirest.post("http://httpbin.org/post")
    .header("accept", "application/json")
    .body("{"parameter":"value", "foo":"bar"}")
    .asJson();


    字节流作为实体
    final InputStream stream = new FileInputStream(new File(getClass().getResource("/image.jpg").toURI()));
    final byte[] bytes = new byte[stream.available()];
    stream.read(bytes);
    stream.close();
    final HttpResponse<JsonNode> jsonResponse = Unirest.post("http://httpbin.org/post")
    .field("name", "Mark")
    .field("file", bytes, "image.jpg")
    .asJson();


    InputStream作为实体
    HttpResponse<JsonNode> jsonResponse = Unirest.post("http://httpbin.org/post")
    .field("name", "Mark")
    .field("file", new FileInputStream(new File(getClass().getResource("/image.jpg").toURI())), ContentType.APPLICATION_OCTET_STREAM, "image.jpg")
    .asJson();


    基本认证
    通过调用basicAuth(username, password)方法可以通过基本身份验证来验证请求:

    HttpResponse<JsonNode> response = Unirest.get("http://httpbin.org/headers").basicAuth("username", "password").asJson();
    请求
    Unirest遵循构建器约定,可以通过一下几种方式来构建一个http请求。

    GetRequest request = Unirest.get(String url);
    GetRequest request = Unirest.head(String url);
    HttpRequestWithBody request = Unirest.post(String url);
    HttpRequestWithBody request = Unirest.put(String url);
    HttpRequestWithBody request = Unirest.patch(String url);
    HttpRequestWithBody request = Unirest.options(String url);
    HttpRequestWithBody request = Unirest.delete(String url);
     响应
    收到响应后,Unirest以一个对象的形式返回结果,该对象有如下几种 键:

    .getStatus() – HTTP响应状态代码(例如:200)
    .getStatusText() – HTTP响应状态文本(示例:“确定”)
    .getHeaders() – HTTP响应标头
    .getBody() – 适用的解析响应体,例如JSON响应被解析为Objects / Associative Arrays。
    .getRawBody() – 未解析的响应正文


    高级配置
    自定义HTTP客户端
    可以使用以下方法显式设置自己的实现HttpClient和HttpAsyncClient:

    Unirest.setHttpClient(httpClient);
    Unirest.setAsyncHttpClient(asyncHttpClient);
    超时
    可以设置自定义连接和套接字超时值(以毫秒为单位):

    Unirest.setTimeouts(long connectionTimeout, long socketTimeout);
    默认情况下,连接超时(连接到服务器所需的时间)是10000和套接字超时(接收数据所需的时间)是60000,也可以将这些超时中的任何一个设置为零以禁用超时。

    默认请求标头
    可以设置将在每个请求上发送的默认标头:

    Unirest.setDefaultHeader("Header1", "Value1");
    Unirest.setDefaultHeader("Header2", "Value2");
    也可以清楚这些头信息:

    Unirest.clearDefaultHeaders();
    并发
    如果需要调整同步或异步客户端的性能,可以设置自定义并发级别:

    Unirest.setConcurrency(int maxTotal, int maxPerRoute);
    默认情况下,maxTotal(池中的总连接限制)200和maxPerRoute(每个目标主机的连接限制)是20。

    代理
    您可以通过调用来设置代理:

    Unirest.setProxy(new HttpHost("127.0.0.1", 8000));
    退出申请
    Unirest启动后台事件循环,在我们通过调用手动关闭所有线程之前,Java应用程序将无法退出:

    Unirest.shutdown();

    参考文档

    http://unirest.io/java.html

  • 相关阅读:
    java.security.ProviderException: java.security.KeyException
    DES ECB 模式 JAVA PHP C# 实现 加密 解密 兼容
    mysql timestamp类型字段的CURRENT_TIMESTAMP与ON UPDATE CURRENT_TIMESTAMP属性
    阿里云composer 镜像
    封装redis操作 php版本
    金钱数友好显示 php版本
    php代码规范->如何写出规范且易于理解的项目代码-ZX版
    hibernate 注解大全
    国家省市区县乡镇三级,五级地址数据
    java基础 数据类型转换
  • 原文地址:https://www.cnblogs.com/shareTechnologyl/p/11850915.html
Copyright © 2011-2022 走看看