首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > .NET >

关于webservice的调用有关问题

2013-09-11 
关于webservice的调用问题在网上找到的例子用delphi 基于webservice发送短信新浪发送短信的WebService地址

关于webservice的调用问题
在网上找到的例子 用delphi 基于webservice发送短信  
新浪发送短信的Web Service地址是http://smsinter.sina.com.cn/ws/smswebservice0101.wsdl,该Web Service就只有一个方法,即string sendXml(carrier,userid,password,mobilenumber,content,msgtype)。各个参数全部为string类型,其含义基本如下(可能不正确)。 

根据提供的例子 我点发送按钮的时候老是会出错不知道为什么,请求大侠指教 另一个是我写的很简单的主窗口文件

一个是用delphi WSDL Importer向导根据 新浪web service地址生成的文件
// ************************************************************************ //
// The types declared in this file were generated from data read from the
// WSDL File described below:
// WSDL : http://smsinter.sina.com.cn/ws/smswebservice0101.wsdl
// Encoding : UTF-8
// Version : 1.0
// (2011-7-20 19:48:37 - 1.33.2.5)
// ************************************************************************ //

unit smswebservice0101;

interface

uses InvokeRegistry, SOAPHTTPClient, Types, XSBuiltIns;

type

  // ************************************************************************ //
  // The following types, referred to in the WSDL document are not being represented
  // in this file. They are either aliases[@] of other types represented or were referred
  // to but never[!] declared in the document. The types from the latter category
  // typically map to predefined/known XML or Borland types; however, they could also 
  // indicate incorrect WSDL documents that failed to declare or import a schema type.
  // ************************************************************************ //
  // !:string - "http://www.w3.org/2001/XMLSchema"


  // ************************************************************************ //
  // Namespace : http://outlook.microsoft.com/add-ins/SMS/message/
  // soapAction: http://outlook.microsoft.com/add-ins/SMS/action/SMSWebService.sendXml
  // transport : http://schemas.xmlsoap.org/soap/http
  // style : rpc
  // binding : SMSWebServiceSoapBinding
  // service : SMSWS
  // port : SMSWebServiceSoapPort
  // URL : http://202.108.35.168/cgi-bin/ws/smswebservice0101
  // ************************************************************************ //
  SMSWebServiceSoapPort = interface(IInvokable)
  ['{640A28C1-F5F5-8CD9-06A9-58576FCA9BBA}']
  function sendXml(const Carrier: WideString; const Id: WideString; const Password: WideString; const ToMobile: WideString; const Message: WideString; const MsgType: WideString): WideString; stdcall;
  end;

function GetSMSWebServiceSoapPort(UseWSDL: Boolean=System.False; Addr: string=''; HTTPRIO: THTTPRIO = nil): SMSWebServiceSoapPort;


implementation

function GetSMSWebServiceSoapPort(UseWSDL: Boolean; Addr: string; HTTPRIO: THTTPRIO): SMSWebServiceSoapPort;
const
  defWSDL = 'http://smsinter.sina.com.cn/ws/smswebservice0101.wsdl';
  defURL = 'http://202.108.35.168/cgi-bin/ws/smswebservice0101';
  defSvc = 'SMSWS';
  defPrt = 'SMSWebServiceSoapPort';
var
  RIO: THTTPRIO;
begin
  Result := nil;
  if (Addr = '') then
  begin
  if UseWSDL then
  Addr := defWSDL
  else
  Addr := defURL;
  end;
  if HTTPRIO = nil then
  RIO := THTTPRIO.Create(nil)
  else
  RIO := HTTPRIO;
  try
  Result := (RIO as SMSWebServiceSoapPort);
  if UseWSDL then
  begin
  RIO.WSDLLocation := Addr;
  RIO.Service := defSvc;
  RIO.Port := defPrt;
  RIO.HTTPWebNode.Proxy := '192.168.1.132:808';

  end else
  RIO.URL := Addr;
  finally


  if (Result = nil) and (HTTPRIO = nil) then
  RIO.Free;
  end;
end;


initialization
  InvRegistry.RegisterInterface(TypeInfo(SMSWebServiceSoapPort), 'http://outlook.microsoft.com/add-ins/SMS/message/', 'UTF-8');
  InvRegistry.RegisterDefaultSOAPAction(TypeInfo(SMSWebServiceSoapPort), 'http://outlook.microsoft.com/add-ins/SMS/action/SMSWebService.sendXml');

end. 


unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, InvokeRegistry, Rio, SOAPHTTPClient;

type
  TForm1 = class(TForm)
  Edit1: TEdit;
  Edit2: TEdit;
  Edit3: TEdit;
  Edit4: TEdit;
  Edit5: TEdit;
  Button1: TButton;
  Label1: TLabel;
  Label2: TLabel;
  Label3: TLabel;
  Label4: TLabel;
  Label5: TLabel;
  Memo1: TMemo;
  HTTPRIO1: THTTPRIO;
  procedure Button1Click(Sender: TObject);
  private
  { Private declarations }
  public
  { Public declarations }
  end;

var
  Form1: TForm1;

implementation
  
{$R *.dfm}
  uses smswebservice0101;

procedure TForm1.Button1Click(Sender: TObject);
begin
  Button1.Enabled := False;
  memo1.Text := GetSMSWebServiceSoapPort.sendXml(Edit1.Text,Edit2.Text,
  Edit3.Text,Edit4.Text,Edit5.Text,'Text');
  Button1.Enabled :=True;
end;

end.

编译后点击按钮出现以下问题





[解决办法]
最好指定Addr给它 ,我以前调用都是指定webroot给它的Addr的,也就是指明服务来源.
[解决办法]
DELPHI7的WebService好像很难兼容最新的,改用DELPHI 2010
[解决办法]
我用的2010,做的Webservice客户端没问题
你提供的这个例子,我觉得有些问题,你能用 WSDL importer 自动生成吗?我这边是不行。
还有,调Webservice一定要注意编码格式的问题,什么UTF-8,GB2312啊,如果不注意,很搞人的。我觉得你的问题一个出在这里了。

另,你出的分真少……
[解决办法]
没有完全解决,但知道是Delphi在解析返回内容上出的问题了
我这边返回的内容如下:
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<HTML><HEAD>
<TITLE>500 Internal Server Error</TITLE>
</HEAD><BODY>
<H1>Internal Server Error</H1>
The server encountered an internal error or
misconfiguration and was unable to complete
your request.<P>
Please contact the server administrator,
 webmaster@staff.sina.com.cn and inform them of the time the error occurred,
and anything you might have done that may have
caused the error.<P>
More information about this error may be available
in the server error log.<P>
<HR>
<ADDRESS>Apache/1.3.37 Server at smsinter.sina.com.cn Port 80</ADDRESS>
</BODY></HTML>

上面的内容不重要,因为我没有注册新浪无线的账号,返回错误很正常,但Delphi没有正确的抛出返回的错误,问题就在最上一行的<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">

原因应该是Delphi默认的是禁用DTD的,所以如果找到启用DTD的方法,应该就可以解决了,暂时没有找到,下班了,明天再说吧
我的异常网推荐解决方案:The server encountered an internal error () that prevented it from fulfilling this request.,http://www.myexception.cn/java-web/317.html

热点排行