远程接口调用

1.1          第二部分:远程接口调用方式HttpClient

问题:现在我们已经开发好了接口了,那该如何调用这个接口呢?

答:使用Httpclient客户端。

1.1.1         Httpclient简介

1.1.1.1     什么是httpclient

HttpClient 是 Apache Jakarta Common 下的子项目,用来提供高效的、最新的、功能丰富的支持 HTTP 协议的客户端编程工具包,并且它支持 HTTP 协议最新的版本和建议。实现了所有 HTTP 的方法(GET,POST,PUT,HEAD 等)

下载地址:http://hc.apache.org/

1.1.1.2     httpclient作用

在java代码中,发送Http请求。通常用来实现远程接口调用。

1.1.2         HttpClient测试

说明:在ego-base中测试

在ego-base工程中添加httpclient的pom依赖。


<dependency>

<groupId>org.apache.httpcomponents</groupId>

<artifactId>httpclient</artifactId>

</dependency>

1.1.2.1     执行GET请求


public static void doGet(){

// 创建Httpclient对象

CloseableHttpClient httpclient = HttpClients.createDefault();

// 创建http GET请求

HttpGet httpGet = new HttpGet("http://www.oschina.net/");

CloseableHttpResponse response = null;

try {

// 执行请求

response = httpclient.execute(httpGet);

System.out.println(response.getStatusLine());

// 判断返回状态是否为200

if (response.getStatusLine().getStatusCode() == 200) {

String content = EntityUtils.toString(response.getEntity(), "UTF-8");

System.out.println("内容长度:" + content.length());

}

}catch(Exception e){

e.printStackTrace();

} finally {

if (response != null) {

try {

response.close();

} catch (IOException e) {

e.printStackTrace();

}

}

try {

httpclient.close();

} catch (IOException e) {

e.printStackTrace();

}

}

1.1.2.2     执行GET带参数


public static void doGetParam(){

// 创建Httpclient对象

CloseableHttpClient httpclient = HttpClients.createDefault();

CloseableHttpResponse response = null;

try {

// 定义请求的参数

URI uri = new URIBuilder("http://www.baidu.com/s").setParameter("wd", "数据库").build();

System.out.println(uri);

// 创建http GET请求

HttpGet httpGet = new HttpGet(uri);

// 执行请求

response = httpclient.execute(httpGet);

// 判断返回状态是否为200

if (response.getStatusLine().getStatusCode() == 200) {

String content = EntityUtils.toString(response.getEntity(), "UTF-8");

System.out.println(content);

}

}catch(Exception e){

e.printStackTrace();

}finally {

if (response != null) {

try {

response.close();

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

try {

httpclient.close();

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

}

1.1.2.3     执行post请求


public static void doPost(){

// 创建Httpclient对象

CloseableHttpClient httpclient = HttpClientBuilder.create().setRedirectStrategy(new LaxRedirectStrategy()).build();

// 创建http POST请求

HttpPost httpPost = new HttpPost("http://www.oschina.net/");

CloseableHttpResponse response = null;

try {

// 执行请求

response = httpclient.execute(httpPost);

System.out.println(response.getStatusLine());

// 判断返回状态是否为200

if (response.getStatusLine().getStatusCode() == 200) {

String content = EntityUtils.toString(response.getEntity(), "UTF-8");

System.out.println(content);

}

}catch(Exception e){

e.printStackTrace();

}finally {

if (response != null) {

try {

response.close();

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

try {

httpclient.close();

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

}

1.1.2.4     执行post带参数


public static void doPostParam() throws Exception{

// 创建Httpclient对象

CloseableHttpClient httpclient = HttpClientBuilder.create().setRedirectStrategy(new LaxRedirectStrategy()).build();

// 创建http POST请求

HttpPost httpPost = new HttpPost("http://www.oschina.net/search");

// 设置2个post参数,一个是scope、一个是q

List<NameValuePair> parameters = new ArrayList<NameValuePair>();

parameters.add(new BasicNameValuePair("scope", "project"));

parameters.add(new BasicNameValuePair("q", "java"));

// 构造一个form表单式的实体

UrlEncodedFormEntity formEntity = new UrlEncodedFormEntity(parameters);

// 将请求实体设置到httpPost对象中

httpPost.setEntity(formEntity);

CloseableHttpResponse response = null;

try {

// 执行请求

response = httpclient.execute(httpPost);

System.out.println(response.getStatusLine());

// 判断返回状态是否为200

if (response.getStatusLine().getStatusCode() == 200) {

String content = EntityUtils.toString(response.getEntity(), "UTF-8");

System.out.println(content);

}

} finally {

if (response != null) {

response.close();

}

httpclient.close();

}

}

1.1.3         httpclient常见问题及解决方案

1.1.3.1     请求参数乱码

设置请求的编码格式:


obj.addHeader("Content-Type","application/x-www-form-urlencoded; charset=UTF-8");

1.1.3.2     响应HTTP/1.1 403 Forbidden

原因:网站设置了反爬虫机制,禁止非法访问。

解决方案:伪装浏览器。


obj.addHeader("User-Agent"," Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537. 36 (KHTML, like Gecko) Chrome/31.0.1650.63")

原文地址:https://www.cnblogs.com/w410782823/p/11256665.html

时间: 2024-12-11 02:18:06

远程接口调用的相关文章

SmartRoute之远程接口调用和负载

基于接口的调用远比基于基础消息交互来得更简单和便于维护,特别在业务展现上,接口作为业务表现更适合其便利性.为了让SmartRoute更适合业务应用集成,在新的一年开始SmartRoute集成了远程接口调用功能.基于SmartRoute的基础特性,在这基础上扩展的接口调用会变得更简单灵活,其特别点如下:并不需要知道服务地址,只需要明确接口和方法即可以实现远程服务调用:无需任何配置即可实现负载和故障迁移.而这一系列的更利功能都归攻于SmartRoute基础建设! SmartRoute的远程接口调用是

EJB远程接口调用

一.EJB简介 EJB是sun的JavaEE服务器端组件模型,设计目标与核心应用是部署分布式应用程序.简单来说就是把已经编写好的程序(即:类)打包放在服务器上执行.凭借java跨平台的优势,用EJB技术部署的分布式系统可以不限于特定的平台.EJB (Enterprise JavaBean)是J2EE(javaEE)的一部分,定义了一个用于开发基于组件的企业多重应用程序的标准.其特点包括网络服务支持和核心开发工具(SDK). 在J2EE里,Enterprise Java Beans(EJB)称为J

springBoot使用feign实现远程接口调用和错误熔断

1.第一步,新建两个简单的springboot项目并创建rest接口 demo系统的rest接口 plus系统的调用接口 2.在项目pom文件里导入feign和hystrix的pom依赖包 <properties> <java.version>1.8</java.version> <spring-cloud.version>Greenwich.SR1</spring-cloud.version> </properties> <!

java之远程接口调用

1.项目结构 2.pom.xml <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">

以前写的一段aop,远程接口调用的日志。

using System;using System.Collections.Generic;using System.Linq;using System.Text; using Microsoft.Practices.Unity;using Microsoft.Practices.Unity.InterceptionExtension; namespace VirtualRemote.log4net{ public class LogHandler : ICallHandler { /// <s

[go]grpc远程接口调用实现

// grpc序列化/反序列化成对应语言的对象 // 1.写idl(数据类型+方法) // 2.生成对应语言的序列化/反序列化代码 // 3.方法需要自己实现 // 环境(将gopath/bin加入path) //安装grpc引擎 go get -u google.golang.org/grpc //安装grpc-go插件(适配go语言) go get -u github.com/golang/protobuf/protoc-gen-go //helloworld.proto // The re

dubbo_远程同步调用原理

Dubbo缺省协议采用单一长连接和NIO异步通讯,适合于小数据量大并发的服务调用,以及服务消费者机器数远大于服务提供者机器数的情况. Dubbo缺省协议,使用基于mina1.1.7+hessian3.2.1的tbremoting交互. 连接个数:单连接 连接方式:长连接 传输协议:TCP 传输方式:NIO异步传输 序列化:Hessian二进制序列化 适用范围:传入传出参数数据包较小(建议小于100K),消费者比提供者个数多,单一消费者无法压满提供者,尽量不要用dubbo协议传输大文件或超大字符串

Java学习笔记之RMI远程方法调用

RMI 应用通常有两个分开的程序组成,一个服务端程序和一个客户端程序.一个典型的服务端程序创建一些远程对象,使得对这些远程对象的引用可以被访问,等待客户端调用这些远程对象提供的方法.一个典型的客户端程序获取远程引用,指向一个或者多个服务端上的远程对象,然后调用这些远程对象所提供的方法.通常我们称这为分布式对象应用程序. 3.1 RMI的工作方式 分布式对象应用程序需要做的事情: l 查找(定位)远程对象. 应用程序可以使用各种不同的机制取得远程对象的引用.比如应用程序可以通过 RMI 提供的简单

XML-RPC远程方法调用

一.简介 XML-RPC的全称是XML Remote Procedure Call,即XML远程方法调用. 它是一套允许运行在不同操作系统.不同环境的程序实现基于Internet过程调用的规范和一系列的实现. 这种远程过程调用使用http作为传输协议,XML作为传送信息的编码格式. Xml-Rpc的定义尽可能的保持了简单,但同时能够传送.处理.返回复杂的数据结构. xml rpc使用http协议做为传输协议的rpc机制,使用xml文本的方式传输命令和数据. 一个rpc系统,必然包括2个部分: 1