各位好,
  我想用Delphi 开发天气预报的小程序。试了很多方法,调用一些WebService ,但还是不成功。请问那位开发过这样的程序,给帮帮。谢谢
  我现在想调用:http://www.webxml.com.cn/webservices/weatherwebservice.asmx 这个,但是不懂如何输入参数(城市)

解决方案 »

  1.   

    你刚才给的这个WebService提供了示例与帮助文档啊,你可以参阅:http://www.webxml.com.cn/webservices/weatherwebservice.asmx?op=getWeatherbyCityName
      

  2.   

    用Delphi的话,我想用Indy的HTTP控件执行Get / Post 操作获取相应的XML,然后再解析应该比较简单吧?它提供的GET/Post示例:HTTP GET
    以下是 HTTP GET 请求和响应示例。所显示的占位符需替换为实际值。GET /webservices/weatherwebservice.asmx/getWeatherbyCityName?theCityName=string HTTP/1.1
    Host: www.webxml.com.cnHTTP/1.1 200 OK
    Content-Type: text/xml; charset=utf-8
    Content-Length: length<?xml version="1.0" encoding="utf-8"?>
    <ArrayOfString xmlns="http://WebXml.com.cn/">
      <string>string</string>
      <string>string</string>
    </ArrayOfString>
    HTTP POST
    以下是 HTTP POST 请求和响应示例。所显示的占位符需替换为实际值。POST /webservices/weatherwebservice.asmx/getWeatherbyCityName HTTP/1.1
    Host: www.webxml.com.cn
    Content-Type: application/x-www-form-urlencoded
    Content-Length: lengththeCityName=string
    HTTP/1.1 200 OK
    Content-Type: text/xml; charset=utf-8
    Content-Length: length<?xml version="1.0" encoding="utf-8"?>
    <ArrayOfString xmlns="http://WebXml.com.cn/">
      <string>string</string>
      <string>string</string>
    </ArrayOfString>
      

  3.   

    因为之前这方面一点都没有接触过。所以也不懂怎样调用。能否详细点呢。如果下面代码,应如果修改:
    var
      url: string;
      Json: TlkJSONobject;
      ChildJson,tmpJson: TlkJSONbase;
    begin
      HttpReq := CoXMLHTTPRequest.Create;
     //url := 'http://m.weather.com.cn/data/'+Combobox1.Values.ValueFromIndex[ComboBox1.ItemIndex]+'.html';
      url := 'GET /webservices/weatherwebservice.asmx/getWeatherbyCityName?theCityName=深圳';
      HttpReq.open('Get', Url, False, EmptyParam, EmptyParam);
      HttpReq.send(EmptyParam);//开始搜索
      Url := HttpReq.responseText;
      Json := Tlkjson.ParseText(url) as TlkJSONobject;
     // ChildJson := TlkJSONbase.Create;
      ChildJson :=Json.Field['weatherinfo'];
      Memo1.Lines.Clear;
      if ChildJson.SelfType = jsObject then
      begin
        //Showmessage(ChildJson.Field['city'].Value);
        Memo1.Lines.Add('今日天气('+Vartostr(ChildJson.Field['date_y'].Value)+'
      

  4.   

    开发过
    先从QQ的接口获取当前IP的地址,再通过中国天气的城市代码对照表获取城市代码,
    然后导入天气接口的WebService单元,然后传城市代码过去,返回一个天气信息的字符串,
    自己再解析出今明后的天气。。
      

  5.   

    开发过
    先从QQ的接口获取当前IP的地址,再通过中国天气的城市代码对照表获取城市代码,
    然后导入天气接口的WebService单元,然后传城市代码过去,返回一个天气信息的字符串,
    自己再解析出今明后的天气。。
    ------
    太理论了,能否来点实际的呢,谢谢
      

  6.   

    代码运行不了,这个只是网上的一些方法,具体的还是要请教下。
    //url := 'http://m.weather.com.cn/data/'+Combobox1.Values.ValueFromIndex[ComboBox1.ItemIndex]+'.html';
    ---- 这个是原来网上的代码,如城市是深圳,那么是不是 ... 深圳.html ?? 但是这样打不开网页。
    我现在调用 http://www.webxml.com.cn/webservices/weatherwebservice.asmx ,但是不知道怎么处理
      

  7.   

    这不是很简单么
    1.新建一个App, 放上一个button, listbox, HTTPRIO
    2.新建webservices -> wsdlInmporter 导入你这个网站的Wsdl 让程序知道调用规则
      不出意外会生成个WeatherWebService.pas ,主窗体引用它
      http://www.webxml.com.cn/WebServices/WeatherWebService.asmx?wsdl3.设置HTTPRIO的 port, service, wsdlLocation 会下拉出来
    4.写点代码吧
      //得到支持的地区
      procedure TForm1.Button1Click(Sender: TObject);
    var
      AOS: ArrayOfString;
      I: Integer;
    begin
      AOS := (HTTPRIO1 as WeatherWebServiceSoap).getSupportProvince;
      for I := Low(AOS) to High(AOS) do
        Listbox1.Items.Add(AOS[I]);
    end;
    5.剩下的楼主自己写吧,如果写的成熟了,发份给我吧:)
      

  8.   

    var
      AOS,ss: ArrayOfString;
      I: Integer;
    begin
      AOS := (HTTPRIO1 as WeatherWebServiceSoap).getSupportProvince;
      for I := Low(AOS) to High(AOS) do
      Listbox1.Items.Add(AOS[I]);  -- 可以把所有省份列出来
    但是使用下面代码,出现错误:
      -- 取省份下的城市
      ss := (HTTPRIO1 as WeatherWebServiceSoap).getSupportCity('广西')
      -- 取城市的天气
      ss := (HTTPRIO1 as WeatherWebServiceSoap).getWeatherbyCityName('深圳');---- 错误信息为:
    Project Project1.exe raised exception class ERemotableException with message '服务器无法处理请求。 ---> 未将对象引用设置到对象的实例。'. Process stopped. Use Step or Run to continue.
      

  9.   

    恩,是有点问题,这样再设一下 
    1. 把 HTTPRIO1-> HTTPWebNode->的UseUTF8InHeader 设为True
    2. 打开WeatherWebService.pas在initialization最下面添加上
       InvRegistry.RegisterInvokeOptions(TypeInfo(WeatherWebServiceSoap), ioDocument);
      

  10.   

    谢谢  flcop 。已经OK