1、直接上代码
package com.day.controller;
import org.apache.commons.codec.binary.Base64;
import org.apache.commons.codec.digest.DigestUtils;
import java.io.*;
import java.net.URL;
import java.net.URLConnection;
/**
* 1.年龄识别
* 2.如果是一个restful接口(json格式),一般将Content-Type设置为application/json; charset=UTF-8
* 3.如果是文件上传, 一般Content-Type设置为multipart/form-data
* 4.如果普通表单提交,一般Content-Type设置为application/x-www-form-urlencoded; charset=UTF-8
*/
public class HelloPost {
public static String url="http://tupapi.xfyun.cn/v1/age";
public static String APPID = "";
public static String APIKey = "";
public static String IMAGE_NAME="src/main/resources/static/1.jpg";
public static String IMAGE_PATH="src/main/resources/static/1.jpg";
public static String XCurTime=System.currentTimeMillis() / 1000L + "";
public static String myParam = "{\"image_name\":\"" + IMAGE_NAME + "\"}";
public static String checkSum;
static {
try {
checkSum = DigestUtils.md5Hex(APIKey + XCurTime
+ new String(Base64.encodeBase64(myParam.getBytes("UTF-8"))));
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}
/**主函数*/
public static void main(String args[]){
String result=sendPost(url,"&key=1&secret=2");
System.out.println("调用结果 ==》"+result);
}
public static String sendPost(String url, String params) {
PrintWriter printWriter = null;
BufferedReader bufferedReader = null;
String result = "";
try {
URL realUrl = new URL(url);
// 打开和URL之间的连接
URLConnection myURLConnection = realUrl.openConnection();
//设置通用的请求属性(Header里的参数)
myURLConnection.setRequestProperty("accept", "*/*");
myURLConnection.setRequestProperty("connection", "Keep-Alive");
myURLConnection.setRequestProperty("user-agent",
"Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
/**1.浏览器的原生form表单,一般用于表单提交
* 2.在 Http Request Header 中配置以下参数*/
myURLConnection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded; charset=utf-8");
myURLConnection.setRequestProperty("X-Appid",APPID);
myURLConnection.setRequestProperty("X-CurTime",XCurTime);
myURLConnection.setRequestProperty("X-Param",new String(Base64.encodeBase64(myParam.getBytes("UTF-8"))));
myURLConnection.setRequestProperty("X-CheckSum",checkSum);
// 发送POST请求必须设置如下两行
myURLConnection.setDoOutput(true);
myURLConnection.setDoInput(true);
/**1.printWriter:我们一般用来传的是对像
* 2.而outputStream用来传的是二进制,故上传文件时,一定要使用此。
* 3.将图片的二进制数据写入 Http Request Body 中*/
//获取URLConnection对象对应的输出流 发送图片数据
OutputStream outputStream = myURLConnection.getOutputStream();
byte[] imageByteArray=read(IMAGE_PATH);
outputStream.write(imageByteArray);
// 获取URLConnection对象对应的输出流 发送参数对象
printWriter = new PrintWriter(outputStream);
// 发送请求参数
printWriter.print(params);
// flush输出流的缓冲
printWriter.flush();
printWriter.close();
outputStream.flush();
outputStream.close();
// 定义BufferedReader输入流来读取URL的响应
bufferedReader = new BufferedReader(
new InputStreamReader(myURLConnection.getInputStream()));
String line;
while ((line = bufferedReader.readLine()) != null) {
result += line;
}
}catch (Exception e) {
System.out.println("发送 POST 请求出现异常!"+e);
e.printStackTrace();
}finally{//使用finally块来关闭输出流、输入流
try{
if(printWriter!=null){
printWriter.close();
}
if(bufferedReader!=null){
bufferedReader.close();
}
}catch(Exception ex){
ex.printStackTrace();
}
}
return result;
}
/**读取图片或音频文件*/
public static byte[] read(String filePath) throws IOException {
InputStream inputStream = new FileInputStream(filePath);
byte[] data = inputStream2ByteArray(inputStream);
inputStream.close();
return data;
}
private static byte[] inputStream2ByteArray(InputStream inputStream) throws IOException {
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
byte[] buffer = new byte[1024 * 4];
int n = 0;
while ((n = inputStream.read(buffer)) != -1) {
byteArrayOutputStream.write(buffer, 0, n);
}
return byteArrayOutputStream.toByteArray();
}
/**判断文件是否是以二进制流存储的*/
public static boolean isBinary(File file) {
boolean isBinaryFlag = false;
FileInputStream fileInputStream=null;
try {
fileInputStream = new FileInputStream(file);
long len = file.length();
for (int j = 0; j < (int) len; j++) {
int t = fileInputStream.read();
if (t < 32 && t != 9 && t != 10 && t != 13) {
isBinaryFlag = true;
break;
}
}
} catch (Exception e) {
e.printStackTrace();
}finally {
try{
fileInputStream.close();
}catch (Exception e){
e.printStackTrace();
}
}
return isBinaryFlag;
}
}