`
747017186
  • 浏览: 331485 次
社区版块
存档分类
最新评论

HttpURLConnection用流传递参数

 
阅读更多

以前做过HttpURLConnection传递参数的例子,这次用流来实现,看下面的这个例子。

工具类:

package com.hljw.health.y100.job;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.nio.charset.Charset;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

import com.alibaba.fastjson.JSON;
import com.hljw.health.y100.pojo.CommunityParametersObject;
import com.hljw.util.DateUtil;


public class HttpClient {
	private static String _default_encoding = Charset.defaultCharset().name();
//1.发送请求
	public static String getResopnseData(String data,String url) {
		try {
			HttpURLConnection connection = getURL(url);

			return sendRequest(connection, data);
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;
	}

//创建httpconn对象
	private static HttpURLConnection getURL(String wsUrl) throws Exception {
		URL url = new URL(wsUrl);
		HttpURLConnection httpConn = (HttpURLConnection) url.openConnection();
		httpConn.setRequestProperty("content-type", "text/html");//参数穿不过去请设置这一条
		httpConn.setRequestProperty("Accept-Charset", "utf-8");
		httpConn.setRequestMethod("POST");
		httpConn.setUseCaches(false);
		httpConn.setDoInput(true);
		httpConn.setDoOutput(true);
		Charset.availableCharsets();
		httpConn.setInstanceFollowRedirects(true);
		return httpConn;
	}

//发送请求参数,并得到服务端的返回信息
	private static String sendRequest(HttpURLConnection conn, String data)
			throws Exception {
		conn.getOutputStream().write(data.getBytes("utf-8"));
		conn.getOutputStream().flush();
		conn.getOutputStream().close();
		return response(conn);

	}

	private static String response(HttpURLConnection conn) throws Exception {

		StringBuffer info = new StringBuffer();
		BufferedReader reader = new BufferedReader(new InputStreamReader(conn
				.getInputStream(),"utf-8"));
		// BufferedReader reader = new BufferedReader(new
		// InputStreamReader(conn.getInputStream()));
		// conn.connect();
		System.out.println("=============================");
		System.out.println("Contents of post request");
		System.out.println("=============================");

		String line = reader.readLine();
		while (line != null) {
			info.append(line);

			line = reader.readLine();
		}
		System.out.println("=============================");
		System.out.println("Contents of post request ends");
		System.out.println("=============================");
		reader.close();

		String ecod = conn.getContentEncoding();
		if (ecod == null) {
			ecod = _default_encoding;
		}

		String resData = new String(java.net.URLDecoder.decode(info.toString(),
				"UTF-8").getBytes());// ecod
		conn.disconnect();
		return resData;
		// Object obj = getResult(resData);
	}

}

 

服务端:

服务端是一个servlet用来接收发过来的参数处理业务逻辑,向客户端返回信息

package com.hljw.health.y100.service.pinstitutions;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.alibaba.fastjson.JSON;
import com.hljw.health.plat.service.pinstitutions.PInstitutionsService;
import com.hljw.util.SpringUtil;
import com.hljw.util.StringUtil;

public class PInstitutionsServiceServlet extends HttpServlet{
	private PInstitutionsService pInstitutionsService = (PInstitutionsService) SpringUtil.getBean("pInstitutionsService");
	@Override
	protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		// TODO Auto-generated method stub
		this.doPost(request, response);
	}

	@Override
	protected void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		// TODO Auto-generated method stub
		System.out.println("ok");
		System.out.println(pInstitutionsService);
		
		ResultObject res=parseResult(request);//解析参数
		System.out.println(res);
		callBackPrint("哈哈,好的呢?dd", response);//想客户端打印信息
		
//		pInstitutionsService.getPInstitutionsByOrgCode(institutions_code);
	}
	
	/**
	 * 解析参数、回调的内容
	 * @param request
	 * @return
	 * @throws IOException
	 */
	private ResultObject parseResult(HttpServletRequest request) throws IOException{
		StringBuffer info = new StringBuffer();
		BufferedReader reader = new BufferedReader(new InputStreamReader(request.getInputStream(),"UTF-8")); //防止中文乱码
		String line = reader.readLine();
		while (!StringUtil.isBlank(line)) {
			info.append(line);
			line = reader.readLine();
		}
		ResultObject obj = null;
		if(info.length()>0){
			obj = JSON.parseObject(info.toString(), ResultObject.class);
		}
		return obj;
	}
	
	/**
	 * 回调打印信息
	 * @author hjh
	 * @return
	 */
	private void callBackPrint(String content,HttpServletResponse response) throws IOException{
		/*
		 * 在调用getWriter之前未设置编码(既调用setContentType或者setCharacterEncoding方法设置编码),
		 * HttpServletResponse则会返回一个用默认的编码(既ISO-8859-1)编码的PrintWriter实例。这样就会
		 * 造成中文乱码。而且设置编码时必须在调用getWriter之前设置,不然是无效的。
		 * */
		response.setContentType("text/html;charset=UTF-8");
		response.setCharacterEncoding("UTF-8");
		PrintWriter out = response.getWriter();
		//JSON在传递过程中是普通字符串形式传递的,这里简单拼接一个做测试
		out.print(content);
		out.flush();
		out.close();
	}
}

 测试类

package com.hljw.health.y100.service.pinstitutions;

import com.alibaba.fastjson.JSON;
import com.hljw.health.y100.job.HttpClient;

public class Test {
	public static void main(String[] args) {
		System.out.println("rrrr");
		ResultObject res=new ResultObject();
		res.setStatus("1");
		res.setOpear("check中国");
		
		String resStr = HttpClient.getResopnseData(JSON.toJSONString(res),"http://localhost:8080/healthplat/pInstitutions.action");//发送数据,并得到服务端返回的信息
		System.out.println("**********"+resStr);
	}
}

 参数的传递用的json格式的数据,当然你也可以用其他的格式,值得注意的是

1.参数如果在服务端无法接收是因为在发送的方法里面没有设定,这个问题困扰了我很久,因为无论是servlet,还是struts1,struts2,都没有设置这一个,所以自己要设置一下。

 

httpConn.setRequestProperty("content-type", "text/html");//参数穿不过去请设置这一条

2.无论什么时候中文出现乱码是因为编码不统一,注意以下几个地方。

a.工具类里面发送的时候要设置中文utf-8编码

b.工具类接收服务端回调请求要设置UTF-8编码

c.服务端servlet接收参数流要用utf-8编码

d.服务端servlet想客户端打印字符的时候要设置UTF-8编码。


分享到:
评论

相关推荐

    HttpURLConnection servlet 多文件参数 断点上传

    本知识点将深入探讨如何使用`HttpURLConnection`与Servlet协同工作,处理多文件参数以及实现断点上传功能。 首先,`HttpURLConnection`是Java API中的一个核心类,它负责提供HTTP协议的连接功能。相比Apache ...

    HttpURLConnection实现三方接口调用,带有FILE文件参数

    HttpURLConnection实现三方接口HTTP调用调用,带有FILE文件参数

    HttpURLConnection文件下载\httpURLConnection文件下载

    在给定的代码片段中,展示了如何使用`HttpURLConnection`进行文件下载。 首先,我们看到代码引入了`java.io`、`java.net`和`java.util`这三个包。`java.io`包含了输入/输出流,用于处理数据的读写;`java.net`包含...

    使用HttpUrlConnection实现上传文件 服务器端代码

    本篇文章将详细讲解如何使用`HttpURLConnection`实现文件上传,同时涉及到服务器端处理上传文件的代码。我们将讨论以下核心知识点: 1. **HttpURLConnection介绍**: `HttpURLConnection`是Java标准库中的类,它是...

    JAVA通过HttpURLConnection 上传和下载文件的方法

    下面是一个使用HttpURLConnection上传文件的示例代码: ```java public class HttpConnectionUtil { public static String uploadFile(String actionUrl, String[] uploadFilePaths) { String end = "\r\n"; ...

    HttpURLConnection调用三方HTTP接口,带有FILE文件参数

    HttpURLConnection调用三方HTTP接口,带有FILE文件参数

    HttpURLConnection使用总结示例源码

    本篇文章将深入探讨HttpURLConnection的使用方法、特性以及一些关键的示例代码。 一、HttpURLConnection简介 HttpURLConnection继承自URLConnection,它提供了对HTTP协议的直接支持。相比于HttpClient,...

    Android 简单使用 HttpURLConnection

    本篇文章将深入探讨如何在Android中简单使用`HttpURLConnection`进行网络请求。 首先,了解`HttpURLConnection`的基本用法。在Android中,网络操作通常在子线程(非UI线程)中进行,以避免阻塞主线程导致应用无响应...

    使用HttpURLConnection或HttpClient方式传json值到spring中

    本文将详细介绍如何使用`HttpURLConnection`和`HttpClient`这两种方式来实现这一目标。 首先,让我们从`HttpURLConnection`开始。`HttpURLConnection`是Java内置的HTTP客户端,它简单且易于使用,适用于轻量级的...

    本示例使用HttpUrlConnection实现上传文件

    1. **创建连接**:使用`URL`对象构造一个`HttpURLConnection`实例,通常会通过`openConnection()`方法来实现。例如: ```java URL url = new URL("http://yourserver.com/upload"); HttpURLConnection connection...

    使用HttpURLConnection发送短信

    通过以上分析可以看出,使用`HttpURLConnection`发送短信的过程主要包括了配置参数、编码内容、构建URL、创建连接并发送请求以及异常处理等几个步骤。这种方式虽然简单易行,但在实际生产环境中还需要考虑到安全性...

    使用HttpURLConnection下载图片

    在本例中,我们将探讨如何使用`HttpURLConnection`来下载图片,这是一个基础但实用的网络编程任务。下面我们将详细介绍这个过程,并涉及到的相关知识点。 1. **HttpURLConnection简介**: `HttpURLConnection`是`...

    Android HttpUrlConnection json使用方法

    在使用HttpUrlConnection发送GET请求时,我们将参数附加到URL上。例如,如果我们要从一个API获取JSON数据,URL可能类似于`http://api.example.com/data?key=value`。然后,我们可以创建一个HttpURLConnection实例,...

    Httpurlconnection

    在这个主题中,我们将深入探讨HttpURLConnection的基本操作及其在实际应用中的使用。 首先,了解HttpURLConnection的基本结构是非常重要的。它继承自URLConnection类,提供了对HTTP协议的支持。通过URL对象的open...

    HttpURLConnection

    HttpURLConnection的demo,里面有网络请求get post 上传文件,下载文件,介绍HttpURLConnection这个类整体流程是怎样使用的,方便初学者学习

    AsyncTask结合HttpUrlConnection的例子

    `AsyncTask`包含三个泛型参数:`Params`、`Progress`和`Result`,分别代表输入参数类型、进度类型和返回结果类型。在`AsyncTask`中,主要涉及以下几个关键方法: 1. `onPreExecute()`:在执行任务前调用,通常用于...

    HttpURLConnection获取json数据解析

    本篇将详细讲解如何使用HttpURLConnection获取JSON数据并进行解析。首先,我们需要理解HttpURLConnection的基本用法,然后了解JSON数据的解析方法,以及如何在Android主线程和子线程之间通过Handler进行数据传递。 ...

    HttpUrlConnection使用示例

    本篇文章将深入探讨如何使用`HttpURLConnection`以POST方式提交请求。 ### 1. 创建连接 首先,我们需要获取到`HttpURLConnection`实例。这通常通过调用`URL`对象的`openConnection()`方法实现,然后强制转换为`...

    Android-使用HttpURLConnection实现断点续传

    在Android开发中,网络编程是不可或...使用HttpURLConnection可以方便地实现这些操作,提高应用的用户体验。在实际开发中,我们还需要考虑多线程下载、并发控制、下载队列管理等高级特性,以进一步优化性能和资源利用。

Global site tag (gtag.js) - Google Analytics