实现请求url或者restful webservice的方式

来源:互联网 发布:为什么淘宝退款打不开 编辑:程序博客网 时间:2024/05/01 23:02

目前常用的请求方式有:httpclient和httpurl方式,但是常用的是httpclient

一、传统方式实现请求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

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



1 0
原创粉丝点击