Java webservice的POST和GET请求调用方式

 更新时间:2022年03月23日 10:40:31   作者:sskai163  
这篇文章主要介绍了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);

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • 解决Java中properties文件编码问题

    解决Java中properties文件编码问题

    大家好,本篇文章主要讲的是解决Java中properties文件编码问题,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下
    2022-02-02
  • (starters)springboot-starter整合阿里云datahub方式

    (starters)springboot-starter整合阿里云datahub方式

    这篇文章主要介绍了(starters)springboot-starter整合阿里云datahub方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-11-11
  • Maven项目打包成可执行Jar文件步骤解析

    Maven项目打包成可执行Jar文件步骤解析

    这篇文章主要介绍了Maven项目如何打包成可执行Jar文件,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-05-05
  • spring  mybatis多数据源实例详解

    spring mybatis多数据源实例详解

    本文主要介绍sping mybatis多数据源处理,在开发过程中经常会遇到多个数据库,这里给大家举例说明如何处理,希望能帮助有需要的小伙伴
    2016-07-07
  • Mybatis中的延迟加载,以及原理分析

    Mybatis中的延迟加载,以及原理分析

    这篇文章主要介绍了Mybatis中的延迟加载以及原理,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-04-04
  • Java并发编程之对象的共享

    Java并发编程之对象的共享

    这篇文章主要介绍了Java并发编程之对象的共享,介绍如何共享和发布对象,使它们被安全地由多个进程访问。需要的小伙伴可以参考一下
    2022-04-04
  • SpringBoot项目部署到腾讯云的实现步骤

    SpringBoot项目部署到腾讯云的实现步骤

    本文主要介绍了SpringBoot项目部署到腾讯云的实现步骤,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-01-01
  • Mybatis-Plus实体类继承Model的使用小结

    Mybatis-Plus实体类继承Model的使用小结

    Mybatis-Plus实体类继承Model的使用是Mybatis-Plus中的一个重要特性,它允许开发者通过继承Model类来快速实现一些通用的功能,本文主要介绍了Mybatis-Plus实体类继承Model的使用小结,感兴趣的可以了解一下
    2024-07-07
  • Mybatis拦截器注解@Intercepts与@Signature注解使用

    Mybatis拦截器注解@Intercepts与@Signature注解使用

    本文主要介绍了Mybatis拦截器注解@Intercepts与@Signature注解使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-07-07
  • 本地jvm执行flink程序带web ui的操作

    本地jvm执行flink程序带web ui的操作

    这篇文章主要介绍了本地jvm执行flink程序带web ui的操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-08-08

最新评论