You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Delphi 11.3 Android端POST XML报Unsupported Media Type问题求助

问题排查与解决方案

核心问题分析

你的代码存在三个关键问题,导致Android平台请求失败:

  1. XML内容错误:代码中使用了HTML转义字符(如<、"),发送的是转义后的文本而非原始XML结构,服务器无法识别为合法的SOAP请求。
  2. Content-Type设置错误:你的SOAP信封使用SOAP 1.2命名空间(http://www.w3.org/2003/05/soap-envelope),对应的正确Content-Type应为application/soap+xml; charset=utf-8,而非text/xml(SOAP 1.1专用),之前的设置方式也未正确覆盖默认请求头。
  3. 流编码处理不当:使用UTF8Encode创建TStringStream会导致编码转换混乱,应直接指定UTF-8编码创建流。

修改后的代码

procedure TForm13.Button1Click(Sender: TObject);
var
  HttpClient: TNetHTTPClient;
  Response: IHTTPResponse;
  URL, XML, AFM: string;
  s: TStringStream;
begin
  HttpClient := TNetHTTPClient.Create(nil);
  try
    URL := 'https://www1.gsis.gr/wsaade/RgWsPublic2/RgWsPublic2?WSDL';
    // 修复XML内容:直接使用原始XML标签,无需HTML转义
    XML := '<env:Envelope xmlns:env="http://www.w3.org/2003/05/soap-envelope" xmlns:ns1="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" xmlns:ns2="http://rgwspublic2/RgWsPublic2Service" xmlns:ns3="http://rgwspublic2/RgWsPublic2">'
          +'   <env:Header>'
          +'      <ns1:Security>'
          +'         <ns1:UsernameToken>'
          +'            <ns1:Username>username</ns1:Username>'
          +'            <ns1:Password>key</ns1:Password>'
          +'         </ns1:UsernameToken>'
          +'      </ns1:Security>'
          +'   </env:Header>'
          +'   <env:Body>'
          +'      <ns2:rgWsPublic2AfmMethod>'
          +'         <ns2:INPUT_REC>'
          +'            <ns3:afm_called_by/>'
          +'            <ns3:afm_called_for>'+AFM+'</ns3:afm_called_for>'
          +'            <ns3:as_on_date>'+FormatDateTime('yyyy-mm-dd', Date)+'</ns3:as_on_date>'
          +'         </ns2:INPUT_REC>'
          +'      </ns2:rgWsPublic2AfmMethod>'
          +'   </env:Body>'
          +'</env:Envelope>';
    
    // 直接用UTF-8编码创建字符串流,避免编码混乱
    s := TStringStream.Create(XML, TEncoding.UTF8);
    try
      // 设置SOAP 1.2对应的Content-Type,明确指定UTF-8编码
      Response := HttpClient.Post(URL, s, nil, [TNetHeader.Create('Content-Type', 'application/soap+xml; charset=utf-8')]);
      
      if Response.StatusCode = 200 then
        Memo1.Lines.Text := Response.ContentAsString()
      else
        ShowMessage('Error: ' + Response.StatusCode.ToString + ' - ' + Response.StatusText);
    finally
      s.Free;
    end;
  finally
    HttpClient.Free;
  end;
end;

额外注意事项

  • Android权限:确保Android项目已添加INTERNET权限(在AndroidManifest.xml中),否则会出现网络访问失败。
  • WSDL使用建议:手动拼接SOAP XML容易出错,建议使用Delphi的WSDL Importer导入目标WSDL,自动生成客户端代码,减少手动编码的错误。

内容的提问来源于stack exchange,提问作者user3140961

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 07:45:17