Delphi 11.3 Android端POST XML报Unsupported Media Type问题求助
问题排查与解决方案
核心问题分析
你的代码存在三个关键问题,导致Android平台请求失败:
- XML内容错误:代码中使用了HTML转义字符(如
<、"),发送的是转义后的文本而非原始XML结构,服务器无法识别为合法的SOAP请求。 - 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专用),之前的设置方式也未正确覆盖默认请求头。 - 流编码处理不当:使用
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
相关产品推荐
相关产品推荐

