使用HttpURLConnection发送POST请求并携带请求参数

Bertha 。 2023-09-25 21:38 166阅读 0赞

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

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

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

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

3、设置请求方法为POST。

  1. connection.setRequestMethod("POST");

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

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

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

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

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

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

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

  1. OutputStream outputStream = connection.getOutputStream();
  2. outputStream.write(param.getBytes());
  3. outputStream.flush();
  4. outputStream.close();

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

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

  1. int statusCode = connection.getResponseCode();

9、读取响应数据。

  1. InputStream inputStream = statusCode == 200 ? connection.getInputStream() : connection.getErrorStream();
  2. BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
  3. StringBuilder response = new StringBuilder();
  4. String line;
  5. while ((line = reader.readLine()) != null) {
  6. response.append(line);
  7. }
  8. reader.close();
  9. inputStream.close();

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

  1. String param = "name=张三&age=18";
  2. URL url = new URL("http://example.com/api");
  3. HttpURLConnection connection = (HttpURLConnection) url.openConnection();
  4. connection.setRequestMethod("POST");
  5. connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
  6. connection.setRequestProperty("Content-Length", String.valueOf(param.getBytes().length));
  7. connection.setConnectTimeout(5000);
  8. connection.setReadTimeout(5000);
  9. connection.setDoOutput(true);
  10. OutputStream outputStream = connection.getOutputStream();
  11. outputStream.write(param.getBytes());
  12. outputStream.flush();
  13. outputStream.close();
  14. int statusCode = connection.getResponseCode();
  15. InputStream inputStream = statusCode == 200 ? connection.getInputStream() : connection.getErrorStream();
  16. BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
  17. StringBuilder response = new StringBuilder();
  18. String line;
  19. while ((line = reader.readLine()) != null) {
  20. response.append(line);
  21. }
  22. reader.close();
  23. inputStream.close();
  24. connection.disconnect();
  25. System.out.println(response.toString());

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

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

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

POST请求

json组装成了一个JSONObject

json类似是这样的

  1. {
  2. "touser": "OPENID",
  3. "template_id": "TEMPLATE_ID",
  4. "page": "index",
  5. "data": {
  6. "name01": {
  7. "value": "某某"
  8. },
  9. "amount01": {
  10. "value": "¥100"
  11. },
  12. "thing01": {
  13. "value": "广州至北京"
  14. } ,
  15. "date01": {
  16. "value": "2018-01-01"
  17. }
  18. }
  19. }
  20. try {
  21. URL url = new URL(" https://api.weixin.qq.com/cgi-bin/message/subscribe/send?" +
  22. "access_token=" +
  23. "自己的小程序token");
  24. HttpURLConnection connection = (HttpURLConnection) url.openConnection();
  25. connection.setRequestMethod("POST");
  26. connection.setRequestProperty("Content-Type", "application/json");
  27. connection.setDoOutput(true);
  28. connection.setDoInput(true);
  29. //构造发送给用户的订阅消息内容
  30. Map messageContent = new HashMap<String, Object>();
  31. messageContent.put("character_string1", new HashMap<String, Object>() {
  32. {
  33. put("value", "a123456789");
  34. }});
  35. messageContent.put("amount2", new HashMap<String, Object>() {
  36. {
  37. put("value", "1元");
  38. }});
  39. messageContent.put("thing3", new HashMap<String, Object>() {
  40. {
  41. put("value", "西安大学长安学区");
  42. }});
  43. messageContent.put("time4", new HashMap<String, Object>() {
  44. {
  45. put("value", "2021年10月20日");
  46. }});
  47. messageContent.put("thing5", new HashMap<String, Object>() {
  48. {
  49. put("value", "这是备注");
  50. }});
  51. JSONObject messageContentJson = new JSONObject(messageContent);
  52. //构造订阅消息
  53. Map subscribeMessage = new HashMap<String, Object>();
  54. subscribeMessage.put("touser", " 。。。");//填写你的接收者openid
  55. subscribeMessage.put("template_id", " 填写你的模板ID");//填写你的模板ID
  56. subscribeMessage.put("data", messageContentJson);
  57. JSONObject subscribeMessageJson = new JSONObject(subscribeMessage);
  58. /*
  59. String s = subscribeMessageJson.toJSONString();
  60. System.out.println("JSONString:" + s);
  61. */
  62. String s1 = subscribeMessageJson.toString();
  63. System.out.println("String:" + s1);
  64. byte[] bytes = s1.getBytes();
  65. DataOutputStream wr = new DataOutputStream(connection.getOutputStream());
  66. wr.write(bytes);
  67. wr.close();
  68. int statusCode = connection.getResponseCode();
  69. InputStream inputStream = statusCode == 200 ? connection.getInputStream() : connection.getErrorStream();
  70. BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
  71. StringBuilder response = new StringBuilder();
  72. String line;
  73. while ((line = reader.readLine()) != null) {
  74. response.append(line);
  75. }
  76. reader.close();
  77. inputStream.close();
  78. connection.disconnect();
  79. System.out.println(response.toString());
  80. connection.disconnect();
  81. } catch (Exception e) {
  82. e.printStackTrace();
  83. }

发表评论

表情:
评论列表 (有 0 条评论,166人围观)

还没有评论,来说两句吧...

相关阅读