2014-12-08 43 views
0

美好的一天大家, 我正面临一个小问题。使用Javascript发布到Web Service(来自C#)

直到上周,我们的移动应用程序连接到内部的Web API,而后者又连接到由我们的合作伙伴运行和维护的Web服务。 问题是,我们希望将我们的Web Api作为中间人移除,并直接从我们的Cordova应用程序(Javascript)连接到Restful服务。

下面是我试图模仿C#代码,任何和所有帮助将不胜感激: (在这一点上我相信一切是正确的,除了认证,但我可能是错的)

问题: 我怎样才能在Javascript实现这一目标(如果可能的话)

public static AuthenticateResult CheckLogin(LoginModel login) 
     { 
      var serviceClient = new WebClient(); 
      var proxy = serviceClient.Proxy; 
      proxy.Credentials = new NetworkCredential("username_goes_here", "password_goes_here"); 
      serviceClient.Headers["Content-type"] = "application/json"; 

      try 
      { 
       var requestHeader = new UnauthenticatedRequestHeader 
       { 
        Code = ConstantModel.PartnerCode, 
        Partner = ConstantModel.PartnerName 
       }; 

       var authenticateRequest = new AuthenticateRequest 
       { 
        Username = login.Username, 
        Password = login.Password, 
        Handset = "iPhone Emulator" 
       }; 

       var serviceRequest = new 
       { 
        header = requestHeader, 
        request = authenticateRequest 
       }; 

       var jsonizedServiceRequest = JsonConvert.SerializeObject(serviceRequest); 
       var requestBytes = Encoding.UTF8.GetBytes(jsonizedServiceRequest); 
       var requestStream = new MemoryStream(requestBytes); 

       var ms = requestStream.ToArray(); 

       var responseBytes = serviceClient.UploadData("Url_goes_here", "POST", ms); 
       var jsonizedServiceResponse = Encoding.UTF8.GetString(responseBytes); 
       var authResult = JsonConvert.DeserializeObject<AuthenticateResponse>(jsonizedServiceResponse); 

       return authResult.AuthenticateResult; 
      } 
      catch (Exception ex) 
      { 
       return null; 
      } 
     } 

我至今在Javascript是(这将返回错误请求错误):

btnTestClick: function() { 
        var header = { 
         Code: 'guid_goes_here', 
         Partner: 'partnerid_goes_here' 
        }; 
        var request = { 
         Username: 'username_goes_here', 
         Password: 'password_goes_here', 
         Handset: 'iPhone Emulator' 
        }; 
        var myrequest = { 
         header: header, 
         request: request 
        }; 

        var string = JSON.stringify(myrequest); 
        var data = tobytearray(string); 

        $.ajax({ 
         type: "POST", 
         url: "url_goes_here", 
         crossDomain: true, 
         data: data, 
         contentType: 'application/octet-stream;', 
         dataType: "json", 
         username: 'auth_username_goes_here', 
         password: 'auth_password_goes_here', 
         processData: false, 
         success: function (result) { 
          debugger; 
         }, 
         error: function (jqXHR, textStatus, errorThrown) { 
          alert("error"); 
         }, 
         beforeSend: function (xhr) { 
         }, 
        }); 

        function tobytearray(str) { 
         var bytes = []; 
         for (var i = 0; i < str.length; ++i) { 
          bytes.push(str.charCodeAt(i)); 
         } 
         return bytes; 
        } 
       } 
+0

...什么是错误的? – t3chb0t 2014-12-08 06:07:01

+0

我在上面指定,我正在模拟Javascript中的这个C#代码 – 2014-12-08 06:10:16

+0

你的输出/响应是什么? – 2014-12-08 08:27:21

回答

0

我从您的示例中看到的是2个示例中使用的数据类型的区别。
在C#示例中,您使用serviceClient.Headers["Content-type"] = "application/json";,并且在javascript实现中使用contentType: 'application/octet-stream;'。 八位字节流应该用于附件而不是JSON对象。

webservice可能正在验证内容类型的请求,如果测试结果是您的请求无效,它可以返回(并应返回)HTTP 400 - Bad Request

我不知道你在哪里拍摄你的请求的网络服务,它做了什么验证,但尝试改变在JavaScript实现该contenttype。

+0

嗨,谢谢你的回复,我已经尝试发送内容类型JSON的相同效果,我也收到错误的请求错误。 我在想这可能与身份验证有关,因为我已经阅读了多篇文章,声明从Javascript到WebServices只能使用基本身份验证。 希望有人可以在这方面有更多的经验 – 2014-12-09 06:59:10

+0

我真的没有这方面的经验,只有基于令牌的认证或直接成员资格提供者认证。您是不是可以联系您的供应商或您尝试认证的供应商?看起来你的例子中的两条消息是相同的。你能得到两个系统发送的信息吗?你可以使用[Fiddler](http://www.telerik.com/fiddler)。 – VeldMuijz 2014-12-14 20:14:43

相关问题