在java中模拟XMLHttpRequest

论坛 期权论坛     
选择匿名的用户   2021-5-30 02:04   276   0
<p>这里所说的&#34;模拟&#34; 是指 : 在java中,使用类似 XMLHttpRequest 的方式来实现&#34;同步/异步的HttpRequest&#34;功能.<br> <br> <br>   用 java 实现一个HTTPRequest 并不难. 通过 java.net 包内提供的东东 可以很容易的实现.<br>   而且我们还有 apache 的 HttpClient 一类的组件可供我们使用 .<br>   实现 异步的HTTPRequest 当然同样简单 , 再使用一个 Thread就ok了.<br>   但是 使用上面的 方法 , 实现的往往只是一个 &#34;异步的HTTPRequest&#34;的功能而已,<br>   使用方式上 还是 很 java的.<br>   <br> 我在这里所要介绍的 则是使用很&#34;ajax&#34;的方式来实现&#34;异步的HTTPRequest&#34;的功能.<br> 这个 AjaxHttpRequest 类  模仿了 XMLHttpRequest 的实现,<br> 从属性 方法 使用方式上 都尽量的和 XMLHttpRequest 接近.<br> <br> 利用 AjaxHttpRequest 类 可以更自然的实现 ajax请求的服务端代理 等工作.<br> <br> &#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;<br> <br> <span style="color:blue">当然 本文的技术研究的价值 也许远远大于 实用的价值. </span>:P .<br> <br> <br> 我先来举一个例子 ,  AjaxHttpRequest 类的代码&amp;注释 在后面附上 附件中也会提供该java文件.<br> <br> 大家注意看代码注释 ,我要说的东西更多的都在注释里呢.<br> <br> 一个 用 java 来调用 <span style="color:red">google 翻译服务的例子</span> (利用了后面附上的 AjaxHttpRequest 类) :</p>
<pre class="blockcode"><code class="language-java">package com.fins.gt.server;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.Proxy;
import java.net.URL;
import java.net.URLConnection;
import java.net.URLEncoder;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.StringTokenizer;
import java.util.logging.Level;

  
/**
* AjaxHttpRequest ,用java 模拟 浏览器的 XMLHttpRequest 对象.
* 目的是 用 操作浏览器中的XHR对象的 方式来处理java端的 http请求.
*
* &#64;author fins
*
* 本类的实现借鉴了 cobra 组件的 org.lobobrowser.html.test.SimpleHttpRequest 类.
* 可以看作是对 SimpleHttpRequest 类的一个完善和补充.
*
* cobra 组件是一个 Java HTML Renderer &amp; Parser,
* 官方网站 : http://lobobrowser.org/cobra.jsp
*/

public class AjaxHttpRequest {

// 对应 XMLHttpRequest 的5种状态.
public static final int STATE_UNINITIALIZED &#61; 0;
public static final int STATE_LOADING &#61; 1;
public static final int STATE_LOADED &#61; 2;
public static final int STATE_INTERACTIVE &#61; 3;
public static final int STATE_COMPLETE &#61; 4;

// 默认的 userAgent
public static final String DEFAULT_USERAGENT &#61; &#34;Mozilla/4.0 (compatible; MSIE 6.0;) JavaAjax/1.0&#34;;

// 默认的 编码
public static final String DEFAULT_AJAX_CHARSET &#61; &#34;UTF-8&#34;;
public static final String DEFAULT_HTTP_CHARSET &#61; &#34;ISO-8859-1&#34;;

// 默认的 HTTP method
public static final String DEFAULT_REQUEST_METHOD &#61; &#34;POST&#34;;

private int readyState;
private int status;
private String statusText;
private String responseHeaders;
private byte[] responseBytes;
private Map responseHeadersMap;
private Map requestHeadersMap;
private ReadyStateChangeListener readyStateChangeListener;

private boolean async;
private boolean sent;
private URLConnection connection;
private String userAgent &#61; DEFAULT_USERAGENT;
private String postCharset &#61; DEFAULT_AJAX_CHARSET;
private Proxy proxy;

private URL requestURL;
protected String requestMethod;
protected String requestUserName;
protected String requestPassword;

/
/


/**
  * 构造方法. 自动添加 XMLHttpRequest 的一些缺省头信息.
  * 如果不需要这些头信息,可在创建 AjaxHttpRequest 实例后,
  * 通过 setRequestHeader/removeRequestHeader/removeAllRequestHeaders 方法
  * 进行修改或移除.
  */
public AjaxHttpRequest() {
  requestHeadersMap &#61; new LinkedHashMap();
  setRequestHeader(&#34;X-Requested-With&#34;, &#34;XMLHttpRequest&#34;);
  setRequestHeader(&#34;Accept&#34;,
    &#34;text/javascript, text/html, application/xml, application/json, text/xml, */*&#34;);
}

/**
  * 类似 XMLHttpRequest 中的 readyState 属性.
  */
public synchronized int getReadyState() {
  return this.readyState;
}

/**
  * 类似 XMLHttpRequest 中的 status 属性.
  */
public synchronized int getStatus() {
  return this.status;
}

/**
  * 类似 XMLHttpRequest 中的 statusText 属性.
  */
public synchronized String getStatusText() {
  return this.statusText;
}

/**
  * 类似 XMLHttpRequest 中的 setRequestHeader 方法.
  */
public void setRequestHeader(String key, String value) {
  this.requestHeadersMap.put(key, value);
}

/**
  * 类似 XMLHttpRequest 中的 open 方法.
  */
public void open(String method, String url, boolean async, String userName, String password)
   throws IOException {
  URL urlObj &#61; createURL(null, url);
  open(method, urlObj, async, userName, password);
}


/**
  * 类似 XMLHttpRequest 中的 open 方法.
  */
public void open(final String method, final URL url, boolean async,
分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:3875789
帖子:775174
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP