后端发送HTTP请求

news/2024/7/7 23:53:49

后端发送HTTP请求

1 原始方式

背景:
get:获取微信的accessToken
post:设置微信公众号的自定义菜单

1.1 get方式

//get方式发起请求
public String get(String url){
    try{
        URL urlObj = new URL(url);
        //开连接
        URLConnection connection = urlObj.openConnection();
        InputStream is = connection.getInputStream();
        byte[] b = new byte[1024];
        int len;
        StringBuilder stb = new StringBuilder();
        while((len=is.read(b)) != -1){
            stb.append(new String(b, 0, len));
        }
        return stb.toString();
    } catch (Exception e){
        e.printStackTrace();
    }
    return null;
}

1.2 post方式

//post方式发起请求,data是请求体
public static String post(String url, String data){
    try{
        URL urlObj = new URL(url);
        URLConnection connection = urlObj.openConnection();
        //要发送数据出去,必须要设置为可发送数据状态
        connection.setDoOutput(true);
        //获取输出流
        OutputStream os = connection.getOutputStream();
        //写出数据
        os.write(data.getBytes());
        os.close();
        //获取输入流
        InputStream is = connection.getInputStream();
        byte[] b = new byte[1024];
        int len;
        StringBuilder stb = new StringBuilder();
        while((len = is.read(b)) != -1){
            stb.append(new String(b, 0, len));
        }
        return stb.toString();
    } catch (Exception e){
        e.printStackTrace();
    }
    return null;
}

2 使用框架

2.1 使用OKHttp

导入依赖:

<dependency>
    <groupId>com.squareup.okhttp3</groupId>
    <artifactId>okhttp</artifactId>
    <version>3.8.0</version>
</dependency>

①通过get方式

public void OkHttpGet(String url) {
    OkHttpClient okHttpClient = new OkHttpClient();
    //不配url方法会报错,肯定要有访问地址的嘛
    //.Builder是Request内部类 .url()返回Builder .build()返回Request对象
    Request request = new Request.Builder()
            //.addHeader("a", "b")//.addHeader添加键值对header信息
            //.get()//可加可不加
            .url(url)
            .build();
    Call call = okHttpClient.newCall(request);
    try {
        Response response = call.execute();
        System.out.println(response.body().string());
        //http状态码
        System.out.println(response.code());
        //response的头信息
        System.out.println(response.headers().toString());
        //请求响应时间,收到时间减去发送的时间,单位毫秒
        System.out.println(response.receivedResponseAtMillis()-response.sentRequestAtMillis());
    } catch (IOException e) {
        e.printStackTrace();
    }
}

②通过post方式

public void OkHttpPost(String url){
     //ssl认证重写
    OkHttpClient okHttpClient=new OkHttpClient.Builder().hostnameVerifier(
            new HostnameVerifier() {
                @Override
                public boolean verify(String s, SSLSession sslSession) {
                    return true;
                }
            }
    ).build();
    RequestBody requestBody=new FormBody.Builder()
            .add("oldPassword","111111")
            .add("newPassword","111111")
            .build();

    Request request=new Request.Builder()
            .url(url)
            .post(requestBody)
            .addHeader("Cookie","JSESSIONID=299571E0E40DA6E9962E41B87A669BBB")
            .addHeader("content-type", "application/json")
            .addHeader("cache-control", "no-cache")
            .build();
    Call call=okHttpClient.newCall(request);

    try {
        Response response=call.execute();
        System.out.println(response.body().string());
    } catch (IOException e) {
        e.printStackTrace();
    }
}

2.2 封装OKHttp

import com.alibaba.fastjson.JSON;
import lombok.extern.slf4j.Slf4j;
import okhttp3.*;
import okio.BufferedSink;
import okio.Okio;
import java.io.File;
import java.util.HashMap;
import java.util.Map;

@Slf4j
public class OkHttpUtil {

    /**
     * Get请求
     * @param url   URL地址
     * @return  返回结果
     */
    public static String get(String url){
        String result=null;
        try {
            OkHttpClient okHttpClient=new OkHttpClient();
            Request request = new Request.Builder().url(url).build();
            Response response = okHttpClient.newCall(request).execute();
            result=response.body().string();
            log.info("Get请求返回:{}",result);
            return result;
        }catch (Exception e){
            log.error("OkHttp[Get]请求异常",e);
            return result;
        }
    }

    /**
     * Post请求
     * @param url       URL地址
     * @param params    参数
     * @return  返回结果
     */
    public static String post(String url,Map<String,String> params){
        String result=null;
        if (params==null){
            params=new HashMap<String, String>();
        }
        try {
            OkHttpClient okHttpClient=new OkHttpClient();
            FormBody.Builder formBodyBuilder = new FormBody.Builder();
            //添加参数
            log.info("params:{}", JSON.toJSONString(params));
            for (Map.Entry<String,String> map:params.entrySet()){
                String key=map.getKey();
                String value;
                if (map.getValue()==null){
                    value="";
                }else{
                    value=map.getValue();
                }
                formBodyBuilder.add(key,value);
            }
            FormBody formBody =formBodyBuilder.build();
            Request request = new Request.Builder().url(url).post(formBody).build();
            Response response = okHttpClient.newCall(request).execute();
            result=response.body().string();
            log.info("Post请求返回:{}",result);
            return result;
        }catch (Exception e){
            log.error("OkHttp[Post]请求异常",e);
            return result;
        }
    }

    /**
     * 上传文件请求(Post请求)
     * @param url       URL地址
     * @param params    文件 key:参数名 value:文件 (可以多文件)
     * @return  返回结果
     */
    public static String upload(String url, Map<String, File> params){
        String result=null;
        try {
            OkHttpClient okHttpClient=new OkHttpClient();
            MultipartBody.Builder multipartBodyBuilder =new MultipartBody.Builder().setType(MultipartBody.FORM);

            for (Map.Entry<String,File> map:params.entrySet()){
                String key=map.getKey();
                File file=map.getValue();
                if (file==null||(file.exists() && file.length() == 0)){
                    continue;
                }
                multipartBodyBuilder.addFormDataPart(key,file.getName(),RequestBody.create(MediaType.parse("multipart/form-data"), file));
            }
            RequestBody requestBody =multipartBodyBuilder.build();
            Request request = new Request.Builder().url(url).post(requestBody).build();
            Response response = okHttpClient.newCall(request).execute();
            result=response.body().string();
            log.info("Upload请求返回:{}",result);
            return result;
        }catch (Exception e){
            log.error("OkHttp[Upload]请求异常",e);
            return result;
        }
    }

    /**
     * 下载文件请求(Get请求)
     * @param url       URL地址
     * @param savePath  保存路径(包括文件名)
     * @return  文件保存路径
     */
    public static String download(String url,String savePath){
        String result=null;
        try {
            OkHttpClient okHttpClient=new OkHttpClient();
            Request request = new Request.Builder().url(url).build();
            Response response = okHttpClient.newCall(request).execute();
            File file=new File(savePath);
            if (!file.getParentFile().exists()){
                file.getParentFile().mkdirs();
            }
            BufferedSink sink =Okio.buffer((Okio.sink(file)));
            sink.writeAll(response.body().source());
            sink.flush();
            sink.close();
            result=savePath;
            log.info("Download请求返回:{}",result);
            return result;
        }catch (Exception e){
            log.error("OkHttp[Download]请求异常",e);
            return result;
        }
    }

}

2.3 OKHttp的post方式详解

①基本的post请求,包含参数

/**
  * post请求的body中带有参数
  */
 @Test
 public void postWithBody() throws IOException {
     //构建请求的body
     RequestBody body = new FormBody.Builder()
             .add("username", "zhangsan")
             .add("password", "123456")
             .build();

     //构建请求
     Request request = new Request.Builder()
             .url(base_url + "testOkHttpByPost")
             .post(body)
             .build();
     Call call = client.newCall(request);
     Response response = call.execute();
     Assert.assertEquals(response.code(), 200);
 }
//post请求的body中带有参数
@PostMapping("/testOkHttpByPost")
public void testOkHttpByPost(HttpServletRequest request) {
    Map<String, String[]> parameterMap = request.getParameterMap();
    for (Map.Entry<String, String[]> entry : parameterMap.entrySet()) {
        System.out.println(entry.getKey());
        String[] value = entry.getValue();
        System.out.println(Arrays.toString(value));
    }
}

②post请求带有授权

/**
 * post请求带有授权的
 */
@Test
public void postWithAuth() throws IOException {
    String postBody = "test post auth";
    Request request = new Request.Builder()
            .url(base_url + "testOkHttpByAuth")
            .addHeader("Authorization", "Messi")
            .post(RequestBody.create(
                    MediaType.parse("text/x-markdown"), postBody))
            .build();
    Call call = client.newCall(request);
    Response response = call.execute();
    Assert.assertEquals(response.code(), 200);
}
//post请求中带有身份验证
@PostMapping("/testOkHttpByAuth")
public void testOkHttpByAuth(HttpServletRequest request, @RequestBody String text){
    String authorization = request.getHeader("Authorization");
    if("Messi".equals(authorization)){
        System.out.println("success...");
    }else {
        System.out.println("fail....");
    }
    System.out.println(text);//test post auth
}

③post请求中带有json数据

 /**
  * post向请求体中发送json数据
  */
 @Test
 public void postByJson() throws IOException {
     String json = "{\n" +
             "    \"username\":\"laowang\",\n" +
             "    \"age\":18\n" +
             "}";
     //为了在请求体中发送json,需要设置媒体类型为application/json
     RequestBody body = RequestBody.create(
             MediaType.parse("application/json"),json);
     Request request = new Request.Builder()
             .url(base_url + "/postByJson")
             .post(body)
             .build();
     Call call = client.newCall(request);
     Response response = call.execute();
     Assert.assertEquals(response.code(), 200);
 }
//post请求体带有json数据
@PostMapping("/postByJson")
public void testOkHttpByJson(@RequestBody String json){
    System.out.println(json);
}

④发送Multipart post

/**
 * 发送 Multipart post请求
 */
@Test
public void postByMultipart() throws IOException {
    RequestBody body = new MultipartBody.Builder()
            .setType(MultipartBody.FORM)
            .addFormDataPart("username", "wangchen")
            .addFormDataPart("password", "123456")
            .addFormDataPart("file", "file.txt",
                    RequestBody.create(MediaType.parse("application/octet-stream"),
                            new File("src/main/resources/text.txt")))
            .build();

    Request request = new Request.Builder()
            .url(base_url + "/postMultipart")
            .post(body)
            .build();

    Call call = client.newCall(request);
    Response response = call.execute();
    Assert.assertEquals(response.code(), 200);
}
//发送Multipart post
@PostMapping("/postMultipart")
public void testOkHttpMultipart(String username, String password, MultipartFile file){
    System.out.println(username);
    System.out.println(password);
    String originalFilename = file.getOriginalFilename();
    System.out.println(originalFilename);
}

⑤修改编码格式

 //通过其他方式编码
 //如果我们想使用其他字符编码,我们可以将其作为 MediaType.parse () 的第二个参数传入:
 @Test
 public void postByOtherEncoding(){
     String json = "{\n" +
             "    \"username\":\"laowang\",\n" +
             "    \"age\":18\n" +
             "}";
     RequestBody body = RequestBody.create(
             MediaType.parse("application/json;charset=utf-16"), json);

     String charset = body.contentType().charset().displayName();
     Assert.assertEquals(charset, "UTF-16");
 }

2.4 OKHttp发起同步异步请求

2.4.1 同步发送get请求
 /**
  * get请求【同步方式】
  * @param url
  * @return
  */
 public static Response getWithNoParam(String url){
     Response result = null;
     try{
         //设置5s超时
         OkHttpClient client = new OkHttpClient.Builder().readTimeout(5, TimeUnit.SECONDS).build();
         //请求
         Request request = new Request.Builder().url(url).build();
         System.out.println("request.headers() = " + request.headers().toString());
         System.out.println(">>>>>>>>>>>" + request.headers().get("Host"));
         //响应
         Response response = client.newCall(request).execute();
         //获取响应体内容
         result = response;
         return result;
     } catch (Exception e){
         log.error("get请求异常:{}", e);
         return result;
     }
 }




/**
 * 同步发送get请求【添加参数】
 * @param url
 * @param paramMap
 * @return
 */
public static Response getWithParams(String url, Map<String, String> paramMap){
    Request.Builder requestBuilder = new Request.Builder();
    HttpUrl.Builder urlBuilder = HttpUrl.parse(url).newBuilder();
    String key = "";
    String value = "";
    for(Map.Entry<String, String> entry : paramMap.entrySet()){
        key = entry.getKey();
        value = entry.getValue();
        urlBuilder.addQueryParameter(key, value);
    }
    requestBuilder.url(urlBuilder.build());
    Request request = requestBuilder.build();
    OkHttpClient client = new OkHttpClient.Builder().readTimeout(5, TimeUnit.SECONDS).build();
    Call call = client.newCall(request);
    Response response = null;
    try {
        response = call.execute();
    } catch (IOException e) {
        e.printStackTrace();
    }
    return response;
}

2.4.2 异步发送get请求

/**
 * 异步发起get请求
 * @param url
 */
public static void getByAsync(String url){
    OkHttpClient client = new OkHttpClient.Builder().readTimeout(5, TimeUnit.SECONDS).build();
    Request request = new Request.Builder().url(url).get().build();
    Call call = client.newCall(request);
    call.enqueue(new Callback() {
        @Override
        public void onFailure(Call call, IOException e) {
            //请求失败之后所作操作...
            System.out.println("fail.....");
        }

        @Override
        public void onResponse(Call call, Response response) throws IOException {
            //请求成功之后所做操作....异步请求成功之后的回调,例如:txtView.setText(response.body().string ());
            System.out.println(response.body().string());
        }
    });
}

参考文章:
https://www.jianshu.com/p/7342b7a35ffc
https://www.jianshu.com/p/4a3c585a99f4
使用OkHttp发送POST请求


http://lihuaxi.xjx100.cn/news/88144.html

相关文章

C# 多线程九 任务Task的简单理解与运用三

目录 方法&#xff1a; ConfigureAwait(Boolean) ContinueWith Delay Dispose() Dispose(Boolean) 说明: FromCanceled(CancellationToken) FromCanceled(CancellationToken) FromResult(TResult) FromException(Exception) FromException(Except…

神经网络识别仿真实验,神经网络算法实验报告

1、关于GAN生成式对抗网络中判别器的输出的问题 ... 摘要 生成式对抗网络GAN&#xff08;Generative adversarial networks&#xff09;目前已经成为人工智能学界一个热门的研究方向.GAN的基本思想源自博弈论的二人零和博弈&#xff0c;由一个生成器和一个判别器构成&#xff…

RN基础组件3 —— Image 和ImageBackground

import {Image} from react-native <Image source{}/> 说明&#xff1a; ①RN中加载图片有两种情形&#xff1a; 情形1&#xff1a;加载一张本地(手机App中)图片 —— 必须使用“导入”把图片从PC机打包入手机中 const p1 require(./img/1.jpg) //把图片打包入手机…

深入浅出贪心算法

前言 到目前为止学了数组、链表两类物理数据结构&#xff0c;和栈、队列两类线性逻辑结构&#xff0c;以及树&#xff08;二叉树、二叉查找树、红黑树&#xff09;、图非线性数据结构&#xff0c;以及基于这些数据结构的二分查找、DFS/BFS、递归、排序等算法。 接下来会学习贪…

Java面试80%的人都会踩的坑,你知道几种?

最近很多朋友跟我吐槽&#xff0c;Java面试时遇到的问题&#xff0c;我选了几个经典的问题列举出来&#xff0c;顺便和大家聊一下我的看法&#xff1a; 问题展示 Java技术能力自以为还不错&#xff0c;但是到了面试的时候就凉凉&#xff1b; 对面试官提出的问题感觉很懵&…

韩国WA15-6819B高性能DSP数字功放芯片

WA15-6819B全数字音频包括立体声功率级芯片&#xff1b;采用拓扑结构电路&#xff1b;内置多重保护机制&#xff1b;音质饱满细腻&#xff1b;加入了ASRC&#xff08;异步采样率转化&#xff09;的功能&#xff0c;使得输入IIS的采样频率可从8kHz到192kHz自由无差别变化&#x…

【图像分割】基于改进的主动轮廓模型实现图像分割附matlab代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;修心和技术同步精进&#xff0c;matlab项目合作可私信。 &#x1f34e;个人主页&#xff1a;Matlab科研工作室 &#x1f34a;个人信条&#xff1a;格物致知。 更多Matlab仿真内容点击&#x1f447; 智能优化算法 …

刚入行的自媒体短视频创作者必须要了解的基础知识汇总-第一季

刚入行的自媒体短视频创作者必须要了解的基础知识汇总-第一季 大家好&#xff0c;我是我赢助手&#xff0c;专注于自媒体短视频去水印、去重和文案提取运营&#xff01; 我是自媒体行业的新手小白&#xff0c;很多的人问我关于短视频的问题&#xff0c;我也会一一给大家解答&…