Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Haskell WARP/WAI服务器无法响应来自Android嵌入式WebView的AJAX调用_Javascript_Haskell_Xmlhttprequest_Haskell Wai_Haskell Warp - Fatal编程技术网

Javascript Haskell WARP/WAI服务器无法响应来自Android嵌入式WebView的AJAX调用

Javascript Haskell WARP/WAI服务器无法响应来自Android嵌入式WebView的AJAX调用,javascript,haskell,xmlhttprequest,haskell-wai,haskell-warp,Javascript,Haskell,Xmlhttprequest,Haskell Wai,Haskell Warp,更新3命中端点时,请求将成功返回。因此,我的Haskell Warp+WAI应用程序服务器有问题 有什么想法可以让服务器API调用适用于大多数浏览器,但不适用于Android WebView 只是澄清一下,我没有做任何跨域请求。我在这里看到了数百个关于这一点的问题,但我的AJAX请求与WebView加载的域相同 更新2我使用了更基本的xhr方法,而不是jQuery,如下所示: function pingServer() { var xhr = new XMLHttpRequest();

更新3命中端点时,请求将成功返回。因此,我的Haskell Warp+WAI应用程序服务器有问题

有什么想法可以让服务器API调用适用于大多数浏览器,但不适用于Android WebView


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

更新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的WAI WAP。。。但为什么在其他浏览器中一切都正常呢


更新我进行了一些调试,这就是我在下面显示的AJAX调用中遇到的错误(一个基本的“服务器启动了吗?”GET查询):

错误:NetworkError:未能对“XMLHttpRequest”执行“发送”:未能加载“”

不用说确切的URL(我使用的是真实的URL,不是示例)在任何移动或桌面浏览器中都可以正常加载-只有Android WebView有这个问题


我有一个简单的安卓应用程序;只是加载远程URL(而不是本地资源)的WebView。它工作得很好,只是我所有的AJAX调用都会立即调用它们的错误回调。我正在三星Galaxy S6上测试,并在SDK 21上构建应用程序

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

$.ajax(
{
  url: URL + 'ping',
  cache: false,
  async: false,
  timeout: 5000,
  error: fail,
  success: transmitScore
});
当然,TransmitCore()和fail()是在范围内的其他地方定义的

以下是my 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,但没有什么不同。我相信现在它是WebView的默认设置。在AJAX调用中,我尝试了异步和缓存的四种可能组合;不起作用。

问题在于WebView是按IP地址加载页面的,而JavaScript是按域名引用的。据我所知,不这样做可能是常识;但是非WebView客户端处理错误的方式使我尽早排除了可能出现的问题。

@Sacheie,尝试添加一个
onerror
事件处理程序,该处理程序应该会提醒错误。让我know@SagarV,我不确定OneError()是否提供了任何额外的错误信息-在我看来,它就像一个回调,因此您不必显式地检查xhr属性来检测错误。我不知道如何才能得到比xhr.responseText为空、xhr.status为0更详细的错误信息。@Ryad URL未使用SSL。如果是的话,为什么这个请求会在桌面浏览器(以及Android的Chrome浏览器)上运行呢。我在清单中有互联网访问权限(否则页面为什么会加载?)-我需要AJAX的其他权限吗?可能值得尝试其他端点,比如,看看响应是什么。我会尝试添加标题,看看它们是否有不同。是的,通常总是使用域名,除非你有特殊理由不使用。您案例中的问题可能是请求标头中缺少主机字段或主机字段不正确。