HttpURLConnection 学习笔记 - 百度内容审核-图像

Posted 笑虾

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HttpURLConnection 学习笔记 - 百度内容审核-图像相关的知识,希望对你有一定的参考价值。

HttpURLConnection 学习笔记 - 百度内容审核-图像

用到 百度内容审核-图像
看了官方的工作包中使用HttpURLConnection请求,封装好的工具类用习惯了,很少看里面,撞上了就学习一下吧。

代码

1. 官方的例子

官方例子中还提供了几个工具类,比如HttpUtil封装好的。可以直接用。

package com.baidu.ai.aip;

import com.baidu.ai.aip.utils.Base64Util;
import com.baidu.ai.aip.utils.FileUtil;
import com.baidu.ai.aip.utils.HttpUtil;
import java.net.URLEncoder;

/**
* 图像审核接口
*/
public class ImgCensor {

    /**
    * 重要提示代码中所需工具类
    * FileUtil,Base64Util,HttpUtil,GsonUtils请从
    * https://ai.baidu.com/file/658A35ABAB2D404FBF903F64D47C1F72
    * https://ai.baidu.com/file/C8D81F3301E24D2892968F09AE1AD6E2
    * https://ai.baidu.com/file/544D677F5D4E4F17B4122FBD60DB82B3
    * https://ai.baidu.com/file/470B3ACCA3FE43788B5A963BF0B625F3
    * 下载
    */
    public static String ImgCensor() {
        // 请求url
        String url = "https://aip.baidubce.com/rest/2.0/solution/v1/img_censor/v2/user_defined";
        try {
            // 本地文件路径
            String filePath = "[本地文件路径]";
            byte[] imgData = FileUtil.readFileByBytes(filePath);
            String imgStr = Base64Util.encode(imgData);
            String imgParam = URLEncoder.encode(imgStr, "UTF-8");

            String param = "image=" + imgParam;

            // 注意这里仅为了简化编码每一次请求都去获取access_token,线上环境access_token有过期时间, 客户端可自行缓存,过期后重新获取。
            String accessToken = "[调用鉴权接口获取的token]";

            String result = HttpUtil.post(url, accessToken, param);
            System.out.println(result);
            return result;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

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

2. 自己的学习代码

虽然官方提供了封装好的工具类,但是自己学习,还是敲一遍的好。

package com.jerry.utils;

import net.sf.json.JSONObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.*;
import java.net.*;

/**
 * @author jerryjin
 * @Classname HttpUtil
 * @Date 2021-07-23 14:18
 */
public class HttpUtil {
    public static Logger log = LoggerFactory.getLogger(HttpUtil.class);

    /**
     * POST请求
     * @param url		请求地址
     * @param params	参数字符串: a=1&b=2&c=3
     * @return
     */
    public static String doPost(String url, String params) {
        
        HttpURLConnection connection = null;
        OutputStream outputStream = null;
        InputStream inputStream = null; // 请求返回的数据流
        BufferedReader reader = null;

        try {
            URL _url = new URL(url);
            connection = (HttpURLConnection) _url.openConnection();
            // 设置请求方式主POST,默认 GET
            connection.setRequestMethod("POST");
            // 设置连接超时时间为5秒
            connection.setConnectTimeout(5000);
            // 设置读取超时时间为5秒
            connection.setReadTimeout(5000);
            // POST请求需要开启输出流,以便将请求参数写入请求体body。开启后方能使用 getOutputStream();默认false
            connection.setDoOutput(true);
            // 从连接读入,可获得请求返回内容。开启后方能使用 getInputStream();默认true
            // connection.setDoInput(true);

            // 设置Header
            connection.setRequestProperty("Content-type", "application/x-www-form-urlencoded");
            // connection.setRequestProperty("user-agent", "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (Khtml, like Gecko) Chrome/51.0.2704.7 Safari/537.36");

            // 如果有传参
            if(null != params) {
                // 获取请求的输出流
                outputStream = connection.getOutputStream();
                // 向请求地址写参数
                outputStream.write(params.getBytes());
                outputStream.flush();
            }

            // connection.connect(); // getResponseCode、getOutputStream、getInputStream 都会隐式调用它
            // 判断请求Url是否成功
            if (connection.getResponseCode() != 200) {
                throw new RuntimeException("url请求失败");
            }

            // 获取返回
            inputStream = connection.getInputStream();
            reader = new BufferedReader(new InputStreamReader(inputStream,"UTF-8"));
            String line;
            StringBuilder sb = new StringBuilder();
            while ((line = reader.readLine()) != null) {
                sb.append(line);
            }
            return sb.toString();
            
        } catch (UnsupportedEncodingException e) {
            log.error(e.getMessage());
        } catch (ProtocolException e) {
            log.error(e.getMessage());
        } catch (MalformedURLException e) {
            log.error(e.getMessage());
        } catch (Exception e) {
            log.error(e.getMessage());
        } finally {
            try {
                outputStream.close(); // 关闭输出流
                inputStream.close(); // 关闭输入流
                reader.close(); // 关闭输入流
                connection.disconnect(); // 断开连接
            } catch (IOException e) {
                log.error(e.getMessage());
            }
        }
        return null;
    }

    public static void main(String[] args) throws Exception {
        String url = "https://aip.baidubce.com/rest/2.0/solution/v1/img_censor/v2/user_defined";
        String access_token = "24.cd257ec6609688766241ced6fa767cbd.2592000.1629539906.282335-24583045";
        String image = "略";
        String imgUrl = "http://5b0988e595225.cdn.sohucs.com/images/20171213/c9d1d48cfe454d108920f55e53ec2c2d.jpeg";

        // 上传
        // File file = new File("D:\\\\baidu_test_img_1.jpg");
        // byte[] bytes = Files.readAllBytes(file.toPath());
        // String image = Base64.getEncoder().encodeToString(bytes);

        JSONObject jsonObject = new JSONObject();
        jsonObject.put("access_token", access_token);
        jsonObject.put("image", URLEncoder.encode(image,"UTF-8")); // 因为是 application/x-www-form-urlencoded 所以先转码
        // jsonObject.put("imgUrl", imgUrl);
        String params = jsonObject.toString()
                .replace("\\":\\"","=")
                .replace("\\",\\"","&")
                .replace("{\\"","")
                .replace("\\"}","");
        System.out.println(params);

        String result = HttpUtil.doPost(url, params);
        System.out.println(result);
    }
}

参考资料

百度内容审核-图像
HttpURLConnection与HttpClient比较和使用示例

以上是关于HttpURLConnection 学习笔记 - 百度内容审核-图像的主要内容,如果未能解决你的问题,请参考以下文章

Android学习笔记--使用HttpURLConnection实现网络下载效果,附带进度条显示

Android学习笔记--Http协议

java调用Http请求 -HttpURLConnection学习

(转)HttpURLConnection与 HttpClient 区别

HttpURLConnection与HttpClient随笔

Android探索之HttpURLConnection网络请求