http发送post请求

post请求类似form表单提交

该文章只用于java后端通过http方式模拟页面提交form的数据的请求,post请求包含普通文本和文件上传一起请求的方法:

import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLConnection;
import java.nio.charset.StandardCharsets;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
 * 调用外部接口
 *
 * @author wanghui
 */
public class HttpUtil
{
      /**
     * 发送form表单并包含文件
     * @param url  请求的url
     * @param textMap  form表单的参数(字符串类型)
     * @return fileMap 文件
     */
    public static String sendPostForm(String url, Map<String, Object> textMap, Map<String, File> fileMap) {
        HttpURLConnection connection = null;
        InputStream is = null;
        OutputStream os = null;
        BufferedReader br = null;
        String result = "{\"flag\":\"0\",\"message\":\"系统异常\"}";;
        try {
            URL realUrl = new URL(url);
            // 通过远程url连接对象打开连接
            connection = (HttpURLConnection) realUrl.openConnection();
            // 设置连接请求方式
            connection.setRequestMethod("POST");
            // 设置连接主机服务器超时时间:15000毫秒
//            connection.setConnectTimeout(15000);
            // 设置读取主机服务器返回数据超时时间:60000毫秒
//            connection.setReadTimeout(60000);

            // 默认值为:false,当向远程服务器传送数据/写数据时,需要设置为true
            connection.setDoOutput(true);
            // 默认值为:true,当前向远程服务读取数据时,设置为true,该参数可有可无
            connection.setDoInput(true);
            // 设置通用的请求属性
            connection.setRequestProperty("accept", "*/*");
            connection.setRequestProperty("connection", "Keep-Alive");
            connection.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
            // boundary就是request头和上传文件内容的分隔符
            String boundary = "---------------------------123821742118716";
            // 设置传入参数的格式:请求参数应该是 name1=value1&name2=value2 的形式。
            connection.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + boundary);
            // 通过连接对象获取一个输出流
            os = connection.getOutputStream();
            OutputStream out = new DataOutputStream(os);
            if(textMap != null){
                StringBuffer strBuf = new StringBuffer();
                for(Map.Entry<String, Object> m : textMap.entrySet()){
                    strBuf.append("\r\n").append("--").append(boundary).append("\r\n");
                    strBuf.append("Content-Disposition: form-data; name=\"");
                    strBuf.append(m.getKey());
                    strBuf.append("\"\r\n\r\n");
                    strBuf.append(m.getValue());
                }
                out.write(strBuf.toString().getBytes());
            }
            if(fileMap != null){
                for(Map.Entry<String, File> m : fileMap.entrySet()){
                    File gridFile = m.getValue();
                    if(gridFile == null){
                        continue;
                    }
                    String fileType = gridFile.getName().split("\\.")[1];
                    //文件类型默认为application/octet-stream
                    String contentType = "application/octet-stream";
                    if(fileType != null && !"".equals(fileType)){
                        switch (fileType){
                            case "png" :
                                contentType = "image/png";
                                break;
                            case "jpg" :
                                contentType = "image/jpeg";
                                break;
                            case "jpeg" :
                                contentType = "image/jpeg";
                                break;
                            case "jpe" :
                                contentType = "image/jpeg";
                                break;
                            case "gif" :
                                contentType = "image/gif";
                                break;
                            default:
                                contentType = "image/image/x-icon";
                                break;
                        }
                    }
                    StringBuffer sb = new StringBuffer();
                    sb.append("\r\n").append("--").append(boundary).append("\r\n");
                    sb.append("Content-Disposition: form-data; name=\"");
                    sb.append(m.getKey());
                    sb.append("\"; filename=\"");
                    sb.append(gridFile.getName());
                    sb.append("\"\r\n");
                    sb.append("Content-Type:");
                    sb.append(contentType);
                    sb.append("\r\n\r\n");
                    out.write(sb.toString().getBytes());
                    InputStream inputStream = new FileInputStream(gridFile);
                    int ch;
                    while ((ch = inputStream.read()) != -1) {
                        out.write(ch);
                    }
                }
            }

            byte[] endData = ("\r\n--" + boundary + "--\r\n").getBytes();
            out.write(endData);
            out.flush();
            out.close();
            // 通过连接对象获取一个输入流,向远程读取
            if (connection.getResponseCode() == 200) {
                is = connection.getInputStream();
                // 对输入流对象进行包装:charset根据工作项目组的要求来设置
                br = new BufferedReader(new InputStreamReader(is, "UTF-8"));

                StringBuffer sbf = new StringBuffer();
                String temp = null;
                // 循环遍历一行一行读取数据
                while ((temp = br.readLine()) != null) {
                    sbf.append(temp);
                    sbf.append("\r\n");
                }
                result = sbf.toString();
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            // 关闭资源
            if (null != br) {
                try {
                    br.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (null != os) {
                try {
                    os.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (null != is) {
                try {
                    is.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            // 断开与远程地址url的连接
            connection.disconnect();
        }
        return result;
    }

    public static void main(String[] args) throws Exception
    {
        Map<String, Object> textMap = new HashMap<>();
        textMap.put("code", 1);
        File file = new File("C:\\Users\\issuser\\Desktop\\新建 PPT 演示文稿.pdf");
        Map<String, File> fileMap = new HashMap<String, File>();
        fileMap.put("file", file);
        sendPostForm("http://127.0.0.1:9091/api/file/uploadFile", textMap, fileMap);
    }
}

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletRequest;

/**
 * 文件上传下载控制器

 */
@Controller
@RequestMapping("/api/file")
@Api(value = "CommonFileController", tags = "文件上传下载控制器")
public class CommonFileController
{
    /**
     * 文件上传
     * @param file 文件
     * @return 操作结果
     */
    @PostMapping("/uploadFile")
    @ResponseBody
    public void uploadFile(@RequestParam MultipartFile file, @RequestParam Integer code)
    {
    	//这里就不做处理,自己自行操作就行了
    }
}



实现方式如postman的截图效果一样:

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值