0

我的ajax调用如下

<script type="text/javascript">
    function calling() {
        var user = $('#username').val();
        $.ajax({
            type: 'POST',
            //url: "myfirstwebservice.asmx/GetCustomer",
             url: "http://www.mydomain.com/myfirstwebservice.asmx?op=GetCustomer",
            data: "{'username':'" + user + "'}",
            contentType: "application/json; charset=utf-8",
            dataType: "jsonp",
            success: function (msg, status) {
                alert("successful");
                console.log(msg.d.password);
                $('#myplace').html("your passowrd is " + msg.d.password);
            },
            error: function (msg, status) {
                alert("failure");
                console.log("failure");
                console.log(msg);
                $('#myplace').html("The status is " + status + " with msg= " + msg + " .<br />" + msg.statusText);
            }
        });
    }
</script>

这是我通过 phonegap 上提供的在线拉链包装的。我的 config.xml 文件是

<?xml version="1.0" encoding="UTF-8" ?>
<widget xmlns = "http://www.w3.org/ns/widgets"
xmlns:gap = "http://phonegap.com/ns/1.0"
id        = "com.phonegap.example"
versionCode="10"
version   = "1.0.0">
<name>PhoneGap Example</name>
<description>
    An example for phonegap build docs.
</description>

<author href="https://build.phonegap.com" email="support@phonegap.com">
    arrest warrant
</author>
<access origin="http://www.mydomain.com/" />

其他细节是

版本 1.0.0

PhoneGap 2.1.0

有什么我做错了,因为我没有得到输出。数据类型应该是 json 还是 jsonp?对于我的本地机器,我使用的是 json(它是用于数据库访问的跨域并且工作正常)。我的移动设备缺少什么。Web 服务在 .NET 2.0 框架中。

4

2 回答 2

0

我不会使用 Web 服务来执行此操作。我使用精简的 Web 表单和它的代码隐藏文件来实现您想要做的事情。

这是我的 Handler.aspx 文件内容:

<% Page Language="C#" AutoEventWireup="True" CodeFile="Handler.aspx.cs" Inherits="Customer_Handler" %>

您的文件内容会略有不同。我所做的只是在 aspx 文件的第一行之后添加一个新的 Web 表单并删除所有 HTML 标记。无论如何,在 Handler.aspx.cs 文件中是我们执行所有繁重工作的地方。此文件及其 Handler.aspx 文件应放置在您网站上可访问的某个位置。

以下是代码片段,您可以将其粘贴到 Handler.aspx.cs 文件中。

using System;
using System.Collections;
using System.Configuration;
using System.Data;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;

public partial class Customer_Handler : System.Web.UI.Page

private String pCallback = "";
private String pOP= "";
private String pUserName = "";

protected void Page_Load(object sender, EventArgs e)
{
    if (!IsPostBack)
    {

        if (!String.IsNullOrEmpty(Request.QueryString["callback"])) { pCallback = Request.QueryString["callback"]; }
        if (!String.IsNullOrEmpty(Request.QueryString["op"])) { pOP = Request.QueryString["op"]; }
        if (!String.IsNullOrEmpty(Request.QueryString["username"])) { pUserName = Request.QueryString["username"]; }            

        switch (Request.HttpMethod)
        {
            case "GET":
                doGET_Function();
                break;
            case "POST":
                doPOST_function();
                break;
            default:
                break;
        }
    }
}

基于 ajax 类型,我们可以使用上述 switch 语句处理 POST 或 GET 方法。然后基于变量“op”,我们可以使用 GET 和 POST 函数处理程序中的以下 switch 语句进一步扩展我们的功能。

private void doGET_Functions()
{
    String R = "";
    Response.Clear();
    Response.ContentType = "text/plain";

    // Each function needs to return a valid JSON String...

    switch (pOP.ToLower())
        {
            case "getcustomer":
                R = doGET_Customer(pUserName);
                break;
            //etc...
            default:
                R = "{\"status\":\"FAILED\", \"statusText\":\"No OP CMD Given...\"}"; 
                break;
        }

    if (!String.IsNullOrEmpty(pCallback)) { R = pCallback + "(" + R + ")"; } 

    Response.Write(R);
}


private void doPOST_functions()
{
    String R = "";
    Response.Clear();
    Response.ContentType = "text/plain";

    // Each function needs to return a vaild JSON String...

    switch (pOP.ToLower())
        {
            case "addcustomer":
                // Save New Customer ..
                //R = doAdd_Customer();
                break;
            //etc...
            default: 
                R = "{\"status\":\"FAILED\", \"statusText\":\"No OP CMD Given...\"}"; 
                break;
        }

    if (!String.IsNullOrEmpty(pCallback)) { R = pCallback + "(" + R + ")"; }

    Response.Write(R);
}

在您的 Get_Customer 函数中,您需要根据传递的用户名进行所需的任何查找。请务必返回有效的 json 字符串值。这是一个非常好的 json 解析器,您可以使用它来帮助调试您的 json 字符串Online JSON Parser 请记住,这将位于您的网站上。

private String doGET_Customer(String iUsername){
    String R = "";
    String secret = "";
    // do lookup and set the variable secret ...
    R += "{\"status\":\"OK\", \"password\":\""+ secret +"\"}";
    return R;
}

现在,当我们在 Phonegap 项目中从我们的 javascript 调用 ajax 函数时,我们可以使用这些方法与 Web 服务器上的服务(WebForm)进行通信......

<script type="text/javascript">
function calling() {
    var user = $('#username').val();
    $.ajax({
         type: 'GET',
         url: "http://www.mydomain.com/handler.aspx",
         data: {
               op: "GetCustomer",
               username: user
              }
        dataType: "jsonp",
        timeout: 20000,
        async: false,
        success: function (json) {
            alert(json.status);
            if (json.status == 'OK'){
                console.log(json.password);
                $('#myplace').html("your passowrd is " + json.password);
            } else {
                $('#myplace').html("The status is " + json.status + " with msg= " + json.statusText);
            }
        },
        error: function (e) {
            alert("failure: "+e.message);
            console.log("failure: "+e.message);
        }
    });
}
</script>

我可能有一些语法错误,因为我大部分都是从记忆中完成的。我已经在我的几个项目中使用了这种技术,它很好地满足了我的需求。因此,如果您对上述语法有任何问题,我会尽力帮助解决..

另外 - 仅供参考:我不建议通过不安全的 http 协议发送任何未加密的用户信息。

希望这可以帮助...

于 2012-10-31T16:30:46.447 回答
0

我用来获取 jsonp 的 url 实际上并没有返回 json 响应。

单击此处 如果有人想尝试,此 url 将返回 json。

于 2012-11-02T06:06:49.903 回答