【问题标题】:Is there an equivalent to the Apache HTTP Client in JavaScript?是否有与 JavaScript 中的 Apache HTTP 客户端等效的东西?
【发布时间】:2015-01-08 03:36:06
【问题描述】:

我是一名新程序员,主要背景是 Java。我正在尝试像在 Java 中那样用 Javascript 编写程序的故障处理。在 java 中,我使用 Apache HTTP 客户端来创建客户端并调用 Httpget 请求。

 HttpClient cli = new DefaultHttpClient();
 cli.getParams().setIntParameter(CoreConnectionPNames.SO_TIMEOUT, 5000);
 HttpResponse resp = null;
 for (int i = 0 ; i < 5 ; i++) {
 try {
 resp = cli.execute(new HttpGet("http://example.org/products"));
 }
 catch{//code}
 }

我不确定如何在 javascript 环境中模拟这种行为。有没有人对这个领域有洞察力或知识?

【问题讨论】:

  • 那个模式有点让人心疼。你的容错能力是不管发生什么都尝试/捕获同一个请求五次?
  • 所以你想要来自 javascript 的 HTTP GET 请求?
  • 对于zetlen,这是一个简单的“重试”示例中的一段代码,如果您遇到网络问题,请每隔一段时间再试多次,看看网络是否已重新连接。对于 user104,是的,最终目标是模拟 HTTPget,但我认为没有客户端实例就无法做到。我错了吗?
  • @Bggreen 不检查请求是否成功就重试是不是很常见?
  • 对不起,我发布的代码只是整体的一个片段。我很抱歉造成误解。稍后在我的循环中,我检查它是否没有出错,如果出错则中断

标签: java javascript apache


【解决方案1】:

在 javascript 中,与其他一些语言一样,“异常”处理大多被错误检查所取代。例如,您将在发出请求时检查 xmlhttprequest 对象的状态:

httpRequest.onreadystatechange = function() {
    if (httpRequest.readyState === 4) {
        if (httpRequest.status === 200) {
                // ok, no "exception"
            } else {
                // BOOM ! "exception"
            }
        }
    }
}

异常只在少数地方有用,比如 parseInt。

但我不确定繁重的“容错”javascript 代码是否有意义:

  • 您真的不知道您的代码将在何处以及如何执行
  • 所有重要的检查和所有重要的持久性都在客户端

您的全局系统必须考虑到浏览器是一个外部域:进入您的服务器的任何内容都不能被信任。

【讨论】:

  • 感谢您的快速回复!我理解对设计的担忧,但我相信我的最终产品会是合理的。我的问题是处理请求。我查看了您提到的 xmlhttprequest,我相信这是解决方案。这个对象有“javadoc”吗?在我打开的大多数页面上,我无法分辨他们使用的变量和内置函数之间的区别。我想我被所有令人惊叹的 Java 文档宠坏了。
  • 没有什么比 javadoc 更简单和同质化了,但是你可以试试 google 和 MDN。大多数时候,您会很快理解这些示例,因为一个好的 javascript 比普通的 java 程序要简洁得多。只要确保了解here 所提供的基础(闭包、范围等),您就会发现 javascript 很容易掌握。
  • 对于大多数用途,XmlHttpRequest 的另一种选择,很好地说明了 javascript 的事件/回调逻辑是 jquery ajax function :你传递给这个函数回调,将在成功或失败。
  • 这正是我所需要的,谢谢。我会给你一个赞成票,但显然我在这里太新了。
【解决方案2】:

这是您的代码 sn-p 的完全等价物,但在 JavaScript 中!

 var cli;
 var callback = function(resp) {
    // due to the asynchronous nature of XMLHttpRequest, you'll need to put all logic that uses the response in a callback function.
    // code below using responseText
    console.log(resp);
 };
 var timeout = 5000;
 var handler = function() {
    var errorSeries;
    if (this.readyState === 4) { // indicates complete
        errorSeries = parseInt(this.status.toString().charAt(0)); // will be "2" or "3" for 200 or 300 series responses
        if (errorSeries === 2 || errorSeries === 3) {
            callback.call(this, this.responseText);
        } else {
            // handle http error here
        }
    }
 }
 for (var i = 0 ; i < 5 ; i++) {
 cli = new XMLHttpRequest(); // ActiveXObject('Microsoft.XMLHTTP') in IE8 and below
 cli.timeout = timeout;
 cli.onreadystatechange = handler;
 try {
    cli.open('GET','http://example.org/products');
    cli.send();
 }
 catch(e) {
 }

如果上面看起来罗嗦,那是因为它是。其他评论者已经把你引向了正确的方向:考虑使用像 jQuery 这样的库来抽象出这种样板。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-11-01
    • 1970-01-01
    • 2022-12-22
    • 2010-09-09
    • 2022-01-10
    • 2018-05-26
    • 2014-10-14
    • 2012-12-30
    相关资源
    最近更新 更多