软件编程
位置:首页>> 软件编程>> java编程>> 实例详解Java调用第三方接口方法

实例详解Java调用第三方接口方法

作者:胡萝卜★  发布时间:2023-10-15 06:34:32 

标签: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接口数据");
   }
}

实例详解Java调用第三方接口方法

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);
   }

结果:

实例详解Java调用第三方接口方法

二、通过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);
   }

结果:

实例详解Java调用第三方接口方法

三、通过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 doGetWith1(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 doGetWith2(String url){
       Result result  = restTemplate.getForObject(url, Result.class);
       return result;
   }

/**
    * 以post方式请求第三方http接口 postForEntity
    * @param url
    * @param user
    * @return
    */
   public String doPostWith1(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 doPostWith2(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接口数据");
   }
}

实例详解Java调用第三方接口方法

5.测试类

//注入使用
@Autowired
private RestTemplateToInterface restTemplateToInterface;

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

结果:

实例详解Java调用第三方接口方法

总结 

来源:https://blog.csdn.net/qq_41128049/article/details/124400874

0
投稿

猜你喜欢

手机版 软件编程 asp之家 www.aspxhome.com