[Java基础]-- 实现请求url或者restful webservice的方式

目前常用的请求方式有:httpclient和httpurl方式,但是常用的是httpclient。目前csdn的代码块编辑报错,只能直接贴代码了。

一、传统方式实现请求url,参数是字符串

 

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;

public class TestClient {
    public static void main(String[] args) {

        String urlString="http://127.0.0.1:8888/services/station/addBasicStation?id=12&name=名称&format=json&v=1.0";
        BufferedReader br=null;
        try{
            //创建url请求
            URL url=new URL(urlString);
            //连接请求协议
            HttpURLConnection _url=(HttpURLConnection)url.openConnection();
            //设置请求方法
            _url.setRequestMethod("GET");
            //设置请求开启连接
            _url.connect();
            //写入请求参数,记得把字节流转换成字符流
            br=new BufferedReader(new InputStreamReader(_url.getInputStream()));//_url.getInputStream()是URL返回的流
            //实现读入内存的操作
            String content="";
            StringBuffer ss=new StringBuffer();

            while((content=br.readLine())!=null){
                ss.append(content);
            }
            System.out.println("打印输出结果:"+ss.toString());
        }catch(Exception e){
            throw new RuntimeException(e);
        }finally{
            try {
                br.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}
 

 

二、传统方式实现请求url,参数是文件流

 

 

以下是client端代码:

import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;


/**
  *功能:测试向url发送txt文件,并且获取url的返回值
  */


public class HandoutTxtToMdAction extends HttpServlet {

public void service(HttpServletRequest request,HttpServletResponse response) throws IOException, ServletException {


//需要下发的文件名称路径
String path = "/usr/test/呵呵.txt";
String filename="呵呵";
String ip="192.168.1.108";
//编码filename防止文件名称乱码
java.net.URLEncoder.encode(filename, "ISO-8859-1"); 
// 需要传递给哪个url路径
String severUrl = "http://" + ip + ":8080/mdWeb/getTxt";
BufferedReader br=null;
try {
/*
* 创建url连接
*/
//编码url
java.net.URLEncoder.encode(severUrl, "ISO-8859-1"); 
URL url = new URL(severUrl);
HttpURLConnection h_urlcon = (HttpURLConnection) url.openConnection();
// 在JDK 1.5以后可以这样来设置超时时间 (毫秒)
// 设置连接主机超时时间30s
h_urlcon.setConnectTimeout(30000);
// 设置读取数据超时时间30秒
h_urlcon.setReadTimeout(30000);
// 设置是否向httpUrlConnection输出,因为这个是post请求,参数要放在
// http正文中,设置为true,默认是false
h_urlcon.setDoOutput(true);
// 设置是否从httpUrlConnection读取,默认为true
h_urlcon.setDoInput(true);
h_urlcon.setChunkedStreamingMode(1024 * 1024);
// 默认是get方法
h_urlcon.setRequestMethod("POST");
h_urlcon.setRequestProperty("connection", "Keep-Alive");
h_urlcon.setRequestProperty("charsert", "UTF-8");
// 设定传送的内容类型是可序列化的java对象,如果不设置,可能在web服务器传送序列化对象时会抛出java.io.Exception异常
h_urlcon.setRequestProperty("content-Type","multipart/form-data;file=" + filename);
// server接收时的参数名称为filename
h_urlcon.setRequestProperty("filename", filename);
// 写到内存,保存到本地
OutputStream out = new DataOutputStream(h_urlcon.getOutputStream());
DataInputStream in = new DataInputStream(new FileInputStream(path));
int bytes = 0;
byte[] bufferOut = new byte[1024];
while ((bytes = in.read(bufferOut)) != -1) {
out.write(bufferOut, 0, bytes);
}
in.close();
out.flush();
out.close();
//写入请求参数,记得把字节流转换成字符流
   br=new BufferedReader(new InputStreamReader(h_urlcon.getInputStream()));//h_urlcon.getInputStream()是severUrl返回的流
//实现读入内存的操作
String content="";
StringBuffer ss=new StringBuffer();
while((content=br.readLine())!=null){
ss.append(content);
}
System.out.println("severUrl 返回的值是:"+ss);

} catch (Exception e) {
System.out.println(e.getMessage());
}
}
}

以下是服务端代码:

import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * 
 *@类功能说明:
 *@修改人员名: yang
 */
@SuppressWarnings("serial")
public class GetTXTForMd extends HttpServlet {

public void service(HttpServletRequest request, HttpServletResponse response)
throws IOException, ServletException {
//保存到本地的txt的路径
String txtPath="/usr/test/my.txt";
//返回给client需要的字符串
StringBuffer  txtStr=null;
StringBuffer sb=null;
  try{
  /**
   *  接收request文件流
   */
  sb=new StringBuffer();
  InputStream in = request.getInputStream();
  // 接收传递的文件名称filename
  //转码文件名称,否则会乱码
  String name = new String(request.getHeader("filename").getBytes("ISO-8859-1"),"UTF-8");
  System.out.println("----------接收到的txt文件名称:----"+name);
 
  // 写入文件到本地
  FileOutputStream fos = new FileOutputStream(txtPath);
  // 写入文件流到文件中
  byte[] buffer = new byte[1024];
  int bytes = 0;
  while ((bytes = in.read(buffer)) != -1) {
  fos.write(buffer, 0, bytes);
  }
  in.close();
  fos.flush();
  fos.close();
   System.out.println("----------server接收txt文件成功!------");
  /*
   * server返回给client客户端接收txt成功
   */
  txtStr=sb.append("server接收txt成功");
  InputStream inStream = new ByteArrayInputStream(txtStr.toString().getBytes());
response.setContentType("application/octet-stream");
response.setHeader("Content-Disposition","attachment;filename=\""+new String ("returnMessage".getBytes("UTF-8"),"ISO8859-1")+"\"");
byte[] b = new byte[100];
int len;
while ((len = inStream.read(b)) > 0)
response.getOutputStream().write(b, 0, len);
inStream.close();
  }catch(Exception e){
  /*
   * server返回给客户端接收txt失败
   */
  InputStream inStream = new ByteArrayInputStream("接收失败".getBytes());
response.setContentType("application/octet-stream");
response.setHeader("Content-Disposition","attachment;filename=\""+new String ("returnMessage".getBytes("UTF-8"),"ISO8859-1")+"\"");
byte[] b = new byte[100];
int len;
while ((len = inStream.read(b)) > 0)
response.getOutputStream().write(b, 0, len);
inStream.close();
  }
}
}

二、使用httpclient方式调用url

get方式调用:

 

import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;

import java.io.IOException;
import java.io.InputStream;

/**
 * httpclient方式调用webservice
 */
public class httpTest {
    public static void main(String[] args) throws ClientProtocolException, IOException {
        //访问的url
        HttpGet get = new HttpGet("http://localhost:9000/services/user/getUser?id=12&name=lisi");
        HttpClient httpclient = new DefaultHttpClient();
 
// 如果指定返回值是json:get.addHeader("ACCEPT", "application/json");

get.addHeader("ACCEPT", "text/xml"); HttpResponse response = httpclient.execute(get); //获取返回值  

 	 InputStream ins = response.getEntity().getContent();     
  	 byte[] b = new byte[1024];     
  	 StringBuilder sb = new StringBuilder();     
   	while (ins.read(b) != -1) {           
 		sb.append(new String(b, "UTF-8"));     
   	}       
 		System.out.println("返回值内容:"+sb.toString()); 
  }}

 

Post方式调用web service:

 

import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicHeader;
import org.apache.http.protocol.HTTP;
import org.apache.http.util.EntityUtils;
import org.junit.Test;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;

 

 

 /**测试Post方式请求Url*/
    @Test
    public void testPost()throws Exception{
         String APPLICATION_JSON = "application/json"; //接收类型
         String CONTENT_TYPE_TEXT_JSON = "text/json";   //内容格式
         String urlPost="http://localhost:9000/services/user/getPostuser";//url
        String json="{\"message\":{\"id\":\"001\",\"name\":\"guo\"}}";    //发送的json串
        // 将JSON进行UTF-8编码,以便传输中文
        String encoderJson = URLEncoder.encode(json, HTTP.UTF_8);
//        String encoderJson = json;
        DefaultHttpClient httpClient = new DefaultHttpClient();
        HttpPost httpPost = new HttpPost(urlPost);
        httpPost.addHeader(HTTP.CONTENT_TYPE, APPLICATION_JSON);

        StringEntity se = new StringEntity(encoderJson);
        se.setContentType(CONTENT_TYPE_TEXT_JSON);    //请求内容格式
        se.setContentEncoding(new BasicHeader(HTTP.CONTENT_TYPE, APPLICATION_JSON));
        httpPost.setEntity(se);
        HttpResponse response = httpClient.execute(httpPost);
        String result= EntityUtils.toString(response.getEntity());
        System.out.println("返回结果:"+result);
    }

 

 

 

以上测试均通过,可以直接使用!

 

长连接访问:http://blog.csdn.net/xieyuooo/article/details/7182354

注意:可以实现一次链接,多次请求(服务器端需要支持长链接才行!!!!)

 

 

评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

往事随风ing

你的鼓励将是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值