Http接口调用示例教程详解编程语言

介绍HttpClient库的使用前,先介绍jdk里HttpURLConnection,因为HttpClient是开源的第三方库,使用方便,不过jdk里的都是比较基本的,有时候没有HttpClient的时候也可以使用jdk里的HttpURLConnection,HttpURLConnection都是调jdk java.net库的,下面给出实例代码:

import sun.misc.BASE64Encoder; 
import java.io.*; 
import java.net.HttpURLConnection; 
import java.net.URL; 
import java.net.URLConnection; 
 
public class Main { 
    public static void main(String[] args) throws Exception { 
        String url = "https://ocr-api.ccint.com/ocr_service?app_key=%s"; 
        String appKey = "xxxxxx"; // your app_key 
      String appSecret = "xxxxxx"; // your app_secret 
      url = String.format(url, appKey); 
        OutputStreamWriter out = null; 
        BufferedReader in = null; 
        String result = ""; 
        try { 
            String imgData = imageToBase64("example.jpg"); 
            String param="{/"app_secret/":/"%s/",/"image_data/":/"%s/"}"; 
            param=String.format(param,appSecret,imgData); 
            URL realUrl = new URL(url); 
            HttpURLConnection conn = (HttpURLConnection) realUrl.openConnection(); 
            conn.setRequestProperty("accept", "*/*"); 
            conn.setRequestProperty("connection", "Keep-Alive"); 
            conn.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)"); 
            conn.setDoOutput(true); 
            conn.setDoInput(true); 
            conn.setRequestMethod("POST"); // 设置请求方式 
            conn.setRequestProperty("Content-Type", "application/json"); // 设置发送数据的 
            conn.connect(); 
            out = new OutputStreamWriter(conn.getOutputStream(), "UTF-8"); 
            out.append(param); 
            out.flush(); 
            out.close(); 
            in = new BufferedReader(new InputStreamReader(conn.getInputStream())); 
            String line; 
            while ((line = in.readLine()) != null) { 
                result += line; 
            } 
        } catch (Exception e) { 
            System.out.println("发送 POST 请求出现异常!" + e); 
            e.printStackTrace(); 
        } 
        finally { 
            try { 
                if (out != null) { 
                    out.close(); 
                } 
                if (in != null) { 
                    in.close(); 
                } 
            } catch (IOException ex) { 
                ex.printStackTrace(); 
            } 
        } 
        System.out.println(result); 
    } 
    public static String imageToBase64(String path) 
    { 
        String imgFile = path; 
        InputStream in = null; 
        byte[] data = null; 
        try 
        { 
            in = new FileInputStream(imgFile); 
            data = new byte[in.available()]; 
            in.read(data); 
            in.close(); 
        } 
        catch (IOException e) 
        { 
            e.printStackTrace(); 
        } 
        BASE64Encoder encoder = new BASE64Encoder(); 
        return encoder.encode(data); 
    } 
} 

然后介绍一下HttpClient,只给出实例代码,不封装成工具类,因为理解基本用法后,自己封装工具类也是很容易的

HttpClient的GET请求

   CloseableHttpClient httpClient = HttpClients.createDefault(); 
    //https://github.com/search?utf8=%E2%9C%93&q=jeeplatform&type= 
    URIBuilder uriBuilder = new URIBuilder("https://github.com/search"); 
    uriBuilder.addParameter("q","jeeplatform"); 
    HttpGet httpGet = new HttpGet(uriBuilder.build()); 
    CloseableHttpResponse httpResponse = httpClient.execute(httpGet); 
    int statusCode = httpResponse.getStatusLine().getStatusCode(); 
    if(statusCode==200){ 
        HttpEntity entity = httpResponse.getEntity(); 
        System.out.println(EntityUtils.toString(entity,"UTF-8")); 
    } 
    httpClient.close(); 
    httpResponse.close();

HttpClient的POST请求,与GET请求类似

    CloseableHttpClient httpClient = HttpClients.createDefault(); 
    //https://www.sogou.com/sie?query=%E8%8A%B1%E5%8D%83%E9%AA%A8&hdq=AQ7CZ&ekv=3&ie=utf8& 
    String uri = "https://www.sogou.com/sie"; 
    List<NameValuePair> params= new ArrayList<NameValuePair>(); 
    params.add(new BasicNameValuePair("query","花千骨")); 
    StringEntity entity = new UrlEncodedFormEntity(params,"UTF-8"); 
    HttpPost httpPost = new HttpPost(uri); 
    httpPost.setEntity(entity); 
    CloseableHttpResponse httpResponse = httpClient.execute(httpPost); 
    int statusCode = httpResponse.getStatusLine().getStatusCode(); 
    if(statusCode == 200){ 
        System.out.println(EntityUtils.toString(httpResponse.getEntity())); 
    } 
    httpClient.close(); 
    httpResponse.close();

上面例子是可以支持访问签名要求没那么高的接口,然后访问自签名https的站点,那就要建立一个自定义的SSLContext对象,该对象要有可以存储信任密钥的容器,还要有判断当前连接是否受信任的策略,以及在SSL连接工厂中取消对所有主机名的验证,如果还是使用默认的HttpClient是会有下面的异常:

PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target

给出解决方法:

public static CloseableHttpClient getClient() { 
        RegistryBuilder<ConnectionSocketFactory> registryBuilder = RegistryBuilder.create(); 
        ConnectionSocketFactory plainSF = new PlainConnectionSocketFactory(); 
        registryBuilder.register("http", plainSF); 
        // 指定信任密钥存储对象和连接套接字工厂 
        try { 
            KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType()); 
            // 信任任何链接 
            TrustStrategy anyTrustStrategy = new TrustStrategy() { 
                @Override 
                public boolean isTrusted(X509Certificate[] x509Certificates, String s) throws CertificateException { 
                    return true; 
                } 
            }; 
            SSLContext sslContext = SSLContexts.custom().useTLS().loadTrustMaterial(trustStore, anyTrustStrategy).build(); 
            LayeredConnectionSocketFactory sslSF = new SSLConnectionSocketFactory(sslContext, SSLConnectionSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER); 
            registryBuilder.register("https", sslSF); 
        } catch (KeyStoreException e) { 
            throw new RuntimeException(e); 
        } catch (KeyManagementException e) { 
            throw new RuntimeException(e); 
        } catch (NoSuchAlgorithmException e) { 
            throw new RuntimeException(e); 
        } 
        Registry<ConnectionSocketFactory> registry = registryBuilder.build(); 
        // 设置连接管理器 
        PoolingHttpClientConnectionManager connManager = new PoolingHttpClientConnectionManager(registry); 
        RequestConfig requestConfig = RequestConfig.custom().setSocketTimeout(TIMEOUT_SECONDS * 1000).setConnectTimeout(TIMEOUT_SECONDS * 1000).build(); 
        return HttpClientBuilder.create().setConnectionManager(connManager).setMaxConnTotal(POOL_SIZE).setMaxConnPerRoute(POOL_SIZE).setDefaultRequestConfig(requestConfig).build(); 
    }

然后CloseableHttpClient httpClient = getClient()就可以

然后HttpClient语法相对比较繁杂?如果觉得比较麻烦,可以用Spring框架的RestTemplate,这里要创建一个自定义的bean,根据需要创建,代码示例:

//访问自签名https的要点 
HttpComponentsClientHttpRequestFactory requestFactory =  
                    new HttpComponentsClientHttpRequestFactory(HttpClientUtil.getClient()); 
         RestTemplate restTemplate = new RestTemplate(requestFactory);*/ 
          
             Bean result= restTemplate.getForObject(digitalgdOauthUrl, Bean.class);

原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/17032.html

(0)
上一篇 2021年7月19日
下一篇 2021年7月19日

相关推荐

发表回复

登录后才能评论