高防服务器

Java如何调用第三方接口


Java如何调用第三方接口

发布时间:2022-06-15 13:52:33 来源:高防服务器网 阅读:55 作者:iii 栏目:开发技术

这篇“Java如何调用第三方接口”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Java如何调用第三方接口”文章吧。

    一、 通过JDK网络类Java.net.HttpURLConnection

    1.java.net包下的原生java api提供的http请求

    使用步骤:

    1、通过统一资源定位器(java.net.URL)获取连接器(java.net.URLConnection)。

    2、设置请求的参数。

    3、发送请求。

    4、以输入流的形式获取返回内容。

    5、关闭输入流。

    2.HttpClientUtil工具类

    /**   * jdk 调用第三方接口   * @author hsq   */  public class HttpClientUtil2 {          /**       * 以post方式调用对方接口方法       * @param pathUrl       */      public static String 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();              }          }          return result;      }        /**       * 以get方式调用对方接口方法       * @param pathUrl       */      public static String 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();              }          }          return result;      }  }

    3.第三方api接口

    /**   * @author hsq   */  @RestController  @RequestMapping("/api")  public class HelloWorld {        private static final Logger log= LoggerFactory.getLogger(HelloWorld.class);        @GetMapping ("/getHello")      public Result getHelloWord(){          log.info("进入到api接口.......");          return Result.success("hello world api get 接口数据");      }        @PostMapping("/postHello")      public Result postHelloWord(@RequestBody User user){          log.info("进入post 方法.....");          System.out.println(user.toString());          return Result.success("hello world api post接口数据");      }  }

    4.测试类

     @Test      public void testJDKApi(){          //测试get方法          String s = HttpClientUtil2.doGet("http://localhost:9092/api/getHello");          System.out.println("get方法:"+s);          //测试post方法          User user = new User();          user.setUname("胡萝卜");          user.setRole("普通用户");          //把对象转换为json格式          String s1 = JsonUtil.toJson(user);          String postString = HttpClientUtil2.doPost("http://localhost:9092/api/postHello",s1);          System.out.println("post方法:"+postString);      }

    结果:

    二、通过Apache common封装好的HttpClient

    1.引入依赖

     		<!--HttpClient-->          <dependency>              <groupId>commons-httpclient</groupId>              <artifactId>commons-httpclient</artifactId>              <version>3.1</version>          </dependency>          <!--json-->          <dependency>              <groupId>com.alibaba</groupId>              <artifactId>fastjson</artifactId>              <version>1.2.28</version>          </dependency>

    2.httpClientUtil

    /**  	*httpClient的get请求方式       * 使用GetMethod来访问一个URL对应的网页实现步骤:       * 1.生成一个HttpClient对象并设置相应的参数;       * 2.生成一个GetMethod对象并设置响应的参数;       * 3.用HttpClient生成的对象来执行GetMethod生成的Get方法;       * 4.处理响应状态码;       * 5.若响应正常,处理HTTP响应内容;       * 6.释放连接。   * @author hsq   */  public class HttpClientUtil {        /**       * @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("param", json.getString("param"));          StringRequestEntity param = new StringRequestEntity(json.getString("param"));          postMethod.setRequestEntity(param);          String res = "";          try {              int code = httpClient.executeMethod(postMethod);              if (code == 200){                  byte[] responseBody = postMethod.getResponseBody();                  res = new String(responseBody, "UTF-8");                  //res = postMethod.getResponseBodyAsString();                  System.out.println(res);              }          } catch (IOException e) {              e.printStackTrace();          }          return res;      }  }

    3.第三方api接口

    @RestController  @RequestMapping("/api")  public class HelloWorld {        private static final Logger log= LoggerFactory.getLogger(HelloWorld.class);          @GetMapping ("/getHello")      public Result getHelloWord(){          log.info("进入到api接口.......");          return Result.success("hello world api get 接口数据");      }        @PostMapping("/postHello")      public Result postHelloWord(@RequestBody User user){          log.info("进入post 方法.....");          System.out.println(user.toString());          return Result.success("hello world api post接口数据");      }    }

    4.测试类

     	@Test      public void testApi() {          //测试get方法          String s = HttpClientUtil.doGet("http://localhost:9092/api/getHello", "UTF-8");          System.out.println("get方法:"+s);          //测试post方法          User user = new User();          user.setUname("胡萝卜");          user.setRole("普通用户");          JSONObject jsonObject = new JSONObject();          String s1 = JsonUtil.toJson(user);          jsonObject.put("param",s1);          String postString = HttpClientUtil.doPost("http://localhost:9092/api/postHello", jsonObject);          System.out.println("post方法:"+postString);      }

    结果:

    三、通过Spring的RestTemplate

    1.引入依赖

    导入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>

    2.RestTemplate配置类

    /**   * @author hsq   */  @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;      }  }

    3.RestTemplate实现类

    /**   * @author hsq   */  @Component  public class RestTemplateToInterface {        @Autowired      private RestTemplate restTemplate;        /**       * 以get方式请求第三方http接口 getForEntity       * @param url       * @return       */      public Result doGetWith2(String url){          ResponseEntity<Result> responseEntity = restTemplate.getForEntity(url, Result.class);          Result result = responseEntity.getBody();          return result;      }        /**       * 以get方式请求第三方http接口 getForObject       * 返回值返回的是响应体,省去了我们再去getBody()       * @param url       * @return       */      public Result doGetWith3(String url){          Result result  = restTemplate.getForObject(url, Result.class);          return result;      }        /**       * 以post方式请求第三方http接口 postForEntity       * @param url       * @param user       * @return       */      public String doPostWith2(String url,User user){          ResponseEntity<String> responseEntity = restTemplate.postForEntity(url, user, String.class);          String body = responseEntity.getBody();          return body;      }        /**       * 以post方式请求第三方http接口 postForEntity       * 返回值返回的是响应体,省去了我们再去getBody()       * @param url       * @param user       * @return       */      public String doPostWith3(String url,User user){          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;      }  }

    4.第三方api接口

    /**   * @author hsq   */  @RestController  @RequestMapping("/api")  public class HelloWorld {        private static final Logger log= LoggerFactory.getLogger(HelloWorld.class);        @GetMapping ("/getHello")      public Result getHelloWord(){          log.info("进入到api接口.......");          return Result.success("hello world api get 接口数据");      }        @PostMapping("/postHello")      public Result postHelloWord(@RequestBody User user){          log.info("进入post 方法.....");          System.out.println(user.toString());          return Result.success("hello world api post接口数据");      }  }

    5.测试类

    //注入使用  @Autowired  private RestTemplateToInterface restTemplateToInterface;    @Test  public void testSpringBootApi(){      Result result= restTemplateToInterface.doGetWith2("http://localhost:9092/api/getHello");      System.out.println("get结果:"+result);      User user = new User();      user.setUname("胡萝卜");      user.setRole("普通用户");      String s = restTemplateToInterface.doPostWith2("http://localhost:9092/api/postHello", user);      System.out.println("post结果:"+s);  }

    结果:

    以上就是关于“Java如何调用第三方接口”这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注高防服务器网行业资讯频道。

    [微信提示:高防服务器能助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。

    [图文来源于网络,不代表本站立场,如有侵权,请联系高防服务器网删除]
    [