`
thinkerAndThinker
  • 浏览: 285241 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Java访问远程接口的几种方式

 
阅读更多

1、原生JavaAPI获取

package com.util;

import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLEncoder;
import java.util.Map;

/**
 * <pre>
 * 功能:httpUrlConnection访问远程接口工具
 * 日期:2015年3月17日 上午11:19:21
 * </pre>
 */
public class HttpUrlConnectionUtil {

    /**
     * <pre>
     * 方法体说明:向远程接口发起请求,返回字符串类型结果
     * @param url 接口地址
     * @param requestMethod 请求方式
     * @param params 传递参数     重点:参数值需要用Base64进行转码
     * @return String 返回结果
     * </pre>
     */
    public static String httpRequestToString(String url, String requestMethod,
            Map<String, String> params){

        String result = null;
        try {
            InputStream is = httpRequestToStream(url, requestMethod, params);
            byte[] b = new byte[is.available()];
            is.read(b);
            result = new String(b);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return result;
    }

    /**
     * <pre>
     * 方法体说明:向远程接口发起请求,返回字节流类型结果
     * 作者:itar
     * 日期:2015年3月17日 上午11:20:25
     * @param url 接口地址
     * @param requestMethod 请求方式
     * @param params 传递参数     重点:参数值需要用Base64进行转码
     * @return InputStream 返回结果
     * </pre>
     */
    public static InputStream httpRequestToStream(String url, String requestMethod,
            Map<String, String> params){

        InputStream is = null;
        try {
            String parameters = "";
            boolean hasParams = false;
            //将参数集合拼接成特定格式,如name=zhangsan&age=24
            for(String key : params.keySet()){
                String value = URLEncoder.encode(params.get(key), "UTF-8");
                parameters += key +"="+ value +"&";
                hasParams = true;
            }
            if(hasParams){
                parameters = parameters.substring(0, parameters.length()-1);
            }

            //请求方式是否为get
            boolean isGet = "get".equalsIgnoreCase(requestMethod);
            //请求方式是否为post
            boolean isPost = "post".equalsIgnoreCase(requestMethod);
            if(isGet){
                url += "?"+ parameters;
            }

            URL u = new URL(url);
            HttpURLConnection conn = (HttpURLConnection) u.openConnection();

            //请求的参数类型(使用restlet框架时,为了兼容框架,必须设置Content-Type为“”空)
            conn.setRequestProperty("Content-Type", "application/octet-stream");
            //conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
            //设置连接超时时间
            conn.setConnectTimeout(50000);  
            //设置读取返回内容超时时间
            conn.setReadTimeout(50000);
            //设置向HttpURLConnection对象中输出,因为post方式将请求参数放在http正文内,因此需要设置为ture,默认false
            if(isPost){
                conn.setDoOutput(true);
            }
            //设置从HttpURLConnection对象读入,默认为true
            conn.setDoInput(true);
            //设置是否使用缓存,post方式不能使用缓存
            if(isPost){
                conn.setUseCaches(false);
            }
            //设置请求方式,默认为GET
            conn.setRequestMethod(requestMethod);

            //post方式需要将传递的参数输出到conn对象中
            if(isPost){
                DataOutputStream dos = new DataOutputStream(conn.getOutputStream());
                dos.writeBytes(parameters);
                dos.flush();
                dos.close();
            }

            //从HttpURLConnection对象中读取响应的消息
            //执行该语句时才正式发起请求
            is = conn.getInputStream();
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return is;
    }
}

2、利用httpClient访问获取

package com.util;

import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.util.Map;

import org.apache.http.HttpResponse;
import org.apache.http.auth.AuthScope;
import org.apache.http.auth.UsernamePasswordCredentials;
import org.apache.http.client.CredentialsProvider;
import org.apache.http.client.methods.HttpDelete;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.methods.HttpPut;
import org.apache.http.client.methods.HttpRequestBase;
import org.apache.http.client.protocol.HttpClientContext;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.BasicCredentialsProvider;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.params.CoreConnectionPNames;
import org.apache.http.util.EntityUtils;


/**
 * <pre>
 * 功能:httpClient访问远程接口工具类
 * 日期:2015年3月17日 上午11:19:21
 * </pre>
 */
@SuppressWarnings("deprecation")
public class HttpClientUtil {

    /**
     * <pre>
     * 方法体说明:向远程接口发起请求,返回字符串类型结果
     * @param url 接口地址
     * @param requestMethod 请求类型
     * @param params 传递参数
     * @return String 返回结果
     * </pre>
     */
    public static String httpRequestToString(String url, String requestMethod,
            Map<String, String> params, String ...auth){
        //接口返回结果
        String methodResult = null;
        try {
            String parameters = "";
            boolean hasParams = false;
            //将参数集合拼接成特定格式,如name=zhangsan&age=24
            for(String key : params.keySet()){
                String value = URLEncoder.encode(params.get(key), "UTF-8");
                parameters += key +"="+ value +"&";
                hasParams = true;
            }
            if(hasParams){
                parameters = parameters.substring(0, parameters.length()-1);
            }
            //是否为GET方式请求
            boolean isGet = "get".equalsIgnoreCase(requestMethod);
            boolean isPost = "post".equalsIgnoreCase(requestMethod);
            boolean isPut = "put".equalsIgnoreCase(requestMethod);
            boolean isDelete = "delete".equalsIgnoreCase(requestMethod);

            //创建HttpClient连接对象
            DefaultHttpClient client = new DefaultHttpClient();
            HttpRequestBase method = null;
            if(isGet){
                url += "?" + parameters;
                method = new HttpGet(url);
            }else if(isPost){
                method = new HttpPost(url);
                HttpPost postMethod = (HttpPost) method;
                StringEntity entity = new StringEntity(parameters);
                postMethod.setEntity(entity);
            }else if(isPut){
                method = new HttpPut(url);
                HttpPut putMethod = (HttpPut) method;
                StringEntity entity = new StringEntity(parameters);
                putMethod.setEntity(entity);
            }else if(isDelete){
                url += "?" + parameters;
                method = new HttpDelete(url);
            }
            method.getParams().setParameter(CoreConnectionPNames.CONNECTION_TIMEOUT, 6000);
            //设置参数内容类型
            method.addHeader("Content-Type","application/x-www-form-urlencoded");
            //httpClient本地上下文
            HttpClientContext context = null;
            if(!(auth==null || auth.length==0)){
                String username = auth[0];
                String password = auth[1];
                UsernamePasswordCredentials credt = new UsernamePasswordCredentials(username,password);
                //凭据提供器
                CredentialsProvider provider = new BasicCredentialsProvider();
                //凭据的匹配范围
                provider.setCredentials(AuthScope.ANY, credt);
                context = HttpClientContext.create();
                context.setCredentialsProvider(provider);
            }
            //访问接口,返回状态码
            HttpResponse response = client.execute(method, context);
            //返回状态码200,则访问接口成功
            if(response.getStatusLine().getStatusCode()==200){
                methodResult = EntityUtils.toString(response.getEntity());
            }
            client.close();
        }catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }catch (IOException e) {
            e.printStackTrace();
        }
        return methodResult;
    }
}

 

分享到:
评论

相关推荐

    java调用soap接口案例

    Java调用SOAP(Simple Object Access Protocol)接口是Web服务交互中的常见操作,SOAP是一种基于XML的协议,用于在Web上交换结构化的和类型化的信息。本案例主要关注如何使用Java来实现SOAP请求并获取响应,具体我们...

    java实现读取证书访问https接口

    总结来说,Java实现读取证书访问HTTPS接口涉及以下几个关键步骤: 1. 读取不同格式的证书并将其转换为Java `Certificate` 对象。 2. 创建自定义的`SSLSocketFactory`,加载证书和KeyStore。 3. 使用自定义的`...

    java版远程控制的实例demo

    在Java中,远程接口需要继承`java.rmi.Remote`接口,并声明抛出`java.rmi.RemoteException`的异常。 2. **远程对象**:实现了远程接口的类,它包含了实际的业务逻辑。远程对象需要通过`java.rmi.server....

    java rmi远程方法调用 客户端

    - **序列化**:RMI要求所有跨网络传输的对象都是可序列化的,因此,远程接口中的参数和返回类型必须实现`java.io.Serializable`接口。 - **安全性**:RMI支持Java安全模型,可以控制客户端对远程对象的访问权限。 ...

    JAVA RMI远程调用方法代码

    - 创建并实现一个远程接口,该接口需要继承`java.rmi.Remote`接口,并声明可能抛出`RemoteException`的方法。 - 实现该远程接口,创建一个具体的类来完成实际的业务逻辑。 - 使用`UnicastRemoteObject`将远程对象...

    基于JAVA网络远程监控系统软件的实现(源码)

    Java网络远程监控系统是一种能够实时收集、分析和管理分布在不同地理位置的计算机系统状态的软件解决方案。这个基于JAVA的网络远程监控系统提供了强大的功能,包括硬件性能监控、软件运行状况检查、网络流量分析以及...

    java远程控制原理和示例

    1. **定义远程接口**:首先,你需要定义一个Java接口,该接口声明了可以在服务器上执行的方法。 2. **实现远程接口**:在服务器端,你需要实现这个接口并提供实际的业务逻辑。 3. **注册远程对象**:服务器需要将...

    Java远程控制源代码

    Java的Thread类和Runnable接口提供了一种管理并发执行任务的方式。 4. **安全**:远程控制涉及到用户隐私和系统安全,因此必须考虑安全措施。Java提供SSL/TLS加密,以及JAAS(Java Authentication and ...

    Spring 远程调用 -- C# 访问java WEB 服务

    Spring WebService提供了一种基于XML的声明式方式来配置Web服务和端点,使得开发者能够快速创建和部署SOAP服务。此外,"java"标签表明服务端是用Java语言实现的。 至于压缩包子文件的文件名,"ExportWS_Spring"可能...

    Java 调用Restful API接口的几种方式(HTTPS)

    Java 调用 Restful API 接口的几种方式是指在 Java 应用程序中调用 Restful API 接口,以实现与远程服务器的交互。在本文中,我们将介绍 Java 调用 Restful API 接口的几种方式,包括使用 HttpClient、OkHttp 和 ...

    基于java的远程调用.zip

    1. **接口定义**:首先,你需要定义一个远程接口(Remote Interface),它继承自Java的`java.rmi.Remote`接口,并声明所有远程方法。这些方法将抛出`java.rmi.RemoteException`。 2. **实现远程接口**:然后,创建...

    Java RMI远程方法调用

    1. **远程接口(Remote Interface)**:这是定义远程方法的接口,必须继承自java.rmi.Remote接口。接口中的每个方法都必须抛出java.rmi.RemoteException,因为任何跨网络的通信都可能引发异常。 2. **远程实现...

    Java共享文件夹接口

    在IT行业中,尤其是在分布式系统和网络编程领域,"Java共享文件夹接口"是一个重要的概念,它允许客户端应用程序访问和操作远程服务器上的文件,尤其是Word文档。这个接口的设计目的是为了实现跨平台的数据共享和协作...

    Java远程终端工具 JTA

    Java远程终端工具(Java Terminal Application,简称JTA)是一种基于Java技术实现的远程访问和管理终端的工具。它允许开发者和系统管理员通过网络接口连接到远程服务器,进行各种操作,如执行命令、查看文件系统、...

    基于JAVA CS远程监控系统软件的实现(源代码+论文).rar

    Java CS远程监控系统是一种采用客户端-服务器(Client-Server,CS)架构的软件应用,它允许用户通过网络对远程设备或系统进行实时监控。在Java技术的支持下,该系统能够跨平台运行,提供高效、稳定且灵活的监控解决...

    几种常用的Java数据源解决方案

    ### 几种常用的Java数据源解决方案 在Java开发过程中,数据源(DataSource)扮演着非常重要的角色,它负责管理数据库连接资源,为应用程序提供高效、可靠的数据库访问支持。`javax.sql.DataSource`接口定义了标准的...

    java访问硬件的例子 天敏V4000板卡,海康网络录像机,明华IC卡,KPCI847板子

    总结起来,Java访问硬件设备涉及以下几个步骤: 1. 理解硬件设备的工作原理和通信协议。 2. 若需通过JNI,编写C/C++的本地库,实现硬件访问功能。 3. 在Java中创建JNI接口,调用本地库函数。 4. 对于提供SDK的设备,...

    Java远程通讯可选技术及原理.docx

    本文主要探讨了Java领域中常见的几种远程通讯技术,包括RMI、MINA、ESB、Burlap、Hessian、SOAP、EJB和JMS等。这些技术各有特点,适用于不同的场景。 **RMI(Remote Method Invocation)** RMI是Java平台特有的一种...

    JAVA网络通信系统的研究与开发,java远程通信及应用的研究,Java源码.zip

    RMI系统由几个组件组成,包括远程接口(Remote Interface)、远程对象(Remote Object)、注册表(Registry)和 stub/skeleton 对象。开发者定义远程接口,声明远程方法,然后实现这些接口的远程对象。RMI会自动处理...

    Axis客户端的几种实现方式

    在Axis中,客户端实现主要分为以下几种方式: 1. **命令行工具**: Axis提供了一系列的命令行工具,如`wsdl2java`,可以从WSDL文件生成Java客户端 stubs。在给定的文件名称列表中,`testWSDL2Java`可能就是使用这...

Global site tag (gtag.js) - Google Analytics