[日常のビジネス開発] Java がサードパーティの http インターフェイスを呼び出す一般的な方法

概要

実際の開発プロセスでは、相手が提供したインターフェースを呼び出したり、自分が書いたインターフェースが適切かどうかをテストしたりすることがよくあります。多くのプロジェクトは、独自のプロジェクトのインターフェイス仕様をカプセル化して指定しているため、ほとんどのプロジェクトでは、相手側またはサードパーティのインターフェイス (テキスト メッセージ、天気など) が提供するインターフェイスを呼び出す必要があります。

Java プロジェクトでサードパーティ インターフェイスを呼び出す一般的な方法は次のとおりです。

  1. JDKネットワーククラス経由Java.net.HttpURLConnection

  2. Apache common を介してパッケージ化されるHttpClient

  3. Apache 経由でパッケージ化CloseableHttpClient

  4. 合格OkHttp

  5. 春経由RestTemplate

  6. ヴィアフツールHttpUtil

Java がサードパーティの http インターフェイスを呼び出す方法

JDK ネットワーク クラス Java.net.HttpURLConnection 経由

概要: http リクエストは、java.net パッケージのネイティブ Java API によって提供されます。

使用手順:

  1. ユニフォーム リソース ロケーター (java.net.URL) を介してコネクタ (java.net.URLConnection) を取得します。

  2. リクエストのパラメータを設定します。

  3. リクエストを送信します。

  4. 返されたコンテンツを入力ストリームの形式で取得します。

  5. 入力ストリームを閉じます。

比較的原始的な呼び出しメソッドです。ここでは get リクエストと post リクエストを 1 つのメソッドに入れ、コードを直接入力します。

import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;

/**
 * @ClassName: HttpUrlConnectionToInterface
 * @Description: jdk类HttpURLConnection调用第三方http接口
 */
public class HttpUrlConnectionToInterface {
    
    

    /**
     * 以post方式调用对方接口方法
     * @param pathUrl
     */
    public static void doPost(String pathUrl, String data){
    
    
        OutputStreamWriter out = null;
        BufferedReader br = null;
        String result = "";
        try {
    
    
            URL url = new URL(pathUrl);

            //打开和url之间的连接
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();

            //设定请求的方法为"POST",默认是GET
            //post与get的不同之处在于post的参数不是放在URL字串里面,而是放在http请求的正文内。
            conn.setRequestMethod("POST");

            //设置30秒连接超时
            conn.setConnectTimeout(30000);
            //设置30秒读取超时
            conn.setReadTimeout(30000);

            // 设置是否向httpUrlConnection输出,因为这个是post请求,参数要放在http正文内,因此需要设为true, 默认情况下是false;
            conn.setDoOutput(true);
            // 设置是否从httpUrlConnection读入,默认情况下是true;
            conn.setDoInput(true);

            // Post请求不能使用缓存
            conn.setUseCaches(false);

            //设置通用的请求属性
            conn.setRequestProperty("accept", "*/*");
            conn.setRequestProperty("connection", "Keep-Alive");  //维持长链接
            conn.setRequestProperty("Content-Type", "application/json;charset=utf-8");

            //连接,从上述url.openConnection()至此的配置必须要在connect之前完成,
            conn.connect();

            /**
             * 下面的三句代码,就是调用第三方http接口
             */
            //获取URLConnection对象对应的输出流
            //此处getOutputStream会隐含的进行connect(即:如同调用上面的connect()方法,所以在开发中不调用上述的connect()也可以)。
            out = new OutputStreamWriter(conn.getOutputStream(), "UTF-8");
            //发送请求参数即数据
            out.write(data);
            //flush输出流的缓冲
            out.flush();

            /**
             * 下面的代码相当于,获取调用第三方http接口后返回的结果
             */
            //获取URLConnection对象对应的输入流
            InputStream is = conn.getInputStream();
            //构造一个字符流缓存
            br = new BufferedReader(new InputStreamReader(is));
            String str = "";
            while ((str = br.readLine()) != null){
    
    
                result += str;
            }
            System.out.println(result);
            //关闭流
            is.close();
            //断开连接,disconnect是在底层tcp socket链接空闲时才切断,如果正在被其他线程使用就不切断。
            conn.disconnect();

        } catch (Exception e) {
    
    
            e.printStackTrace();
        }finally {
    
    
            try {
    
    
                if (out != null){
    
    
                    out.close();
                }
                if (br != null){
    
    
                    br.close();
                }
            } catch (IOException e) {
    
    
                e.printStackTrace();
            }
        }
    }

    /**
     * 以get方式调用对方接口方法
     * @param pathUrl
     */
    public static void doGet(String pathUrl){
    
    
        BufferedReader br = null;
        String result = "";
        try {
    
    
            URL url = new URL(pathUrl);

            //打开和url之间的连接
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();

            //设定请求的方法为"GET",默认是GET
            //post与get的不同之处在于post的参数不是放在URL字串里面,而是放在http请求的正文内。
            conn.setRequestMethod("GET");

            //设置30秒连接超时
            conn.setConnectTimeout(30000);
            //设置30秒读取超时
            conn.setReadTimeout(30000);

            // 设置是否向httpUrlConnection输出,因为这个是post请求,参数要放在http正文内,因此需要设为true, 默认情况下是false;
            conn.setDoOutput(true);
            // 设置是否从httpUrlConnection读入,默认情况下是true;
            conn.setDoInput(true);

            // Post请求不能使用缓存(get可以不使用)
            conn.setUseCaches(false);

            //设置通用的请求属性
            conn.setRequestProperty("accept", "*/*");
            conn.setRequestProperty("connection", "Keep-Alive");  //维持长链接
            conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded;charset=utf-8");

            //连接,从上述url.openConnection()至此的配置必须要在connect之前完成,
            conn.connect();

            /**
             * 下面的代码相当于,获取调用第三方http接口后返回的结果
             */
            //获取URLConnection对象对应的输入流
            InputStream is = conn.getInputStream();
            //构造一个字符流缓存
            br = new BufferedReader(new InputStreamReader(is, "UTF-8"));
            String str = "";
            while ((str = br.readLine()) != null){
    
    
                result += str;
            }
            System.out.println(result);
            //关闭流
            is.close();
            //断开连接,disconnect是在底层tcp socket链接空闲时才切断,如果正在被其他线程使用就不切断。
            conn.disconnect();
        } catch (Exception e) {
    
    
            e.printStackTrace();
        }finally {
    
    
            try {
    
    
                if (br != null){
    
    
                    br.close();
                }
            } catch (IOException e) {
    
    
                e.printStackTrace();
            }
        }
    }

    public static void main(String[] args) {
    
    
        //post请求一般都是把实体对象转为Json字符串
        doGet("https://weather.cma.cn/api/climate?stationid=57516");
    }
}

Apache common を介してカプセル化された HttpClient

はじめに: これまでのところ、http クライアントの最新バージョンはバージョン 5.1、公式 Web サイトのアドレス: http://hc.apache.org/ です。Http クライアントはプロモーション用に設計されており、基本的な http プロトコルの強力なサポートを提供します。java.net パッケージは http 経由でアクセスするための基本的な機能を提供しますが、多くのアプリケーションで必要な機能は提供しません。

使用手順:

  1. HttpClient オブジェクトを生成し、対応するパラメーターを設定します。
  2. GetMethod オブジェクトまたは PostMethod を生成し、応答パラメーターを設定します。
  3. HttpClient によって生成されたオブジェクトを使用して、GetMethod によって生成された Get メソッドを実行します。
  4. 応答ステータス コードを処理します。
  5. 応答が正常な場合は、HTTP 応答の内容を処理します。
  6. 接続を解放します。実行方法が成功したかどうかに関係なく、接続は解放される必要があります。
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>2.0.1</version>
</dependency>
<!--HttpClient-->
<dependency>
    <groupId>commons-httpclient</groupId>
    <artifactId>commons-httpclient</artifactId>
    <version>3.1</version>
</dependency>
import com.alibaba.fastjson.JSONObject;
import org.apache.commons.httpclient.*;
import org.apache.commons.httpclient.methods.GetMethod;
import org.apache.commons.httpclient.methods.PostMethod;
import org.apache.commons.httpclient.params.HttpMethodParams;

import java.io.IOException;

/**
 * @ClassName: HttpClientToInterface
 * @Description: HttpClient模拟get、post请求并发送请求参数(json等)
 */
public class HttpClientToInterface {
    
    

    /**
     * httpClient的get请求方式
     * 使用GetMethod来访问一个URL对应的网页实现步骤:
     * 1.生成一个HttpClient对象并设置相应的参数;
     * 2.生成一个GetMethod对象并设置响应的参数;
     * 3.用HttpClient生成的对象来执行GetMethod生成的Get方法;
     * 4.处理响应状态码;
     * 5.若响应正常,处理HTTP响应内容;
     * 6.释放连接。
     *
     * @param url
     * @param charset
     * @return
     */
    public static String doGet(String url, String charset) {
    
    
        /**
         * 1.生成HttpClient对象并设置参数
         */
        HttpClient httpClient = new HttpClient();
        //设置Http连接超时为5秒
        httpClient.getHttpConnectionManager().getParams().setConnectionTimeout(5000);

        /**
         * 2.生成GetMethod对象并设置参数
         */
        GetMethod getMethod = new GetMethod(url);
        //设置get请求超时为5秒
        getMethod.getParams().setParameter(HttpMethodParams.SO_TIMEOUT, 5000);
        //设置请求重试处理,用的是默认的重试处理:请求三次
        getMethod.getParams().setParameter(HttpMethodParams.RETRY_HANDLER, new DefaultHttpMethodRetryHandler());

        String response = "";

        /**
         * 3.执行HTTP GET 请求
         */
        try {
    
    
            int statusCode = httpClient.executeMethod(getMethod);

            /**
             * 4.判断访问的状态码
             */
            if (statusCode != HttpStatus.SC_OK) {
    
    
                System.err.println("请求出错:" + getMethod.getStatusLine());
            }

            /**
             * 5.处理HTTP响应内容
             */
            //HTTP响应头部信息,这里简单打印
            Header[] headers = getMethod.getResponseHeaders();
            for (Header h : headers) {
    
    
                System.out.println(h.getName() + "---------------" + h.getValue());
            }
            //读取HTTP响应内容,这里简单打印网页内容
            //读取为字节数组
            byte[] responseBody = getMethod.getResponseBody();
            response = new String(responseBody, charset);
            System.out.println("-----------response:" + response);
            //读取为InputStream,在网页内容数据量大时候推荐使用
            //InputStream response = getMethod.getResponseBodyAsStream();

        } catch (HttpException e) {
    
    
            //发生致命的异常,可能是协议不对或者返回的内容有问题
            System.out.println("请检查输入的URL!");
            e.printStackTrace();
        } catch (IOException e) {
    
    
            //发生网络异常
            System.out.println("发生网络异常!");
        } finally {
    
    
            /**
             * 6.释放连接
             */
            getMethod.releaseConnection();
        }
        return response;
    }

    /**
     * post请求
     *
     * @param url
     * @param json
     * @return
     */
    public static String doPost(String url, JSONObject json) {
    
    
        HttpClient httpClient = new HttpClient();
        PostMethod postMethod = new PostMethod(url);

        postMethod.addRequestHeader("accept", "*/*");
        postMethod.addRequestHeader("connection", "Keep-Alive");
        //设置json格式传送
        postMethod.addRequestHeader("Content-Type", "application/json;charset=utf-8");
        //必须设置下面这个Header
        postMethod.addRequestHeader("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.81 Safari/537.36");
        //添加请求参数
        postMethod.addParameter("commentId", json.getString("commentId"));

        String res = "";
        try {
    
    
            int code = httpClient.executeMethod(postMethod);
            if (code == 200) {
    
    
                res = postMethod.getResponseBodyAsString();
                System.out.println(res);
            }
        } catch (IOException e) {
    
    
            e.printStackTrace();
        }
        return res;
    }

    public static void main(String[] args) {
    
    
        doGet("http://tcc.taobao.com/cc/json/mobile_tel_segment.htm?tel=13026194071", "UTF-8");
        System.out.println("-----------分割线------------");
        System.out.println("-----------分割线------------");
        System.out.println("-----------分割线------------");

        JSONObject jsonObject = new JSONObject();
        jsonObject.put("commentId", "13026194071");
        doPost("http://tcc.taobao.com/cc/json/mobile_tel_segment.htm", jsonObject);
    }
}

Apache によってカプセル化された CloseableHttpClient

CloseableHttpClientはHttpClientをベースに修正・更新されますリクエストヘッダトークンの設定(リクエスト検証)も含まれますリクエストを変換したり結果文字列をjson形式に返すためにFastjsonを使用しますもちろん上記2つのメソッドでも設定できますリクエストヘッダー、トークンとjsonについては以下でのみ説明します。

次の jar パッケージをインポートします。

<!--CloseableHttpClient-->
<dependency>
    <groupId>org.apache.httpcomponents</groupId>
    <artifactId>httpclient</artifactId>
    <version>4.5.2</version>
</dependency>
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>1.2.28</version>
</dependency>
import com.alibaba.fastjson.JSONObject;
import org.apache.http.HttpResponse;
import org.apache.http.HttpStatus;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.util.EntityUtils;

import java.io.IOException;


/**
 * @ClassName: CloseableHttpClientToInterface
 * @Description: Apache封装好的CloseableHttpClient
 */

public class CloseableHttpClientToInterface {
    
    
    private static String tokenString = "";
    private static String AUTH_TOKEN_EXPIRED = "AUTH_TOKEN_EXPIRED";
    private static CloseableHttpClient httpClient = null;

    /**
     * 以get方式调用第三方接口
     *
     * @param url
     * @return
     */
    public static String doGet(String url, String token) {
    
    
        //创建HttpClient对象
        CloseableHttpClient httpClient = HttpClientBuilder.create().build();
        HttpGet get = new HttpGet(url);

        try {
    
    
//            if (tokenString != null && !tokenString.equals("")) {
    
    
//                tokenString = getToken();
//            }
//            //api_gateway_auth_token自定义header头,用于token验证使用
//            get.addHeader("api_gateway_auth_token", tokenString);
            get.addHeader("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.81 Safari/537.36");
            HttpResponse response = httpClient.execute(get);
            if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
    
    
                //返回json格式
                String res = EntityUtils.toString(response.getEntity());
                return res;
            }
        } catch (IOException e) {
    
    
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 以post方式调用第三方接口
     *
     * @param url
     * @param json
     * @return
     */
    public static String doPost(String url, JSONObject json) {
    
    

        try {
    
    
            if (httpClient == null) {
    
    
                httpClient = HttpClientBuilder.create().build();
            }

            HttpPost post = new HttpPost(url);

            if (tokenString != null && !tokenString.equals("")) {
    
    
                tokenString = getToken();
            }

            //api_gateway_auth_token自定义header头,用于token验证使用
            post.addHeader("api_gateway_auth_token", tokenString);
            post.addHeader("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.81 Safari/537.36");

            StringEntity s = new StringEntity(json.toString());
            s.setContentEncoding("UTF-8");
            //发送json数据需要设置contentType
            s.setContentType("application/x-www-form-urlencoded");
            //设置请求参数
            post.setEntity(s);
            HttpResponse response = httpClient.execute(post);

            if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
    
    
                //返回json格式
                String res = EntityUtils.toString(response.getEntity());
                return res;
            }
        } catch (Exception e) {
    
    
            e.printStackTrace();
        } finally {
    
    
            if (httpClient != null) {
    
    
                try {
    
    
                    httpClient.close();
                } catch (IOException e) {
    
    
                    e.printStackTrace();
                }
            }
        }
        return null;
    }

    /**
     * 获取第三方接口的token
     */
    public static String getToken(){
    
    

        String token = "";

        JSONObject object = new JSONObject();
        object.put("appid", "appid");
        object.put("secretkey", "secretkey");

        try {
    
    
            if (httpClient == null){
    
    
                httpClient = HttpClientBuilder.create().build();
            }
            HttpPost post = new HttpPost("http://localhost/login");

            post.addHeader("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.81 Safari/537.36");

            StringEntity s = new StringEntity(object.toString());
            s.setContentEncoding("UTF-8");
            //发送json数据需要设置contentType
            s.setContentType("application/x-www-form-urlencoded");
            //设置请求参数
            post.setEntity(s);
            HttpResponse response = httpClient.execute(post);

            //这里可以把返回的结果按照自定义的返回数据结果,把string转换成自定义类
            //ResultTokenBO result = JSONObject.parseObject(response, ResultTokenBO.class);

            //把response转为jsonObject
            JSONObject result = JSONObject.parseObject(String.valueOf(response));
            if (result.containsKey("token")){
    
    
                token = result.getString("token");
            }
        } catch (Exception e) {
    
    
            e.printStackTrace();
        }
        return token;
    }


    public static void main(String[] args) {
    
    
        System.out.println(doGet("https://weather.cma.cn/api/climate?stationid=57516", null));
    }
}

投稿者:OkHttp

はじめに: OkHttp は、デフォルトで動作する HTTP クライアントです。HTTP を効率的に実行すると、読み込みが高速化され、帯域幅が節約されます。サービスに複数の IP アドレスがある場合、最初の接続が失敗した場合、OkHttp は代替アドレスを試行します。これは、IPv4 + IPv6 および冗長データセンターでホストされるサービスに必要です。OkHttp は最新の TLS 機能 (SNI、ALPN) を使用して新しい接続を開始し、ハンドシェイクが失敗すると TLS 1.0 に戻ります。OkHttp は Android 2.3 以降をサポートします。Java の場合、最小要件は 1.7 です。

手順:

  1. OKhttpClientを作成します。

  2. mClient は newCall を実行してリクエストをコールに変換します。

  3. 最後に、call は同期的に実行され、enqueue は非同期的に実行されます。

  4. リクエストは主に Request.Builder を通じて構築されます。

  5. キャッシュ。

  6. リクエストをキャンセルします。

次の jar パッケージをインポートします。

<!--okhttp3-->
<dependency>
    <groupId>com.squareup.okhttp3</groupId>
    <artifactId>okhttp</artifactId>
    <version>4.9.1</version>
</dependency>
import okhttp3.*;

import java.io.IOException;

/**
 * @ClassName: OkHttpToInterface
 * @Description: 通过OkHttp调用第三方http接口
 */
public class OkHttpToInterface {
    
    

    public static final MediaType JSON = MediaType.get("application/json; charset=utf-8");

    /**
     * 以get方式调用第三方接口
     *
     * @param url
     */
    public static void doGet(String url) {
    
    
        OkHttpClient okHttpClient = new OkHttpClient();
        final Request request = new Request.Builder()
                .url(url)
                .get()//默认就是GET请求,可以不写
                .build();
        Call call = okHttpClient.newCall(request);
        call.enqueue(new Callback() {
    
    
            @Override
            public void onFailure(Call call, IOException e) {
    
    
                System.out.println("onFailure: ");
            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {
    
    
                System.out.println("onResponse: " + response.body().string());
            }
        });
    }

    /**
     * post请求
     *
     * @param url
     * @param json
     */
    public static void doPost(String url, String json) {
    
    
        MediaType mediaType = MediaType.parse("text/x-markdown; charset=utf-8");
        String requestBody = json;
        Request request = new Request.Builder()
                .url(url)
                .post(RequestBody.create(mediaType, requestBody))
                .build();
        OkHttpClient okHttpClient = new OkHttpClient();
        okHttpClient.newCall(request).enqueue(new Callback() {
    
    
            @Override
            public void onFailure(Call call, IOException e) {
    
    
                System.out.println("onFailure: " + e.getMessage());
            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {
    
    
                System.out.println(response.protocol() + " " + response.code() + " " + response.message());
                Headers headers = response.headers();
                for (int i = 0; i < headers.size(); i++) {
    
    
                    System.out.println(headers.name(i) + ":" + headers.value(i));
                }
                System.out.println("onResponse: " + response.body().string());
            }
        });
    }

    public static void main(String[] args) {
    
    
//        doGet("http://tcc.taobao.com/cc/json/mobile_tel_segment.htm?tel=13026194071");
//        doPost("https://api.github.com/markdown/raw", "I am Jdqm.");
        doGet("https://weather.cma.cn/api/climate?stationid=57516");
    }
}

Spring の RestTemplate 経由

RestTemple は最初の 3 つのメソッドの集大成であり、コードの記述が容易になります。現在、使用できるサードパーティ インターフェイスは次のとおりです。

  • delete() は、特定の URL にあるリソースに対して HTTP DELETE 操作を実行します。
  • exchange()URL で特定の HTTP メソッドを実行し、応答本文からマップされたオブジェクトを含む ResponseEntity を返します。
  • execute()URL で特定の HTTP メソッドを実行し、応答本文からマップされたオブジェクトを返します。
  • getForEntity()HTTP GET リクエストを送信すると、返される ResponseEntity には、応答本文にマップされたオブジェクトが含まれます。
  • getForObject() HTTP GET リクエストを送信すると、返されたリクエスト本文がオブジェクトにマッピングされます。
  • postForEntity()データを URL に POST し、応答本文からマップされたオブジェクトを含む ResponseEntity を返します。
  • postForObject() データを URL に POST し、応答本文の一致に基づいて形成されたオブジェクトを返します。
  • headForHeaders() は、HTTP HEAD リクエストを送信し、特定のリソースの URL を含む HTTP ヘッダーを返します。
  • optionsForAllow() は、HTTP OPTIONS リクエストを送信し、特定の URL のAllow ヘッダー情報を返します。
  • postForLocation() データを URL に POST し、新しく作成されたリソースの URL を返します。
  • put() リソースを特定の URL に PUT

注: 現在、赤でマークされているものは一般的に使用されているものです。

手順:

  1. デフォルトの構築メソッド new インスタンス new RestTemplate() を使用します。

  2. RestTemplate は内部で doExecute メソッドを呼び出し、最初に ClientHttpRequest を取得します。

  3. RestTemplate は抽象クラス HttpAccessor を実装しているため、親クラスの createRequest を呼び出すことができます。

  4. SimpleClientHttpRequestFactory は ClientHttpRequest を実装し、メソッドも実装します。

  5. requestCallback.doWithRequest(request)を実行します。

  6. 応答 = request.execute() を実行します。

  7. 最後に応答を解析します。

まず SpringBoot の Web パッケージをインポートします

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.1.4.RELEASE</version>
</parent>

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
</dependencies>

構成クラス

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.client.ClientHttpRequestFactory;
import org.springframework.http.client.SimpleClientHttpRequestFactory;
import org.springframework.web.client.RestTemplate;
 
@Configuration
public class RestTemplateConfig {
    
    
 
    @Bean
    public RestTemplate restTemplate(ClientHttpRequestFactory factory){
    
    
        return new RestTemplate(factory);
    }
 
    @Bean
    public ClientHttpRequestFactory simpleClientHttpRequestFactory(){
    
    
        SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory();
        factory.setConnectTimeout(15000);
        factory.setReadTimeout(5000);
        return factory;
    }
}
import cn.zysheep.domain.entity.User;
import com.alibaba.fastjson.JSONObject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.*;
import org.springframework.web.client.RestTemplate;

/**
 * @ClassName: RestTemplateToInterface
 * @Description: 通过restTemplate调用第三方http接口
 */
public class RestTemplateToInterface {
    
    
    @Autowired
    private RestTemplate restTemplate;

    /**
     * 以get方式请求第三方http接口 getForEntity
     *
     * @param url
     * @return
     */
    public User doGetWith1(String url) {
    
    
        ResponseEntity<User> responseEntity = restTemplate.getForEntity(url, User.class);
        User user = responseEntity.getBody();
        return user;
    }

    /**
     * 以get方式请求第三方http接口 getForObject
     * 返回值返回的是响应体,省去了我们再去getBody()
     *
     * @param url
     * @return
     */
    public User doGetWith2(String url) {
    
    
        User user = restTemplate.getForObject(url, User.class);
        return user;
    }

    /**
     * 以post方式请求第三方http接口 postForEntity
     *
     * @param url
     * @return
     */
    public String doPostWith1(String url) {
    
    
        User user = new User("小白", 20);
        ResponseEntity<String> responseEntity = restTemplate.postForEntity(url, user, String.class);
        String body = responseEntity.getBody();
        return body;
    }

    /**
     * 以post方式请求第三方http接口 postForEntity
     *
     * @param url
     * @return
     */
    public String doPostWith2(String url) {
    
    
        User user = new User("小白", 20);
        String body = restTemplate.postForObject(url, user, String.class);
        return body;
    }

    /**
     * exchange
     *
     * @return
     */
    public String doExchange(String url, Integer age, String name) {
    
    
        //header参数
        HttpHeaders headers = new HttpHeaders();
        String token = "asdfaf2322";
        headers.add("authorization", token);
        headers.setContentType(MediaType.APPLICATION_JSON);

        //放入body中的json参数
        JSONObject obj = new JSONObject();
        obj.put("age", age);
        obj.put("name", name);

        //组装
        HttpEntity<JSONObject> request = new HttpEntity<>(obj, headers);
        ResponseEntity<String> responseEntity = restTemplate.exchange(url, HttpMethod.POST, request, String.class);
        String body = responseEntity.getBody();
        return body;
    }
}

hutool 経由の HttpUtil

はじめに: Hutool ツール クラス HttpUtil の使用方法については、公式ドキュメントHutool HttpUtilを参照してください。

<dependency>
    <groupId>cn.hutool</groupId>
    <artifactId>hutool-all</artifactId>
    <version>5.7.1</version>
</dependency>
import cn.hutool.core.io.FileUtil;
import cn.hutool.core.util.CharsetUtil;
import cn.hutool.http.HttpUtil;

import java.util.HashMap;

/**
 * @ClassName: HttpUtilToInterface
 * @Description: 通过hutool工具类调用第三方http接口
 */
public class HttpUtilToInterface {
    
    
    /**
     * get请求示例
     */
    public static void doGet() {
    
    
        // 最简单的HTTP请求,可以自动通过header等信息判断编码,不区分HTTP和HTTPS
        String result1 = HttpUtil.get("https://www.baidu.com");

        // 当无法识别页面编码的时候,可以自定义请求页面的编码
        String result2 = HttpUtil.get("https://www.baidu.com", CharsetUtil.CHARSET_UTF_8);

        //可以单独传入http参数,这样参数会自动做URL编码,拼接在URL中
        HashMap<String, Object> paramMap = new HashMap<>();
        paramMap.put("city", "北京");
        String result3 = HttpUtil.get("https://www.baidu.com", paramMap);
    }

    public static void main(String[] args) {
    
    
        doGet();
    }

     /**
     * post请求示例
     */
    public static void doPost() {
    
    
        String url = "http://localhost:9001/xss/saveMap";

        //post普通请求示例
        HashMap<String, Object> paramMap = new HashMap<>();
        paramMap.put("city", "北京");

        // application/x-www-form-urlencoded
        String result = HttpUtil.post(url, paramMap);
        System.out.println(result);

        // application/json
        String body = HttpUtil.createPost(url).body(JSON.toJSONString(paramMap)).execute().body();
        System.out.println(body);

        //文件上传示例
//        HashMap<String, Object> paramMap1 = new HashMap<>();
//        //文件上传只需将参数中的键指定(默认file),值设为文件对象即可,对于使用者来说,文件上传与普通表单提交并无区别
//        paramMap1.put("file", FileUtil.file("D:\\face.jpg"));
//        String result1 = HttpUtil.post("https://www.baidu.com", paramMap1);
//
//        //下载文件(很少用)
//        String fileUrl = "http://mirrors.sohu.com/centos/8.4.2105/isos/x86_64/CentOS-8.4.2105-x86_64-dvd1.iso";
//        //将文件下载后保存在E盘,返回结果为下载文件大小
//        long size = HttpUtil.downloadFile(fileUrl, FileUtil.file("e:/"));
//        System.out.println("Download size: " + size);
    }

    public static void main(String[] args) {
    
    
        doPost();
    }
}

要約する

日常の開発では、一般的に Spring の RESTtemplate と hutool の HttpUtil を使用することが多く、特に hutool は安心できるツールが多数含まれているため強くお勧めします。

おすすめ

転載: blog.csdn.net/qq_45297578/article/details/133036964