使用HttpURLConnection发送POST请求并携带请求参数-程序员宅基地

技术标签: spring  spring boot  java  intellij-idea  


1、先创建URL对象,指定请求的URL地址。

URL url = new URL("http://example.com/api");

2、调用URL对象的openConnection()方法创建HttpURLConnection对象。

HttpURLConnection connection = (HttpURLConnection) url.openConnection();

3、设置请求方法为POST。

connection.setRequestMethod("POST");

4、设置请求头,包括Content-Type、Content-Length等。其中Content-Type表示请求体的格式,Content-Length表示请求体的长度。

connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
connection.setRequestProperty("Content-Length", String.valueOf(param.getBytes().length));

5、设置连接超时和读取超时时间。

connection.setConnectTimeout(5000);
connection.setReadTimeout(5000);

6、允许向服务器写入写出数据。

connection.setDoOutput(true);

connection.setDoInput(true);

7、获取输出流,向服务器写入数据。

OutputStream outputStream = connection.getOutputStream();
outputStream.write(param.getBytes());
outputStream.flush();
outputStream.close();


这里的param是请求参数,需要将其转换为字节数组后写入输出流。

8、获取响应码,判断请求是否成功。

int statusCode = connection.getResponseCode();

9、读取响应数据。

InputStream inputStream = statusCode == 200 ? connection.getInputStream() : connection.getErrorStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
StringBuilder response = new StringBuilder();
String line;
while ((line = reader.readLine()) != null) {
    response.append(line);
}
reader.close();
inputStream.close();


这里的response是响应数据,需要将其读取为字符串后使用。
完整的示例代码如下所示:

String param = "name=张三&age=18";
URL url = new URL("http://example.com/api");
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("POST");
connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
connection.setRequestProperty("Content-Length", String.valueOf(param.getBytes().length));
connection.setConnectTimeout(5000);
connection.setReadTimeout(5000);
connection.setDoOutput(true);
OutputStream outputStream = connection.getOutputStream();
outputStream.write(param.getBytes());
outputStream.flush();
outputStream.close();
int statusCode = connection.getResponseCode();

InputStream inputStream = statusCode == 200 ? connection.getInputStream() : connection.getErrorStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
StringBuilder response = new StringBuilder();
String line;
while ((line = reader.readLine()) != null) {
   response.append(line);
}
reader.close();
inputStream.close();
connection.disconnect();
System.out.println(response.toString());

需要注意的是,以上示例代码中的请求参数是以字符串形式传递的,如果需要传递复杂的请求参数,可以考虑使用JSON等格式。同时,如果请求的URL需要携带查询参数,可以在URL中添加查询参数。

下面使用HttpURLConnection 发送POST 请求 参数类型是json

下面是使用HttpURLConnection微信小程序发送订阅消息的一个例子

POST请求

json组装成了一个JSONObject

json类似是这样的

{
  "touser": "OPENID",
  "template_id": "TEMPLATE_ID",
  "page": "index",
  "data": {
      "name01": {
          "value": "某某"
      },
      "amount01": {
          "value": "¥100"
      },
      "thing01": {
          "value": "广州至北京"
      } ,
      "date01": {
          "value": "2018-01-01"
      }
  }
}
  try {

            URL url = new URL(" https://api.weixin.qq.com/cgi-bin/message/subscribe/send?" +
                    "access_token=" +
                    "自己的小程序token");

            HttpURLConnection connection = (HttpURLConnection) url.openConnection();
            connection.setRequestMethod("POST");
            connection.setRequestProperty("Content-Type", "application/json");

            connection.setDoOutput(true);
            connection.setDoInput(true);

//构造发送给用户的订阅消息内容
            Map messageContent = new HashMap<String, Object>();
            messageContent.put("character_string1", new HashMap<String, Object>() {
   {
                put("value", "a123456789");
            }});
            messageContent.put("amount2", new HashMap<String, Object>() {
   {
                put("value", "1元");
            }});
            messageContent.put("thing3", new HashMap<String, Object>() {
   {
                put("value", "西安大学长安学区");
            }});
            messageContent.put("time4", new HashMap<String, Object>() {
   {
                put("value", "2021年10月20日");
            }});
            messageContent.put("thing5", new HashMap<String, Object>() {
   {
                put("value", "这是备注");
            }});
            JSONObject messageContentJson = new JSONObject(messageContent);

            //构造订阅消息
            Map subscribeMessage = new HashMap<String, Object>();
            subscribeMessage.put("touser", " 。。。");//填写你的接收者openid
            subscribeMessage.put("template_id", " 填写你的模板ID");//填写你的模板ID
            subscribeMessage.put("data", messageContentJson);
            JSONObject subscribeMessageJson = new JSONObject(subscribeMessage);
/*
            String s = subscribeMessageJson.toJSONString();
            System.out.println("JSONString:" + s);
*/
            String s1 = subscribeMessageJson.toString();
            System.out.println("String:" + s1);
            byte[] bytes = s1.getBytes();

            DataOutputStream wr = new DataOutputStream(connection.getOutputStream());
            wr.write(bytes);
            wr.close();

            int statusCode = connection.getResponseCode();

            InputStream inputStream = statusCode == 200 ? connection.getInputStream() : connection.getErrorStream();
            BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
            StringBuilder response = new StringBuilder();
            String line;
            while ((line = reader.readLine()) != null) {
                response.append(line);
            }
            reader.close();
            inputStream.close();
            connection.disconnect();
            System.out.println(response.toString());

            connection.disconnect();

        } catch (Exception e) {
            e.printStackTrace();
        }

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/ImisLi/article/details/129946651

智能推荐

【成功解决】ValueError: `validation_steps=None` is only valid for a generator based on the `keras.utils.Se-程序员宅基地

文章浏览阅读3.3k次。在调试keras的时候,加入验证集,且用生成器来表示的验证集,如下代码history = model.fit_generator(train_gene, validation_data=val_gene, steps_per_epoch=75,epochs=epoch,verbose=1,callbacks=[model_checkpoint])报出如下错误:ValueError: `validation_steps=None` is only valid for a generator b_valueerror: `validation_steps=none` is only valid for a generator based on t

斯伦贝谢宣布2021年第二季度业绩_斯伦贝谢2021产收入-程序员宅基地

文章浏览阅读414次。全球营收56亿美元,环比增长8% 国际营收45亿美元,北美营收11亿美元 每股收益0.30美元,环比增长43% 来自于运营的现金流为12亿美元,自由现金流为8.69亿美元 董事会批准了0.125美元/股的季度现金派息巴黎--(美国商业资讯)--斯伦贝谢(Schlumberger Limited, NYSE: SLB)今日公布了2021年第二季度业绩。 第二季度业绩 (单位为百万,每股数额除外) _斯伦贝谢2021产收入

GoLang音视频转码_go 图片 视频转码-程序员宅基地

文章浏览阅读3.5k次。一、搭建好开发环境这一步不会的可以百度参考一下这个教程https://www.runoob.com/go/go-environment.html安装ide ,我用的是goland, 个人感觉比较好用支持的平台Linux OS X Windows二、下载第三方工具包go get github.com/xfrr/goffmpeg三、音频转码程序可以直接运行。并且同时支持音频和视频的播放提供的例子是将m4a转码成mp3格式。如果想转换其他格式,只需要修改文件后缀名._go 图片 视频转码

MPC5744P-eTimer模块-程序员宅基地

文章浏览阅读4.5k次,点赞9次,收藏32次。1.通道结构5744每个eTimer模块含有6个相同的计数通道,每个计数通道含有16位计数器、分频器、保持寄存器各一个,捕捉寄存器、比较寄存器、比较预加载寄存器各两个,还有四个控制寄存器,其通道结构如下图:2、计数模式、eTimer模块含有多种计数模式,可根据实际情况选择合适的计数模式1、计数上升沿;2、计数跳边沿(上升沿和下降沿均计数);3、当二次输入为高时计数;4、QUADRA..._etimer

Hexo折腾之改用Valine评论系统 - 更新域名绑定,评论后台管理_hexo评论valine-程序员宅基地

文章浏览阅读2k次,点赞11次,收藏9次。前几天给博客添加了来必力评论系统,但是加载速度实在是慢的可以,原因是来必力是在页面滑到底部的时候才开始加载,但是通过控制台看,来必力确实时间很久,很影响我自己的使用体验(嗯,没有别人,哭),所以在网上找到了另外的评论系统—Valine。Valine 是什么?欢迎访问 Valine 官网Valine 是一款基于 Leancloud 的快速、简洁且高效的无后端评论系统。Valine 的特性如同官网所说:快速、安全、无后端等等。更重要的是,我在 Valine 官网看到了「邮件提醒」,巧了,这正是我想要_hexo评论valine

七牛云存储的简单使用总结_7牛 s3存储的使用-程序员宅基地

文章浏览阅读1.1w次。七牛是专注文件存储的第三方服务商,服务较好。自己最近做到服务器存储图片的时候就想到用七牛来做,将图片或者文件存放在七牛,然后自己服务器只存放资源存放在七牛文件的url。今天主要分享两个内容:凭证的获取,安卓上传文件在做之前还是先把官方文档好好读几遍比较好首先说说凭证,七牛对所有上传的资源都需要身份验证,就是通过凭证来验证,验证通过,那么就可以成功上传文件,不通过,七牛服务器会反_7牛 s3存储的使用

随便推点

仿射密码解密(Affine Cipher)-程序员宅基地

文章浏览阅读4.9w次,点赞38次,收藏105次。仿射密码是一种表单代换密码,字母表的每个字母相应的值使用一个简单的数学函数对应一个数值,再把对应数值转换成字母。A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 0 1 2 ..._仿射密码

《Java基础入门第2版》--黑马程序员 课后答案及其详解 第1章 Java开发入门_java基础入门黑马程序员第二版-程序员宅基地

文章浏览阅读3.8w次,点赞116次,收藏425次。文章目录一、填空题二、判断题三、选择题四、简答题五、编程题六、原题及其解析一、填空题1.(1)Java SE(2)Java EE(3)Java ME2.JRE3.javac4.bin5.(1)path(2)classpath二、判断题 1.√ 2.× 3.√ 4.√ 5.×三、选择题 1.ABCD 2.C 3.D 4.B 5.B四、简答题1、 面向对象、跨平台性、健壮性、安全性、可移植性、多线程性、动态性等。2、 JRE(Java Runtime Environm._java基础入门黑马程序员第二版

OpenGL基础知识介绍和简单使用_opengl program-程序员宅基地

文章浏览阅读4.5k次,点赞3次,收藏41次。OpenGL(全写Open Graphics Library)是指定义了一个跨编程语言、跨平台的编程接口规格的专业的图形程序接口。它用于三维图像(二维的亦可),是一个功能强大,调用方便的底层图形库。OpenGL在不同的平台上有不同的实现,但是它定义好了专业的程序接口,不同的平台都是遵照该接口来进行实现的,思想完全相同,方法名也是一致的,所以使用时也基本一致,只需要根据不同的语言环境稍有不同而已。_opengl program

【51单片机】之入门详解(一)_51单片机编程入门基础知识-程序员宅基地

文章浏览阅读1.2k次,点赞21次,收藏19次。【51单片机】之入门详解(一)_51单片机编程入门基础知识

uwsgi的3个容易掉坑的配置(timeout、harakiri、buffer-size)_uwsgi harakiri-程序员宅基地

文章浏览阅读2.9w次,点赞16次,收藏27次。我采用的.ini文件[uwsgi]master = truewsgi-file=myppt/wsgi.pyprocesses = 1threads = 2chdir = /www/wwwroot/ppt_jpg/myppt/http = 127.0.0.1:9876virtualenv=/www/wwwroot/ppt_jpg/myppt/ppt_venvdaemonize=uw..._uwsgi harakiri

ffmpeg5.0+h264+h265 windows下编译方法-程序员宅基地

文章浏览阅读7.4k次,点赞14次,收藏47次。前言: 最近准备在windows上面用ffmpeg做视频编解码工作,找了很多博客对编译方法描述都不全,花了一天时间自己折腾编译通过了,写篇比较完整的博客分享给大家,希望对大家有所帮助,另外,感谢其他博主的分享!一,源码包下载1.ffmpeg下载下载地址:https://ffmpeg.org(1)在主页面中找到ffmpeg5.0版本点击(2)点击下载,这里我下载的是gzip包2,下载x264代码下载地址:x264, the best H.2..._ffmpeg5.0