????随着webService的崛起,我们开始中会越来越多的使用到访问远程webService服务。当然对于不同的webService框架一般都有自己的client包供使用,但是如果使用webService框架自己的client包,那么必然需要在自己的代码中引入它的包,如果同时调运了多个不同框架的webService,那么就需要同时引入多个不同的client包,这样做是很烦的。Java本生提供访问远程服务的包,在java.net.*下。接下来我们就用Java原生的package访问webService。
?
1、发送GET请求
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
class ?ReadByGet? implements ?Runnable {
???? public ?void ?run() {
???????? try ?{
???????????? URL url =? new ?URL(
???????????????????? "http://fanyi.youdao.com/openapi.do?keyfrom=gusi123123&key=1075925116&type=data&doctype=json&version=1.1&q=hello" );//此处访问有道的webService服务,参数都在url中
???????????? URLConnection connection = url.openConnection(); //得到一个连接对象
???????????? InputStream is = connection.getInputStream();
???????????? InputStreamReader isr =? new ?InputStreamReader(is,? "UTF-8" );
???????????? BufferedReader br =? new ?BufferedReader(isr); //用于读取返回的数据流
?
???????????? StringBuffer sb =? new ?StringBuffer(); //用于接收返回的数据
???????????? String line =? null ;
???????????? while ?((line = br.readLine()) !=? null ) {
???????????????? sb.append(line);
???????????? }
???????????? System.out.println(sb.toString());
???????????? br.close(); //关闭各种连接
???????????? isr.close();
???????????? is.close();
???????? }? catch ?(IOException e) {
???????????? e.printStackTrace();
???????? }
???? }
} |
?
2、发送POST请求
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
|
class ?ReadByPost? implements ?Runnable {
???? public ?void ?run() {
???????? try ?{
???????????? URL url =? new ?URL( "http://fanyi.youdao.com/openapi.do" );//此处通过post访问有道webService
???????????? // URLConnection connection = url.openConnection();
???????????? HttpURLConnection connection = (HttpURLConnection) url
???????????????????? .openConnection(); //得到一个http的连接对象
???????????? connection.addRequestProperty( "encoding" ,? "UTF-8" );
???????????? connection.setRequestMethod( "POST" ); //设置请求方式
???????????? connection.setDoInput( true ); //设置可写入
???????????? connection.setDoOutput( true ); //设置可读取
?
???????????? OutputStream os = connection.getOutputStream();
???????????? OutputStreamWriter osw =? new ?OutputStreamWriter(os,? "UTF-8" );
???????????? BufferedWriter bw =? new ?BufferedWriter(osw); //定义写入流对象
?
???????????? bw.write( "keyfrom=gusi123123&key=1075925116&type=data&doctype=xml&version=1.1&q=hello" );
???????????? bw.flush(); //通过写入流对象写入请求参数
?
???????????? InputStream is = connection.getInputStream();
???????????? InputStreamReader isr =? new ?InputStreamReader(is,? "UTF-8" );
???????????? BufferedReader br =? new ?BufferedReader(isr); //定义读取流对象
?
???????????? StringBuffer sb =? new ?StringBuffer();
???????????? String line =? null ;
???????????? while ?((line = br.readLine()) !=? null ) {
???????????????? sb.append(line);
???????????? } //通过读取流读取返回数据
?
???????????? //关闭各种连接对象
???????????? br.close();
???????????? isr.close();
???????????? is.close();
???????????? bw.close();
???????????? osw.close();
???????????? os.close();
?
???????????? System.out.println(sb.toString());
???????? }? catch ?(IOException e) {
???????????? e.printStackTrace();
???????? }
???? }
} |
?
????通过上面也发现使用java原生的package访问webService比较麻烦,然后我们伟大的apache也给我们提供通用的访问webService的jar包,需要的jar包依赖是:(使用到的类在org.apache.http.*)
<dependency>
????<groupId>org.apache.httpcomponents</groupId>
????<artifactId>httpclient</artifactId>
????<version>4.3.6</version>
</dependency>
?
3、通过httpclient发送GET请求
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
public ?class ?ReadByClientGet? implements ?Runnable {
???? HttpClient client = HttpClients.createDefault();
?
???? public ?void ?run() {
???????? String uri =? "http://www.baidu.com" ;//访问百度
???????? HttpGet get =? new ?HttpGet(uri); //得到请求对象
???????? try ?{
???????????? HttpResponse response = client.execute(get); //执行访问请求
???????????? HttpEntity entity = response.getEntity(); //得到返回数据
???????????? String result = EntityUtils.toString(entity,? "UTF-8" ); //将返回数据输出
???????????? System.out.println(result);
???????? }? catch ?(ClientProtocolException e) {
???????????? e.printStackTrace();
???????? }? catch ?(IOException e) {
???????????? e.printStackTrace();
???????? }
???? }
} |
?
4、通过httpclient发送POST请求
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
public ?class ?ReadByClientPost? implements ?Runnable {
???? HttpClient client = HttpClients.createDefault(); //创建一个client对象
???? public ?void ?run() {
???????? try ?{
???????????? String uri =? "http://fanyi.youdao.com/openapi.do" ;//post访问有道webService
???????????? HttpPost post =? new ?HttpPost(uri); //得到post请求对象
???????????? //构造请求参数,通过NameValuePair对象(类似于Map集合)
???????????? List<NameValuePair> parameters =? new ?ArrayList<NameValuePair>();
???????????? parameters.add( new ?BasicNameValuePair( "keyfrom" ,? "gusi123123" ));
???????????? parameters.add( new ?BasicNameValuePair( "key" ,? "1075925116" ));
???????????? parameters.add( new ?BasicNameValuePair( "type" ,? "data" ));
???????????? parameters.add( new ?BasicNameValuePair( "doctype" ,? "json" ));
???????????? parameters.add( new ?BasicNameValuePair( "version" ,? "1.1" ));
???????????? parameters.add( new ?BasicNameValuePair( "q" ,? "java" ));
???????????? post.setEntity( new ?UrlEncodedFormEntity(parameters, "UTF-8" ));
?
???????????? HttpResponse response = client.execute(post); //执行post请求,并且接收返回数据
???????????? HttpEntity entity = response.getEntity();
???????????? String result = EntityUtils.toString(entity,? "UTF-8" );
???????????? System.out.println(result); //输出返回数据
???????? }? catch ?(ClientProtocolException e) {
???????????? e.printStackTrace();
???????? }? catch ?(IOException e) {
???????????? e.printStackTrace();
???????? }
???? }
} |
????通过上面httpclient只是最简单的基本的访问webService服务。当然还有很多其他细节以及功能可以设计和处理。接下来通过测试方法测试上面的四种访问请求的结果:(输出结果不再粘贴)
1
2
3
4
5
6
7
8
|
public ?class ?Main {
???? public ?static ?void ?main(String[] args) {
???????? // new Thread(new ReadByGet()).start();
???????? // new Thread(new ReadByPost()).start();
???????? // new Thread(new ReadByClientGet()).start();
???????? //new Thread(new ReadByClientPost()).start();
???? }
} |
?
原文:http://dyygusi.iteye.com/blog/2217259