0
点赞
收藏
分享

微信扫一扫

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

朱小落 2022-11-10 阅读 143


目前常用的请求方式有: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);
}

 

 

 

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

 

举报

相关推荐

0 条评论