我正在Windows Phone 7上创建一个带有phonegap的应用程序,需要在服务器上进行身份验证。当我们使用正确的用户名和密码登录时,我们获得了200状态。一切正常。但是如果我们在登录或密码上犯了错误,服务器会向我们发回401错误。这冻结了我的申请。我需要杀死它并重新启动它。所以不是很练习。
我在计算机上用fiddler检查响应,手机收到401错误,我在我的代码上管理了这个错误。这适用于我的其他平台(android和ios)。
所以我想知道如何管理这个错误。也许我可以在Windows Phone项目上更改cs文件来处理这个错误。
欢迎任何帮助
这是代码
$.support.cors = true;
$.ajax({
type: "POST",
dataType: "HTTP/1.1",
url: 'https://xxx.xxx-xxx.com/issue/wrap',
data: data,
cache: 'false',
async: false,
error: function (data) {
console.log(data);
console.log("error");
//navigator.notification.alert(data);
},
complete: saveToken
});
感谢
答案 0 :(得分:2)
我遇到了同样的问题,我建立的唯一解决方案就是实现一个Phonegap插件。
这是我使用的C#代码:
namespace WPCordovaClassLib.Cordova.Commands
{
[DataContract]
public class PhonegapWindowsPhonePostObject
{
[DataMember(IsRequired = false, Name = "yourParamName1")]
public string yourParam1;
[DataMember(IsRequired = false, Name = "yourParamName2")]
public string yourParam2;
}
public class PhonegapWindowsPhonePost: BaseCommand
{
public void post(string options)
{
PhonegapWindowsPhonePostObject pwppo = JSON.JsonHelper.Deserialize<PhonegapWindowsPhonePostObject>(options);
try
{
System.Windows.Deployment.Current.Dispatcher.BeginInvoke(() =>
{
var data = "YOUR DATA STRING HERE"; //use the pwppo object to retrieve your parameters
var url = "URL OF THE SERVICE HERE";
WebClient wc = new SharpGIS.GZipWebClient();
var URI = new Uri(url);
wc.Encoding = Encoding.UTF8;
wc.Headers[HttpRequestHeader.ContentType] = "application/x-www-form-urlencoded";
wc.UploadStringCompleted += new UploadStringCompletedEventHandler(wc__UploadStringCompleted);
wc.UploadStringAsync(URI, "POST", data);
});
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
void wc__UploadStringCompleted(object sender, UploadStringCompletedEventArgs e)
{
try
{
if (e.Result != null)
this.DispatchCommandResult(new PluginResult(PluginResult.Status.OK, e.Result));
else
this.DispatchCommandResult(new PluginResult(PluginResult.Status.ERROR, "Error 401"));
}
catch (Exception ex)
{
this.DispatchCommandResult(new PluginResult(PluginResult.Status.ERROR, ex.Message));
// no http status code available
}
}
}
}
以下是从您的应用中调用插件的Javascript代码:
function loginToWebService(yourParam1, yourParam2) {
var options = { "yourParamName1": yourParam1, "yourParamName2": yourParam2};
cordova.exec(success, error,"PhonegapWindowsPhonePost","post", options);
}
我希望它会对你有所帮助。
注意:Phonegap 2.8版本没有解决与发布说明相反的问题......
再见!
答案 1 :(得分:0)
Sup,您是如何进行身份验证的?
如果您使用XMLHttpRequest()
,请执行以下操作:var request = new XMLHttpRequest();
尝试检查somth会发生什么:console.log("status: " + request.status);
如果它似乎有用,你可以使用:
if (request.status == 401) {
// blabla
return;
}
答案 2 :(得分:0)
在过去的几个月里我遇到了这个问题,终于弄明白了。
首先,我们使用的临时解决方法是在请求上实施超时期限。这很有效,但响应始终是404.我们不知道它是否真的未通过身份验证,或者我们的服务是否已关闭。对我们的系统来说,这不是一个可接受的解决方法。
最后,经过多次谷歌搜索,我发现了实际问题。
当401返回时(这是基本身份验证,身份验证失败),它会向响应添加一个标头,称为“WWW-Authenticate”。这告诉浏览器提示用户尝试登录。 iOS webview不知道该怎么做,所以这就是应用程序挂起的原因。
从您的服务中,您需要做的就是删除WWW-Authenticate标头,您应该开始在错误功能中看到401。