记录一下JAVA环境下如何在代理下使用HttpURLConnection

合集下载

java服务器间http通讯,同时传输文件流和数据,并接收返回的文件流或数据

java服务器间http通讯,同时传输文件流和数据,并接收返回的文件流或数据

java服务器间http通讯,同时传输⽂件流和数据,并接收返回的⽂件流或数据废话:这⾥使⽤的是HttpUrlConnection,httpclient没有试过,这篇⽂章也是收集了很多⼤佬的成果,但是由于太久远了找不到原⽂了,如果有⼤佬看到提醒⼀下,愿意贴上原⽂链接的哈,抱歉抱歉,现在实现了同时传输⽂件和数据,但是response返回的⽂件和数据只能接收⼀个,如果⼤家有同时接收的⽅法,望告知,谢谢⼤家了。

需求:其实就是服务器间通过http进⾏通讯,不⾛前端的那种,公司需求给某个⽹址主动发⽂件流,并且接收response中的反馈⽂件流或者错误信息。

连接⼯具类HttpUrlConnection.java,现在⽀持传多个数据,⼀个⽂件,如果需要多个⽂件,照着改改应该没问题的@Componentpublic class HttpUrlConnection {//头部格式private static final String nextLine = "\r\n";private static final String twoHyphens = "--";//随便写⼀个private static final String boundary = java.util.UUID.randomUUID().toString();/*** @Description:java项⽬的服务端之间的通信* @Param: [requestUrl,请求url* jsessionId, 浏览器的访问的Cookie,即被访问的服务端的session。

若被访问的服务器没有做url过滤器,则该参数可以为null。

* file, 发送出去的⽂件* feedbackFile, 收到的反馈⽂件存放位置* name,对⽅⽤来接收⽂件的名字* params,要传的参数* @Return: java.util.Map* @Author: Liting* @Date: 2019-11-26 08:54*/public static Map httpUrlConnection(String requestUrl, String jsessionId, File file, String feedbackFile, String name, Map<String,String> params) throws IOException { HttpURLConnection con = (HttpURLConnection) new URL(requestUrl).openConnection();if (!Utils.isEmpty(jsessionId)) {con.setRequestProperty("Cookie", "JSESSIONID=" + jsessionId);}// 设置是否向httpUrlConnection输出,因为这个是post请求,参数要放在// http正⽂内,因此需要设为true, 默认情况下是false;con.setDoOutput(true);// 设置是否从httpUrlConnection读⼊,默认情况下是true;con.setDoInput(true);// 设定请求的⽅法为"POST",默认是GETcon.setRequestMethod("POST");// Post 请求不能使⽤缓存con.setUseCaches(false);//设置接收返回值的格式con.setRequestProperty("Accept", "text/plain, */*");//设置接收编码con.setRequestProperty("Accept-Language", "zh-cn");con.setRequestProperty("Host","127.0.0.1");//设置请求参数格式以及boundary分割线con.setRequestProperty("Content-Type", "multipart/form-data;boundary=" + boundary);con.setRequestProperty("User-Agent"," WinHttpClient");//开启长连接可以持续传输con.setRequestProperty("Connection", "Keep-Alive"); //连接超时时间20秒con.setConnectTimeout(20000); //读取超时时间20秒con.setReadTimeout(20000);OutputStream out = con.getOutputStream();//分隔符头部//拼接参数if (!Utils.isEmpty(params)){int i = 0;for (String paramName : params.keySet()){StringBuffer strBufparam = new StringBuffer();strBufparam.append(twoHyphens);strBufparam.append(boundary);strBufparam.append(nextLine);strBufparam.append("Content-Disposition: form-data;name=\""+paramName+"\"");strBufparam.append(nextLine);strBufparam.append("Content-Type: " + "text/plain");strBufparam.append(nextLine);strBufparam.append("Content-Length: " + params.get(paramName).getBytes().length);strBufparam.append(nextLine);strBufparam.append(nextLine);strBufparam.append(params.get(paramName));i++;if (i!=params.size()){strBufparam.append(nextLine);}out.write(strBufparam.toString().getBytes());}}//拼接⽂件if (!Utils.isEmpty(file)){StringBuffer strBufFile = new StringBuffer();strBufFile.append(nextLine);strBufFile.append(twoHyphens);strBufFile.append(boundary);strBufFile.append(nextLine);strBufFile.append("Content-Disposition: form-data; name=\""+name+"\"; filename=\"" + file.getName() + "\""); strBufFile.append(nextLine);strBufFile.append("Content-Type: " + "application/x-tar");strBufFile.append(nextLine);strBufFile.append("Content-Length: " + file.length());strBufFile.append(nextLine);strBufFile.append(nextLine);//写⼊输出流out.write(strBufFile.toString().getBytes());//读取本地⽂件流FileInputStream inputStream = new FileInputStream(file);byte[] data = new byte[2048];int len = 0;int sum = 0;while ((len = inputStream.read(data)) != -1) {//将读取到的本地⽂件流读取到HttpsURLConnection,进⾏上传out.write(data, 0, len);sum = len + sum;}//⽂件写⼊完成后加回车out.write(nextLine.getBytes());inputStream.close();}//写⼊结束分隔符String footer = nextLine + twoHyphens + boundary + twoHyphens + nextLine;out.write(footer.getBytes());out.flush();out.close();con.connect();int responseCode = con.getResponseCode();if (responseCode == HttpURLConnection.HTTP_OK) {if (!Utils.isEmpty(feedbackFile)) {//有返回⽂件的时候String fileName = "";try {fileName = con.getHeaderField(1).substring(21, con.getHeaderField(1).length() - 1);fileName = "EBDT"+fileName.split("_")[1];System.out.println(fileName);}catch (Exception e){return null;}BufferedInputStream in = new BufferedInputStream(con.getInputStream());File f = new File(feedbackFile);if (!f.exists()) {f.mkdirs();}File res = new File(feedbackFile+"/"+fileName);FileOutputStream fos = new FileOutputStream(res);byte[] by = new byte[1024];int length = 0;while ((length = in.read(by)) != -1) {fos.write(by, 0, length);}fos.close();in.close();con.disconnect();if (Utils.isEmpty(fos)) {return null;}//处理接收到的⽂件//保存到本地Map map = new HashMap();map.put("fileName",fileName);return map;}else{//接收到的return中的值BufferedReader br = new BufferedReader(new InputStreamReader(con.getInputStream()));String s = br.readLine();br.close();con.disconnect();try{if (!Utils.isEmpty(s)){Object m = JSONObject.parse(s);Map map = (Map) m;return map;}}catch (Exception e){Map map = new HashMap();map.put("feedback",s);return map;}}return new HashMap();} else {con.disconnect();return null;}}}main⽅法测试public static void main(String[] args) throws IOException {Map<String,String> map = new HashMap<>();map.put("name","张三");map.put("age","23");File file = new File("D:\\1.xml");Map map1 = HttpUrlConnection.httpUrlConnection("http://127.0.0.1/user/addUser", "69e4baee-ff22-4cdf-a73b-6156c5d6d2c1", file, "", "files", map);System.out.println(map1);}结果到这就是全部了,如有问题欢迎留⾔。

java后台使用HttpURLConnection实现百度主动推送

java后台使用HttpURLConnection实现百度主动推送

java后台使⽤HttpURLConnection实现百度主动推送优点是快不需要页⾯执⾏,,发布⽂章之后⽴即推送,所以,不管有没有⼈访问,都可以⾃动实时推送尝试了⼀下httpclient,没找到相关资料,post⽅式⽆法塞url进去最后改为import .URL;import .URLConnection;⽂章发布后,调⽤saveOrUpdate⽅法,⼊库之后调⽤推送private void activelyPush(Session session, ArticleModel articleModel) throws IOException {ActivelyPushDao apd = new ActivelyPushDao();List<ActivelyPush> activelyPushs = apd.getAll(session);//获取所有要推送的搜索引擎String[] Parameters = {"你的⽹站/" + articleModel.getAuthor_column_py() + "/" + articleModel.getId() + ".html"};for (ActivelyPush ap : activelyPushs) {String result = "";PrintWriter out = null;BufferedReader in = null;try {//建⽴URL之间的连接URL url = new URL(ap.getUrl());URLConnection conn = url.openConnection();//设置通⽤的请求属性conn.setRequestProperty("Host", "");conn.setRequestProperty("User-Agent", "curl/7.12.1");conn.setRequestProperty("Content-Length", "83");conn.setRequestProperty("Content-Type", "text/plain");//发送POST请求必须设置如下两⾏conn.setDoInput(true);conn.setDoOutput(true);//获取conn对应的输出流out = new PrintWriter(conn.getOutputStream());//发送请求参数String param = "";for (String s : Parameters) {param += s + "\n";}out.print(param.trim());//进⾏输出流的缓冲out.flush();//通过BufferedReader输⼊流来读取Url的响应in = new BufferedReader(new InputStreamReader(conn.getInputStream()));String line;while ((line = in.readLine()) != null) {result += line;}} catch (Exception e) {System.out.println("发送post请求出现异常!" + e);e.printStackTrace();} finally {try {if (out != null) {out.close();}if (in != null) {in.close();}} catch (IOException ex) {ex.printStackTrace();}}}}。

Java使用JaxWsDynamicClientFactory和HttpURLConnec。。。

Java使用JaxWsDynamicClientFactory和HttpURLConnec。。。

Java使⽤JaxWsDynamicClientFactory和HttpURLConnec。

⽅式1.代理类⼯⼚的⽅式,需要拿到对⽅的接⼝try {// 接⼝地址// 代理⼯⼚JaxWsProxyFactoryBean jaxWsProxyFactoryBean = new JaxWsProxyFactoryBean();// 设置代理地址 wsdlAddress: WSDL地址(http://localhost:8082/ws/services/bank?wsdl)jaxWsProxyFactoryBean.setAddress(wsdlAddress);// 设置接⼝类型jaxWsProxyFactoryBean.setServiceClass(ICommonService.class);// 创建⼀个代理接⼝实现ICommonService cs = (ICommonService) jaxWsProxyFactoryBean.create();// 数据准备String userName = "Leftso";// 调⽤代理接⼝的⽅法调⽤并返回结果String result = cs.sayHello(userName);System.out.println("返回结果:" + result);} catch (Exception e) {e.printStackTrace();}⽅式2. 动态调⽤⽅式 //WSDL路径 String wsUrl = "http://localhost:8082/ws/services/bank?wsdl" ;//⽅法名String method = "getCaseProve";JaxWsDynamicClientFactory factory = JaxWsDynamicClientFactory.newInstance();Client client = factory.createClient(wsUrl);Endpoint endpoint = client.getEndpoint();QName opName = new QName(endpoint.getService().getName().getNamespaceURI(), method);BindingInfo bindingInfo = endpoint.getEndpointInfo().getBinding();System.out.println(client);if (bindingInfo.getOperation(opName) == null) {for (BindingOperationInfo operationInfo : bindingInfo.getOperations()) {if (method.equals(operationInfo.getName().getLocalPart())) {opName = operationInfo.getName();break;}}} //请求报⽂ String xmlInput= "<Request RequestType=\"RegInfo\"><MachineInfo MachineAccount=\"1\" MachinePassword=\"1\"></MachineInfo><FiterInfo UnitNo=\""+ unit+ "\" HouseID=\""+ houseId+ "\" RecHouseNum=\""+ recHouseNum + "\"></FiterInfo></Request>"; Object[] res = null;try {res = client.invoke(opName, xmlInput);String xml = (String) res[0];System.err.println("@@@@@@@@@@@@@@@@@"+xml);} catch (Exception e) {e.printStackTrace();}⽅式2所需jar 百度云盘⽅式3. HttpURLConnection调⽤⽅式第⼀步(读取配置⽂件):public class PropertiesUtil {private static final Logger logger = LoggerFactory.getLogger(PropertiesUtil.class);private static Properties properties = null;private static String fileName = "/app.properties";static {properties = new Properties();try {properties.load(PropertiesUtil.class.getResourceAsStream(fileName));} catch (IOException e) {logger.error("加载配置⽂件失败", e);}}public static Properties getProperties() {return properties;}public static String getProp(String propName) {return properties.getProperty(propName);}}public static Map<String, String> resultInterface(String id,String type, String jsonStr) {StringBuilder res = new StringBuilder();// 1:创建服务地址URL url;String resultUserName = PropertiesUtil.getProp("resultUserName");String resultPassWord = PropertiesUtil.getProp("resultPassWord");Map<String, String> map = new HashMap<String, String>();try {url = new URL(PropertiesUtil.getProp("resultUrl"));// 2:打开到服务地址的⼀个连接HttpURLConnection connection = (HttpURLConnection) url.openConnection();// 3:设置连接参数// 3.1设置发送⽅式:POST必须⼤写connection.setRequestMethod("POST");// 3.2设置数据格式:Content-typeconnection.setRequestProperty("content-type", "text/xml;charset=utf-8");// 3.3设置输⼊输出,新创建的connection默认是没有读写权限的,connection.setDoInput(true);connection.setDoOutput(true);//"{\"ANNOUNCEMENT_CODE\": \"CSGGBH001\",\"ANNOUNCEMENT_CONNECT\": \"asdfasdfasdfasdfasdfasdfasdfsa\",\"ANNOUNCEMENT_DEADLINE\": \"20181031\",\"ANNOUNCEMENT_GUID\": \"71F15848-C296-4A60-883C-223C //TDJYGG// 4:组织SOAP协议数据,发送给服务端String soapXML = "<soap12:Envelope xmlns:xsi=\"/2001/XMLSchema-instance\" xmlns:xsd=\"/2001/XMLSchema\" xmlns:soap12=\"/2003/05/soap-envelope\">"+ " <soap12:Header> "+ " <root xmlns=\"/\"> "+ " <UserName>"+resultUserName+"</UserName> "+ " <PassWord>"+resultPassWord+"</PassWord> "+ " </root> "+ " </soap12:Header> "+ " <soap12:Body> "+ " <Push xmlns=\"/\"> "+ " <Type>"+type+"</Type> "+ " <JsonStr>"+jsonStr+"</JsonStr>"+ " </Push> "+ " </soap12:Body> "+ " </soap12:Envelope>";OutputStream os = connection.getOutputStream();os.write(soapXML.getBytes("utf-8"));// 5:接收服务端的响应int responseCode = connection.getResponseCode();if (200 == responseCode) {// 表⽰服务端响应成功InputStream is = connection.getInputStream();InputStreamReader isr = new InputStreamReader(is,"utf-8");BufferedReader br = new BufferedReader(isr);String temp = null;while (null != (temp = br.readLine())) {res.append(temp);}is.close();isr.close();br.close();String xml = res.toString();Document doc = DocumentHelper.parseText(xml); // 将字符串转为XMLElement rootElt = doc.getRootElement(); // 获取根节点//System.out.println("根节点:" + rootElt.getStringValue());Element nameElem = rootElt.element("Body").element("PushResponse").element("PushResult"); String code = nameElem.element("Code").getTextTrim();String description = nameElem.element("Description").getTextTrim();map.put("code", code);map.put("description", description);} else {//res.append("调接⼝异常!");map.put("code", "500");map.put("description", "数据推送失败,服务端响应失败!");logger.error("数据推送失败,服务端响应失败!");}os.close();} catch (Exception e) {//res.append("调接⼝异常!");map.put("code", "500");map.put("description", "数据推送异常,推送信息为trans_notice表或trans_target表的id>>>>:" + id); logger.error("数据推送异常,推送信息为trans_notice表或trans_target表的id>>>>:" + id + "", e);}return map;}。

Android使用HttpURLConnection调用WebService接口

Android使用HttpURLConnection调用WebService接口

Android使用HttpURLConnection调用WebService接口在Android中,可以使用HttpURLConnection类来调用WebService接口。

HttpURLConnection是Java中用于发送和接收HTTP请求的基本类,而WebService是一种支持跨网络的远程调用技术,可以在不同平台之间进行通信。

HttpURLConnection可以通过HTTP协议与WebService接口进行通信。

下面是使用HttpURLConnection调用WebService接口的步骤:1. 创建URL对象:首先,需要创建一个URL对象,将WebService的URL地址作为参数传递给URL构造函数。

例如:``````2. 打开连接:通过URL对象的openConnection方法打开与WebService的连接。

该方法会返回一个HttpURLConnection对象,可以通过类型转换来获取具体的对象。

```HttpURLConnection connection = (HttpURLConnection)url.openConnection(;```3. 设置请求方法:使用setRequestMethod方法设置请求的方法,常用的方法有GET和POST。

GET方法用于获取WebService返回的数据,而POST方法用于向WebService发送数据。

```connection.setRequestMethod("POST");```4. 设置请求参数:如果使用POST方法发送数据,需要设置请求的参数。

可以通过设置connection的OutputStream来发送数据。

```connection.setDoOutput(true);DataOutputStream outputStream = newDataOutputStream(connection.getOutputStream();outputStream.writeBytes("param1=value1&param2=value2");outputStream.flush(;outputStream.close(;```5. 获取响应数据:使用getInputStream方法获取WebService的响应数据。

url调用的过程

url调用的过程

url调用的过程URL调用的过程可以分为解析URL、建立连接、发送请求、接收响应、处理响应等几个步骤。

下面将详细介绍这些步骤。

1.解析URL:在调用URL之前,首先需要解析URL。

URL(Uniform Resource Locator)是网页的地址,包括协议、主机名(或IP地址)、端口、路径和参数等信息。

解析URL的目的是将这些信息分离出来,方便后续的处理。

解析URL可以使用正则表达式或者URI类等方法进行。

2.建立连接:解析URL后,就可以开始建立连接了。

根据解析得到的主机名(或IP地址)和端口号,将会与服务器建立TCP连接。

建立连接的过程中,需要进行三次握手,确保服务器和客户端之间的连接是可靠的。

3.发送请求:建立连接后,客户端会向服务器发送HTTP请求。

HTTP请求包括请求行、请求头和请求体。

请求行中包括请求方法(GET、POST等)、路径和协议版本等信息。

请求头中包括一些关于客户端的信息,如User-Agent、Host等。

请求体中包含需要传输给服务器的数据,比如表单数据、文件等。

4.接收响应:当服务器接收到请求后,会进行处理,并返回一个HTTP响应。

HTTP响应包括响应行、响应头和响应体。

响应行中包括协议版本、状态码和状态信息等信息。

响应头中包括一些关于服务器和响应的附加信息,如Server、Content-Type等。

响应体中包含服务器返回给客户端的数据,可以是HTML文档、JSON数据等。

5.处理响应:客户端接收到响应后,会根据响应的状态码和响应体的内容进行不同的处理。

如果响应状态码是200,表示请求成功,可以解析响应体中的数据并进行相应的业务处理。

如果响应状态码是301或302,表示重定向,客户端会根据响应头中的Location字段,重新发送请求。

如果响应状态码是400或500,表示出现了错误,客户端可以根据响应体中的错误信息进行相应的处理。

以上就是URL调用的基本步骤。

除了这些基本步骤之外,还有一些其他的处理过程,如DNS解析、缓存处理、连接池管理等。

java中webapi调用方式

java中webapi调用方式

在Java中,Web API调用是一项非常常见的任务。

Web API是一种由HTTP 协议提供服务的接口,它允许不同的应用程序之间进行通信。

在本文中,我将以从简到繁、由浅入深的方式来探讨Java中WebAPI调用的方式,并共享我对这个主题的个人观点和理解。

1. URLConnection类我们可以使用Java内置的URLConnection类来进行简单的Web API 调用。

这个类提供了一种简单而基本的方式来打开一个到指定URL资源的通信信息,并可以读取和写入该资源。

它适用于简单的GET和POST请求,但在处理复杂的响应和错误处理方面就显得力不从心了。

2. Apache HttpClientApache HttpClient是一个强大的Java HTTP客户端库,它为开发人员提供了更丰富的功能和更灵活的方式来进行Web API调用。

相比于URLConnection类,HttpClient具有更强大的功能,例如支持HTTPS、重定向、HTTP代理等。

它还提供了更友好的API,使得我们可以更轻松地处理响应和错误。

3. Spring RestTemplate作为Spring框架的一部分,RestTemplate是一种简化了的HTTP客户端工具,它提供了一种更优雅的方式来进行Web API调用。

通过RestTemplate,我们可以很容易地实现GET、POST、PUT、DELETE 等HTTP方法的调用,并且可以方便地处理响应和错误。

4. Reactive WebClient随着Spring 5引入了响应式编程范式,Reactive WebClient成为了一种新的选择。

它使用了Reactor库,提供了一种基于响应式流的方式来进行Web API调用。

这种方式在处理大量并发请求时具有很大的优势,并且可以方便地进行响应式编程。

总结回顾:在本文中,我从URLConnection类开始介绍了Java中Web API调用的方式,然后逐步深入介绍了Apache HttpClient、Spring RestTemplate和Reactive WebClient。

JAVA代码实现HTTP请求的常用方法

JAVA代码实现HTTP请求的常用方法

JAVA代码实现HTTP请求的常用方法在Java中,有多种方法可以实现HTTP请求。

下面将介绍几种常用的方法。

1. 使用Java内置的URL类和HttpURLConnection类:```javaimport java.io.BufferedReader;import java.io.InputStreamReader;public class HTTPRequestExamplepublic static void main(String[] args) throws ExceptionURL obj = new URL(url);HttpURLConnection con = (HttpURLConnection)obj.openConnection(;//设置请求方法con.setRequestMethod("GET");//添加请求头con.setRequestProperty("User-Agent", "Mozilla/5.0");//获取响应码int responseCode = con.getResponseCode(;System.out.println("Response Code: " + responseCode);BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream());String inputLine;StringBuffer response = new StringBuffer(;while ((inputLine = in.readLine() != null)response.append(inputLine);}in.close(;//打印响应内容System.out.println(response.toString();}```2. 使用第三方库HttpClient:```javapublic class HTTPRequestExamplepublic static void main(String[] args) throws Exception //创建GET请求//发送请求并获取响应//解析响应实体内容//打印响应内容System.out.println(response);// 关闭HttpClient连接}```3. 使用第三方库OkHttp:```javapublic class HTTPRequestExamplepublic static void main(String[] args) throws Exception// 创建OkHttpClient对象OkHttpClient okHttpClient = new OkHttpClient(;// 创建Request对象Request request = new Request.Builder.url(url).build(;//发送请求并获取响应Response response = okHttpClient.newCall(request).execute(;String responseBody = response.body(.string(;//打印响应内容System.out.println(responseBody);}```4. 使用第三方库RestTemplate(Spring框架的一部分):```javaimport org.springframework.web.client.RestTemplate;public class HTTPRequestExamplepublic static void main(String[] args)// 创建RestTemplate对象RestTemplate restTemplate = new RestTemplate(;//发送GET请求,并获取响应ResponseEntity<String> responseEntity = restTemplate.getForEntity(url, String.class);//获取响应内容String response = responseEntity.getBody(;//打印响应内容System.out.println(response);}```这些方法提供了不同的方式来实现HTTP请求,使用Java内置的URL 类和HttpURLConnection类相对简单,但是需要自己处理底层连接和数据读取。

HttpURLConnection用法详解

HttpURLConnection用法详解

HttpURLConnection⽤法详解下边的总结对我帮助蛮⼤的~不仅⽤法了解,整个连接流程也要明⽩!原⽂链接地址:针对JDK中的URLConnection连接Servlet的问题,⽹上有虽然有所涉及,但是只是说明了某⼀个或⼏个问题,是以FAQ的⽅式来解决的,⽽且⽐较零散,现在对这个类的使⽤就本⼈在项⽬中的使⽤经验做如下总结:1:> URL请求的类别:分为⼆类,GET与POST请求。

⼆者的区别在于:a:) get请求可以获取静态页⾯,也可以把参数放在URL字串后⾯,传递给servlet,b:) post与get的不同之处在于post的参数不是放在URL字串⾥⾯,⽽是放在http请求的正⽂内。

2:> URLConnection的对象问题:URLConnection的对象,如下代码⽰例:// 下⾯的index.jsp由<servlet-mapping>映射到// ⼀个Servlet(com.quantanetwork.getClientDataServlet)// 该Servlet的注意点下边会提到1 URL url = new URL("http://localhost:8080/TestHttpURLConnectionPro/index.jsp");23 URLConnection rulConnection = url.openConnection();4// 此处的urlConnection对象实际上是根据URL的5 // 请求协议(此处是http)⽣成的URLConnection类6 // 的⼦类HttpURLConnection,故此处最好将其转化7 // 为HttpURLConnection类型的对象,以便⽤到8 // HttpURLConnection更多的API.如下:910 HttpURLConnection httpUrlConnection = (HttpURLConnection) rulConnection;3:> HttpURLConnection对象参数问题1// 设置是否向httpUrlConnection输出,因为这个是post请求,参数要放在2 // http正⽂内,因此需要设为true, 默认情况下是false;3httpUrlConnection.setDoOutput(true);45// 设置是否从httpUrlConnection读⼊,默认情况下是true;6httpUrlConnection.setDoInput(true);78// Post 请求不能使⽤缓存9httpUrlConnection.setUseCaches(false);1011// 设定传送的内容类型是可序列化的java对象12 // (如果不设此项,在传送序列化对象时,当WEB服务默认的不是这种类型时可能抛java.io.EOFException)13httpUrlConnection.setRequestProperty("Content-type", "application/x-java-serialized-object");1415// 设定请求的⽅法为"POST",默认是GET16httpUrlConnection.setRequestMethod("POST");1718// 连接,从上述第2条中url.openConnection()⾄此的配置必须要在connect之前完成,19 httpUrlConnection.connect();4:> HttpURLConnection连接问题:1// 此处getOutputStream会隐含的进⾏connect(即:如同调⽤上⾯的connect()⽅法,2 // 所以在开发中不调⽤上述的connect()也可以)。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

记录一下JAVA环境下如何在代理下使用HttpURLConnection
Properties prop = System.getProperties();
// 设置http访问要使用的代理服务器的地址
prop.setProperty("http.proxyHost", "代理服务器地址");
// 设置http访问要使用的代理服务器的端口
prop.setProperty("http.proxyPort", "代理服务器的端口");
// 设置http访问要使用的代理服务器的用户名
prop.setProperty("http.proxyUser", "用户名");
// 设置http访问要使用的代理服务器的密码
prop.setProperty("http.proxyPassword", "密码");
用Java编写通过代理访问的应用程序
本技巧将向您讲述如何编写可通过代理访问因特网上的Web服务器的Java应用程序。

在Java应用程序中加入代理支持只需额外编写几行代码,且不依赖任何安全性“漏洞”。

几乎所有的公司都十分关注保护自己的内部网络,以防黑客及入窃者。

一种常见的安全措施是完全断开与因特网的连接。

如果黑客们不能连接到您的任何一台机器,他们就不能非法进入您的系统。

这种策略产生的不利副作用是,内部用户无法访问外部的因特网服务器,如Yahoo或JavaWorld。

为了解决这一问题,网络管理员通常安装“代理服务器”。

实际上,代理是安装于因特网和内部网之间的一种服务,用来管理这两个领域之间的连接。

代理有助于减少安全性的外部威胁,同时还允许内部用户访问因特网服务。

尽管Java使得编写因特网客户机不再困难,但是如果客户机不能通过代理,则它们毫无用处。

幸运的是,Java使得使用代理支持不再困难--如果您知道密诀,这就是事实。

将Java和代理结合起来的秘诀即在Java运行时激活特定的系统属性。

这些属性未被写入正式文件,只是作为Java传说的一部分在Java编程人员中秘传。

为了支持代理,Java应用程序不仅需要指定代理本身的信息,而且需要指定用于认证的用户信息。

在开始使用网际协议之前,您需要在程序中添加以下几行代码:
System.getProperties().put("proxySet","true");
System.getProperties().put("proxyHost","myProxyMachineName");
System.getProperties().put("proxyPort","85");
上面的第一行通知Java您要通过代理进行连接,第二行指定代理所在的机器,第三行指定代理监听的端口。

有些代理在授权用户访问因特网之前,要求用户输入用户名和口令。

如果您使用位于防火墙之内的Web浏览器,您就可能碰到过这种情况。

以下是执行认证的方法:
URLConnectionconnection=url.openConnection();
Stringpassword="username:password";
StringencodedPassword=base64Encode(password);
---黄颜色是加密方法的使用,仅参考
String encodedLogin = new BASE64Encoder().encode(authentication.getBytes());
httpurlconnection.setRequestProperty("Proxy-Authorization", " Basic " + encodedLogin);
connection.setRequestProperty("Proxy-Authorization",encodedPassword);
这段代码的思想是,您必须调整HTTP标头以发出用户信息。

这是通过调用setRequestProperty()来实现的。

这种方法允许您在发出请求之前处理HTTP标头。

HTTP 要求用base64对用户名和口令进行编码。

幸运的是,有一组公用域API,它们将代您执行编码(请参阅参考资源部分)。

如您所见,在Java应用程序中加入代理支持并不需要做多少工作。

有了现在的知识,再做一点研究(您必须查明您的代理是如何处理您感兴趣的协议以及如何进行用户认证的),您就能用其他协议实现代理。

FTP代理
ScottD.T aylor提出这个秘诀来处理FTP协议代理:
defaultProperties.put("ftpProxySet","true");
defaultProperties.put("ftpProxyHost","proxy-host-name");
defaultProperties.put("ftpProxyPort","85");
接下来您便可以通过以下代码使用"ftp"协议访问文件URL:
URLurl=newURL("");
如果有人有使用其他网际协议代理的例子,我很想看看。

注意:代码示例(Example.java)仅在JDK1.1.4下测试过。

后续技巧!
对于仍在使用JDK1.1.7(配合WebSphere3.0)的开发人员而言,将proxyHost和proxyPort设为系统属性不起作用;conn.getInputStream()或者返回连接超时,或者是找不到主机路径。

但是,我使用接受Host和Port为参数的URL构造函数解决了这一问题(使用我的代理主机和端口):
publicURL(Stringprotocol,Stringhost,intport,Stringfile).
借助用户名和口令进行认证的方法不起作用。

应将"Basic"置于认证字符串的开头;例如:
StringencodedPassword=base64Encode(password);
应该是:
StringencodedPassword="Basic"+base64Encode(password);
您也不必用一个单独的程序来进行64位编码。

您可以使用sun.misc.BASE64Encoder()类。

下面是完成这两处改动之后的代码:
System.getProperties().put("proxySet","true");
System.getProperties().put("proxyHost",proxyHost);
System.getProperties().put("proxyPort",proxyPort);
StringauthString="userid:password";
Stringauth="Basic"+newsun.misc.BASE64Encoder
().encode(authString.getBytes());
URLurl=newURL("");
URLConnectionconn=url.openConnection();
conn.setRequestProperty("Proxy-Authorization",auth);
下面是使用socks4代理服务器的方法:
System.getProperty("socksProxySet",true);
System.getProperty("socksProxyHost",proxyHostName);
System.getProperty("socksProxyPort",proxyPort);
UsuallytheproxyPortforSocks4isport1080
接下来您就可以用Socks4进行连接了。

相关文档
最新文档