10,000 ワードの長い記事では、サードパーティ インターフェイス、RestTemplate、および urlConnection の使用方法が詳細に説明されており、Java コードはリクエストを送信する郵便配達員をシミュレートします。

ビジネス シナリオ: 日々の開発では、ロジスティクス インターフェイスの呼び出しなど、サードパーティのインターフェイスを呼び出す必要があることがよくあります。このとき、ポストマンをシミュレートしてリクエストを送信するために、urlConnection またはrestTemplate を使用する必要があります。リクエストはヘッダーの追加と設定をサポートしています。 content-type は json の受け渡しをサポートし、リクエスト メソッドは get、post ですが、ファイルまたはファイル ストリームを渡す必要がある場合もあります。

次の例には、日常の開発におけるリクエストのほとんどが含まれており、直接実行できます。役立つと思われる場合は、「いいね」を押して、迷子にならないように保存してください。

新しい springmvc プロジェクト、プロジェクト構造図を作成します

画像-20230616103929090

pomファイル

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <optional>true</optional>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-tomcat</artifactId>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>

    <dependency>
        <groupId>org.apache.httpcomponents</groupId>
        <artifactId>httpclient</artifactId>
        <version>4.5.7</version>
    </dependency>

    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>fastjson</artifactId>
        <version>1.2.68</version>
    </dependency>
</dependencies>

設定ファイル

server.port=8089
spring.servlet.multipart.max-file-size = 100MB
spring.servlet.multipart.max-request-size = 1000MB

ユーザークラス

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
    
    
    String name;
    int age;

    public User(String name) {
    
    
        this.name = name;
    }

    @Override
    public String toString() {
    
    
        return "User{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

UserControllerクラス

import com.alibaba.fastjson.JSON;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import java.util.LinkedHashMap;
import java.util.Map;
@RestController
@RequestMapping("/user")
public class UserController {
    
    

        @GetMapping("/loginGet")
        public String loginGet(String name,Integer age){
    
    
            System.out.println(name+""+age);
            User user=new User(name,age);
            return JSON.toJSONString(user);
        }

        @PostMapping("/login")
        public String login(User user){
    
    
            System.out.println(user);
            return JSON.toJSONString(user);
        }

        @PostMapping("/upload")
        public Map<String, String> login(User user, @RequestParam("file") MultipartFile file){
    
    
            System.out.println(user);
            System.out.println(file.getName());
            Map<String, String> fileMetadata = new LinkedHashMap<>();
            fileMetadata.put("文件名", file.getOriginalFilename());
            fileMetadata.put("文件类型", file.getContentType());
            fileMetadata.put("文件大小(byte)", String.valueOf(file.getSize()));
            return fileMetadata;
        }


        @PostMapping("/loginJson")
        public String loginJson(@RequestBody User user){
    
    
            System.out.println(user);
            return JSON.toJSONString(user);
        }
}

ポストモード x-www-form-urlencoded key-value は文字列のみです

画像-20230616105720200

対応するJavaコード

import lombok.extern.slf4j.Slf4j;
import org.apache.http.HttpEntity;
import org.apache.http.NameValuePair;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

/**
 * @ClassName JavaNice
 * post x-www-form-urlencoded  key-value只能是string
 **/
@Slf4j
public class PostUtils {
    
    
    private static final String ENCODING = "UTF-8";

    /**
     * post x-www-form-urlencoded  key-value只能是string*
     * @param url
     * @param paramsMap
     * @return
     */
    public static String sendPost(String url, Map<String, String> paramsMap) {
    
    
        CloseableHttpClient client = HttpClients.createDefault();
        String responseText = "";
        CloseableHttpResponse response = null;
        try {
    
    
            HttpPost method = new HttpPost(url);
            if (paramsMap != null) {
    
    
                List<NameValuePair> paramList = new ArrayList<NameValuePair>();
                for (Map.Entry<String, String> param : paramsMap.entrySet()) {
    
    
                    NameValuePair pair = new BasicNameValuePair(param.getKey(), param.getValue());
                    paramList.add(pair);
                }
                method.setEntity(new UrlEncodedFormEntity(paramList, ENCODING));
            }
            response = client.execute(method);
            HttpEntity entity = response.getEntity();
            if (entity != null) {
    
    
                responseText = EntityUtils.toString(entity);
            }
        } catch (Exception e) {
    
    
            log.error("http request failed",e);
        } finally {
    
    
            try {
    
    
                response.close();
            } catch (Exception e) {
    
    
                log.error("",e);
            }
        }
        return responseText;
    }
}

呼び出しコード

@Test
void postString() {
    
    
    //post x-www-form-urlencoded  key-value只能是string
    Map<String,String> user=new HashMap<>();
    user.put("name","javaNice");
    String json = JSONObject.toJSONString(user);
    Map<String,String> paramsMap = JSONObject.parseObject(json,Map.class);
    System.out.println(json);
    String resp = PostUtils.sendPost("http://localhost:8089/user/login",paramsMap);
    System.out.println(resp);
}

getメソッドで渡されるパラメータはURLに結合されます

画像-20230616110813390

パラメータ URL スプライシングを渡すポストメソッド

画像-20230616111016573

postモードで渡されるパラメータはjsonです

画像-20230616111100395

ツール

import com.alibaba.fastjson.JSONObject;
import org.springframework.util.StringUtils;

import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLConnection;
import java.net.URLEncoder;
import java.util.List;
import java.util.Map;

public class HttpRequestUtil {
    
    

    public static String sendGet(String url, String param) {
    
    
        String result = "";
        BufferedReader in = null;
        try {
    
    
            if (!url.contains("?")) {
    
    
                url += "?1=1";
            }
            if (!param.startsWith("&")) {
    
    
                url += "&";
            }
            String urlNameString = url + param;
            URL realUrl = new URL(urlNameString);
            // 打开和URL之间的连接
            URLConnection connection = realUrl.openConnection();
            // 设置通用的请求属性
            connection.setRequestProperty("accept", "*/*");
            connection.setRequestProperty("connection", "Keep-Alive");
            connection.setRequestProperty("user-agent",
                    "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
            // 建立实际的连接
            connection.connect();
            // 获取所有响应头字段
            Map<String, List<String>> map = connection.getHeaderFields();
            // 遍历所有的响应头字段
//            for (String key : map.keySet()) {
    
    
//                System.out.println(key + "--->" + map.get(key));
//            }
            // 定义 BufferedReader输入流来读取URL的响应
            in = new BufferedReader(new InputStreamReader(
                    connection.getInputStream()));
            String line;
            while ((line = in.readLine()) != null) {
    
    
                result += line;
            }
        } catch (Exception e) {
    
    
            System.out.println("发送GET请求出现异常!" + e);
            e.printStackTrace();
        }
        // 使用finally块来关闭输入流
        finally {
    
    
            try {
    
    
                if (in != null) {
    
    
                    in.close();
                }
            } catch (Exception e2) {
    
    
                e2.printStackTrace();
            }
        }
        return result;
    }


    public static String sendPost(String url, String param) {
    
    
        HttpURLConnection httpURLConnection = null;
        OutputStream out = null; //写
        InputStream in = null;   //读
        int responseCode = 0;    //远程主机响应的HTTP状态码
        String result = "";
        try {
    
    
            URL sendUrl = new URL(url);
            httpURLConnection = (HttpURLConnection) sendUrl.openConnection();
            //post方式请求
            httpURLConnection.setRequestMethod("POST");
            //一定要设置 Content-Type 要不然服务端接收不到参数
            httpURLConnection.setRequestProperty("Content-Type", "application/json");
            //指示应用程序要将数据写入URL连接,其值默认为false(是否传参)
            httpURLConnection.setDoOutput(true);
            //httpURLConnection.setDoInput(true);
            httpURLConnection.setUseCaches(false);
            httpURLConnection.setConnectTimeout(30000); //30秒连接超时
            httpURLConnection.setReadTimeout(30000);    //30秒读取超时
            //获取输出流
            out = httpURLConnection.getOutputStream();
            //输出流里写入POST参数
            out.write(param.getBytes());
            out.flush();
            out.close();
            responseCode = httpURLConnection.getResponseCode();
            BufferedReader br = new BufferedReader(new InputStreamReader(httpURLConnection.getInputStream(), "UTF-8"));
            result = br.readLine();
        } catch (Exception e) {
    
    
            e.printStackTrace();
        }
        return result;
    }

    public static String objectToUrlParam(Object object) {
    
    
        if (object != null) {
    
    
            StringBuilder builder = new StringBuilder();
//            JSONObject jsonObject = JSON.parseObject(JSON.toJSONString(object));
            Map<String, Object> map = JSONObject.parseObject(JSONObject.toJSONString(object), Map.class);
            for (Map.Entry<String, Object> entry :
                    map.entrySet()) {
    
    
                if (entry.getValue() != null && !StringUtils.isEmpty(entry.getValue().toString())) {
    
    
                    builder.append("&").append(entry.getKey()).append("=").append(encode(entry.getValue()));
                }
            }
            return builder.toString();
        }
        return "";
    }

    public static String encode(Object object) {
    
    
        if (object != null) {
    
    
            try {
    
    
                return URLEncoder.encode(object.toString(), "utf-8");
            } catch (UnsupportedEncodingException e) {
    
    
                e.printStackTrace();
                throw new RuntimeException("字符串编码失败");
            }
        }
        return "";
    }

}

呼び出しコード

@Test
void get() {
    
    
    //get 方式 传递参数拼接在url上
    User user=new User("javaNice",666);
    String paramsMap = HttpRequestUtil.objectToUrlParam(user);
    String resp = HttpRequestUtil.sendGet("http://localhost:8089/user/loginGet",paramsMap);
    System.out.println(resp);
}


@Test
void postUrl() {
    
    
    //post 方式 传递参数url拼接
    User user=new User("javaNice",666);
    String paramsMap = HttpRequestUtil.objectToUrlParam(user);
    System.out.println("传递参数"+paramsMap);
    String url="http://localhost:8089/user/login?1=1"+paramsMap;
    String resp = HttpRequestUtil.sendPost(url,"");
    System.out.println("返回参数"+resp);
}

@Test
void post() {
    
    
    //post 方式 传递参数为json
    User user=new User("javaNice",666);
    String paramsMap = JSON.toJSONString(user);
    System.out.println("传递参数"+paramsMap);
    String resp = HttpRequestUtil.sendPost("http://localhost:8089/user/loginJson",paramsMap);
    System.out.println("返回参数"+resp);
}

RestTemplate メソッド

postモードで渡されるパラメータはjsonです

画像-20230616111504260

@Test
void post() {
    
    
    //post 方式 传递参数为json
    RestTemplate restTemplate = new RestTemplate();
    String url = "http://localhost:8089/user/loginJson";
    User body = new User("javaNice", 666);
    User result = restTemplate.postForObject(url, body, User.class);
    System.out.println("返回参数" + result);
}

post メソッドはパラメータを form-data として渡し、ファイルを渡してリクエスト ヘッダーを追加します。

画像-20230616111929793

画像-20230616112027790

@Test
void postFormFile() {
    
    
    //post 方式 传递参数为form-data 并且传递文件
    RestTemplate restTemplate = new RestTemplate();
    String url = "http://localhost:8089/user/upload";
    //①:表单信息,需要放在MultiValueMap中,MultiValueMap相当于Map<String,List<String>>
    MultiValueMap<String, Object> body = new LinkedMultiValueMap<>();
    //调用add方法放入表单元素(表单名称:值)
    //②:文件对应的类型,需要是org.springframework.core.io.Resource类型的,常见的有[FileSystemResource、InputStreamResource、ByteArrayResource]
    body.add("file", new FileSystemResource("/java/com/example/springmvc/22c017e48ea445199708dc1d2832dae5.pdf"));
    body.add("name", "javaNice");
    body.add("age", "666");
    //③:头
    HttpHeaders headers = new HttpHeaders();
    headers.add("header1", "v1");
    headers.add("header2", "v2");
    //④:请求实体
    RequestEntity<MultiValueMap<String, Object>> requestEntity = new RequestEntity<>(body, headers, HttpMethod.POST, URI.create(url));
    //⑤:发送请求(请求实体,返回值需要转换的类型)
    ResponseEntity<Map<String, String>> responseEntity = restTemplate.exchange(
            requestEntity,
            new ParameterizedTypeReference<Map<String, String>>() {
    
    
            });
    Map<String, String> result = responseEntity.getBody();
    System.out.println(result);
}

post ストリーミング経由でファイルをアップロードする

画像-20230616111929793

画像-20230616112027790

@Test
void postFormFileStream() {
    
    
    RestTemplate restTemplate = new RestTemplate();
    String url = "http://localhost:8089/user/upload";
    //①:表单信息,需要放在MultiValueMap中,MultiValueMap相当于Map<String,List<String>>
    MultiValueMap<String, Object> body = new LinkedMultiValueMap<>();
    /**
     * ②:通过流的方式上传文件,流的方式需要用到InputStreamResource类,需要重写2个方法
     * getFilename:文件名称
     * contentLength:长度
     */
    File file = new File("/java/com/example/springmvc/22c017e48ea445199708dc1d2832dae5.pdf");
    //2、建立数据通道
    try {
    
    
        InputStream inputStream = new FileInputStream(file);

        InputStreamResource inputStreamResource = new InputStreamResource(inputStream) {
    
    
            @Override
            public String getFilename() {
    
    
                return "22c017e48ea445199708dc1d2832dae5.pdf";
            }

            @Override
            public long contentLength() throws IOException {
    
    
                return inputStream.available();
            }
        };
        body.add("file", inputStreamResource);
        body.add("name", "javaNice");
        body.add("age", "666");
        //③:头
        HttpHeaders headers = new HttpHeaders();
        headers.add("header1", "v1");
        headers.add("header2", "v2");
        //④:请求实体
        RequestEntity<MultiValueMap<String, Object>> requestEntity = new RequestEntity<>(body, headers, HttpMethod.POST, URI.create(url));
        //⑤:发送请求(请求实体,返回值需要转换的类型)
        ResponseEntity<Map<String, String>> responseEntity = restTemplate.exchange(
                requestEntity,
                new ParameterizedTypeReference<Map<String, String>>() {
    
    
                });
        Map<String, String> result = responseEntity.getBody();
        System.out.println(result);
    } catch (FileNotFoundException e) {
    
    
        e.printStackTrace();
    }
}

おすすめ

転載: blog.csdn.net/itScholar001/article/details/131243567