Haskell WARP / WAI服务器无法响应Android嵌入式WebView

时间:2017-06-26 19:16:20

标签: javascript haskell xmlhttprequest haskell-wai haskell-warp

更新3 点击端点 http://httpbin.org/user-agent 时,请求成功返回。所以我的Haskell Warp + WAI应用服务器出了问题。

任何可以使服务器API调用适用于大多数浏览器的想法,但不适用于Android WebView?

只是为了澄清,我我没有做任何跨域请求。我在这里看到了数百个问题,但我的AJAX请求是在WebView加载的同一个域中。

UPDATE 2 我使用了更基本的 xhr 方法,而不是jQuery,如下所示:

function pingServer()
{
  var xhr = new XMLHttpRequest();
  xhr.open('get', URL + 'ping');

  // Track the state changes of the request.
  xhr.onreadystatechange = function()
  {
    var DONE = 4; // readyState 4 means the request is done.
    var OK   = 200; // status 200 is a successful return.

    if (xhr.readyState === DONE)
    {
      if (xhr.status === OK)
      {
        $('#submitDialog p').text(xhr.responseText + ' : ' + xhr.status);
      }
      else
      {
        $('#submitDialog p').text(xhr.responseText + ' : ' + xhr.status);
      }
    }
  };
  xhr.send(null);
}

仍然没有运气。 xhr.responseText 为空白, xhr.status 为0。

我想知道我的服务器是否有问题?我正在使用一个不寻常的服务器,基于Haskell的WARP和WAI。 ...但是为什么一切都在其他浏览器中正常工作?

UPDATE 我做了一些调试,这是我在下面显示的AJAX调用中遇到的错误(基本的'是服务器启动?'GET查询):

  

错误:NetworkError:无法在“XMLHttpRequest”上执行“发送”:无法加载“http://www.example.net:2753/ping

毋庸置疑,确切的网址(我正在使用的网址,不是示例)在任何移动或桌面浏览器中都能正常运行 - 只有Android WebView才会出现此问题!

我有一个简单的Android应用程序;只是一个加载远程URL(而不是本地资源)的WebView。它工作正常,除了我的所有AJAX调用立即调用他们的错误回调。我正在测试三星Galaxy S6,并将应用程序构建到SDK 21。

这是我的第一个AJAX调用(失败)的样子;其他人使用相同的属性:

$.ajax(
{
  url: URL + 'ping',
  cache: false,
  async: false,
  timeout: 5000,
  error: fail,
  success: transmitScore
});

当然, transmitScore() fail()是在范围内的其他地方定义的。

以下是我的WebView的设置:

import android.app.Activity;
import android.content.pm.ActivityInfo;
import android.os.Bundle;
import android.webkit.WebView;
import android.webkit.WebViewClient;

import java.util.Locale;

public class Example extends Activity
{
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);

        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
        setContentView(R.layout.main);

        WebView wv = (WebView) findViewById(R.id.webview);

        wv.setWebViewClient(new WebViewClient()
        {
            public void onPageFinished(WebView v, String s)
            {
                v.loadUrl("javascript: setLang('" +
                    Locale.getDefault().getLanguage() + "')");
            }
        });
        wv.getSettings().setJavaScriptEnabled(true);
        wv.loadUrl("http://example_url_for_privacy:2753/application");
    }
}

任何想法出了什么问题? AJAX调用在桌面Chrome和Android Chrome中运行良好。

我在这里看到很多关于AJAX调用本地资源文件需要跨域权限的问题,但这不是我的情况。所有资源都在远程服务器上,并且所有AJAX调用都会转到它。

我也尝试将 WebView 设置为使用 WebChromeClient ,但它没有任何区别。我相信现在它是 WebViews 的默认设置。在AJAX调用中,我尝试了 async cache 的四种可能组合;没有工作。

1 个答案:

答案 0 :(得分:1)

事实证明,问题在于 WebView 是按IP地址加载页面,而JavaScript是通过域名引用的。据我所知,不这样做可能是常识;但是非 WebView 客户端处理它的方式确实让我早日将其排除在外作为一个可能的问题。