Java webservice的POST和GET请求调用方式
作者:sskai163 发布时间:2023-01-10 05:35:43
标签:Java,webservice,POST,GET
webservice的POST和GET请求调用
POST请求
1.发送请求
import java.io.DataOutputStream;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.HashMap;
import java.util.Map;
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.methods.PostMethod;
import org.apache.commons.httpclient.methods.RequestEntity;
import org.apache.commons.httpclient.methods.StringRequestEntity;
import com.google.common.io.ByteStreams;
/**
* HttpClient发送SOAP请求
* @param wsdl url地址
* @param xml 请求体参数
* @return
* @throws Exception
*/
public static String sendHttpPost(String wsdl, String xml) throws Exception{
int timeout = 10000;
// HttpClient发送SOAP请求
System.out.println("HttpClient 发送SOAP请求");
HttpClient client = new HttpClient();
PostMethod postMethod = new PostMethod(wsdl);
// 设置连接超时
client.getHttpConnectionManager().getParams().setConnectionTimeout(timeout);
// 设置读取时间超时
client.getHttpConnectionManager().getParams().setSoTimeout(timeout);
// 然后把Soap请求数据添加到PostMethod中
RequestEntity requestEntity = new StringRequestEntity(xml, "text/xml", "UTF-8");
// 设置请求体
postMethod.setRequestEntity(requestEntity);
int status = client.executeMethod(postMethod);
// 打印请求状态码
System.out.println("status:" + status);
// 获取响应体输入流
InputStream is = postMethod.getResponseBodyAsStream();
// 获取请求结果字符串
return new String(ByteStreams.toByteArray(is));
}
/**
* HttpURLConnection 发送SOAP请求
* @param wsdl url地址
* @param xml 请求体参数
* @return
* @throws Exception
*/
public static String sendURLConnection(String wsdl, String xml) throws Exception{
int timeout = 10000;
// HttpURLConnection 发送SOAP请求
System.out.println("HttpURLConnection 发送SOAP请求");
URL url = new URL(wsdl);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestProperty("Content-Type", "text/xml; charset=utf-8");
conn.setRequestMethod("POST");
conn.setUseCaches(false);
conn.setDoInput(true);
conn.setDoOutput(true);
conn.setConnectTimeout(timeout);
conn.setReadTimeout(timeout);
DataOutputStream dos = new DataOutputStream(conn.getOutputStream());
dos.write(xml.getBytes("utf-8"));
dos.flush();
InputStream inputStream = conn.getInputStream();
// 获取请求结果字符串
return new String(ByteStreams.toByteArray(inputStream));
}
ByteStreams的maven
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>27.0.1-jre</version>
</dependency>
2.POST请求体
/**
* POST请求体
* @param map 请求参数
* @param methodName 方法名
* @return
*/
public static String getXml(Map<String ,String> map , String methodName){
StringBuffer sb = new StringBuffer("");
sb.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
sb.append("<soap:Envelope "
+ "xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' "
+ "xmlns:xsd='http://www.w3.org/2001/XMLSchema' "
+ "xmlns:soap='http://schemas.xmlsoap.org/soap/envelope/'>");
sb.append("<soap:Body>");
sb.append("<" + methodName + " xmlns='http://tempuri.org/'>");
//post参数
for (String str : map.keySet()){
sb.append("<"+str+">"+map.get(str)+"</"+str+">");
}
sb.append("</" + methodName + ">");
sb.append("</soap:Body>");
sb.append("</soap:Envelope>");
return sb.toString();
}
3.测试
/**
* HTTP POST请求
*/
public static void main(String[] args) throws Exception{
String wsdl = "http://IP:端口/xxx?wsdl";
String methodName = "方法名";
Map<String ,String> map = new HashMap<>();
map.put("参数名","参数值");
//请求体xml
String xml = getXml(map, methodName);
//发送请求
String s = sendHttpPost(wsdl, xml);
System.out.println(s);
}
GET请求
/**
* 发送请求
*/
import com.google.common.io.ByteStreams;
import org.apache.commons.httpclient.HttpStatus;
import org.codehaus.jettison.json.JSONObject;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.HashMap;
import java.util.Map;
public static void main(String[] args) throws Exception{
String url = "http://IP:端口/xxx/方法名?参数名=参数值";
Map result = new HashMap(16);
try {
URL url = new URL(url);
HttpURLConnection connection = (HttpURLConnection)url.openConnection();
//设置输入输出,因为默认新创建的connection没有读写权限,
connection.setDoInput(true);
connection.setDoOutput(true);
//接收服务端响应
int responseCode = connection.getResponseCode();
if(HttpStatus.SC_OK == responseCode){//表示服务端响应成功
InputStream is = connection.getInputStream();
//响应结果
String s = new String(ByteStreams.toByteArray(is));
result = com.alibaba.fastjson.JSONObject.parseObject(s, Map.class);
}
} catch (Exception e) {
e.printStackTrace();
System.out.println("查询在线状态1:"+e.getMessage());
}
System.out.println(result);
}
通过webService调第三方提供的接口post与get
需求:第三方提供接口路径,在自己的项目中进行调用
注意点:调不通的时候排除接口本身的问题后,看看自己调用路径是不是正确的,有没多了或者少了【/】,参数的格式是不是跟接口文档的一致,再不行,那有可能是编码或者流处理的问题,我在实际开发中就是因为流处理的问题导致调不通。
POST
public static String post(String method,String urls,String params){
OutputStreamWriter out = null;
try
{
URL url = new URL(urls);//第三方接口路径
HttpsURLConnection conn = (HttpsURLConnection) url.openConnection();
// 创建连接
conn.setDoOutput(true);
conn.setDoInput(true);
conn.setUseCaches(false);
conn.setRequestMethod(method);//请求方式 此处为POST
String token= "123456789";//根据实际项目需要,可能需要token值
conn.setRequestProperty("token", token);
conn.setRequestProperty("Content-type", "application/json");
conn.connect();
out = new OutputStreamWriter(conn.getOutputStream(), "utf-8");//编码设置
out.write(params);
out.flush();
out.close();
// 获取响应
BufferedReader reader = new BufferedReader( new InputStreamReader(conn.getInputStream()));
String lines;
StringBuffer sb = new StringBuffer();
while ((lines = reader.readLine()) != null ){
lines = new String(lines.getBytes(), "utf-8" );
sb.append(lines);
}
reader.close();
System.out.println(sb);
return sb.toString();
}catch(Exception e) {
e.printStackTrace();
}
return null;
}
GET
//根据各自需要返回数组或者字符串
//public static String getObject(String method,String urls,String params){
public static JSONArray getArray(String method,String urls,String params){
OutputStreamWriter out = null;
try{
URL url = new URL(urls);//接口路径
HttpsURLConnection conn = (HttpsURLConnection) url.openConnection();
conn.setRequestMethod(method);//请求方法 此处为GET
conn.setDoInput(true);
conn.setDoOutput(true);
String token = "123456789";//请求头token
conn.setRequestProperty("token",token);
conn.connect();
int status = conn.getResponseCode();
System.out.println(status);
if(status == 200){
BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream()));//怎么也调不通的时候,有可能流处理有问题
String str = "";
StringBuffer sb = new StringBuffer();
while((str=reader.readLine()) != null){
sb.append(str);
}
//返回字符串的话,就直接返回 sb.toString()
return JSONArray.parseArray(sb.toString());
}
System.out.println("请求服务失败,错误码为"+status);
}catch(Exception e){
e.printStackTrace();
}
return null;
}
用实体类进行接收返回值的话,需要将返回数据做下转换,转成我们需要的实体类格式
//返回数组转实体类
JSONArray sb = getArray(method,url,params);
if (sb!=null){
List<实体类> list = JSONObject.parseArray(sb.toJSONString(), 实体类.class);
return list;
}else {
throw new CustomException("调用接口失败");
}
//返回字符串转实体类
String json = JSONObject.toJSONString(params);
String sb = post(method,url,json);
JSONObject testJson = JSONObject.parseObject(sb);
实体类dto = JSON.toJavaObject(testJson,实体类.class);
来源:https://blog.csdn.net/weixin_42393758/article/details/84383415


猜你喜欢
- 有一段时间,正则表达式学习很火热很潮流,当时在脚本之间平台一天就能看到好几个正则表达式的帖子,那段时间借助论坛以及Wrox Press出版的
- android:id 为控件指定相应的ID android:text 指定控件的文本,置尽量使用strings.xml android:gr
- Java 官网对Looper对象的说明:public class Looperextends ObjectClass used to run
- 前言面向切面编程,利用 AOP 可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发
- 本文实例为大家分享了android实现简单拼图游戏的具体代码,供大家参考,具体内容如下1.2.//使用回调接口,首先初始化pintuview
- 若代理类在程序运行前就已经存在,那么这种代理方式被成为 静态代理 ,这种情况下的代理类通常都是我们在Java代码中定义的。 通常情况下, 静
- 日常开发中,判断邮箱是少不了的,这个我以**C#**为例,来写一个判断方法,正则表达式是通用的,CV就可以首先引入正则需要使用的命名空间//
- WebMvcConfigurer配置类其实是Spring内部的一种配置方式,采用JavaBean的形式来代替传统的xml配置文件形式进行针对
- ClickHouse应用场景:1.绝大多数请求都是用于读访问的2.数据需要以大批次(大于1000行)进行更新,而不是单行更新;或者根本没有更
- 组合模式是一种常见的设计模式(但我感觉有点复杂)也叫合成模式,有时又叫做部分-整体模式,主要是用来描述部分与整体的关系。个人理解:组合模式就
- Dubbo服务暴露机制前言在进行服务暴露机制的分析之前,必须谈谈什么是URL,在Dubbo服务暴露过程中URL是无处不在的,贯穿了整个过程。
- 有时候我们需要在一个ArrayList的for循环中动态删除元素的需求, 废话不多说看代码List<Integer> list
- 目录一、Actuator简介二、与SpringBoot2.0整合 1、核心依赖Jar包2、Yml配置文件三、监控接口详解 
- 1 场景启动器 starter 简介什么是 SpringMVC在早期 Java Web 的开发中,统一把显示层、控制层、数据层的操作全部交给
- 注:由于工作需要, 也是第一次接触到打印机的相关内容, 凑巧, 通过找了很多资料和帮助后, 也顺利的解决了打印标签的问题(标签的表面信息[二
- 一:前言:最近支付后台登录一段时间后如果没有任何操作,总是需要重新登录才可以继续访问页面,出现这个问题的原因就是session超时,debu
- 本文实例讲述了java实现将结果集封装到List中的方法。分享给大家供大家参考,具体如下:import java.sql.Connectio
- 一,项目简介经过调查研究进行开发设计的这款仓库管理系统,主要是为商家提供商品货物进销存的信息化管理,以便让商家在竞争如此激烈的今天占据一定的
- 一、介绍这个类是继承自ImageView的,所以对于这个控件我们可以使用ImageView的所有属性android.support.desi
- 还是有一些小问题....懒得改了,但大体思路还是清晰的,首先定义一个运算符栈,一个数栈。关于优先级,两个括号(,)优先级最低,其次是+、-,