Javascript Haskell WARP/WAI服务器无法响应来自Android嵌入式WebView的AJAX调用
更新3命中端点时,请求将成功返回。因此,我的Haskell Warp+WAI应用程序服务器有问题 有什么想法可以让服务器API调用适用于大多数浏览器,但不适用于Android WebViewJavascript 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();
只是澄清一下,我没有做任何跨域请求。我在这里看到了数百个关于这一点的问题,但我的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的其他权限吗?可能值得尝试其他端点,比如,看看响应是什么。我会尝试添加标题,看看它们是否有不同。是的,通常总是使用域名,除非你有特殊理由不使用。您案例中的问题可能是请求标头中缺少主机字段或主机字段不正确。