【问题标题】:Send a POST to a HTTPS - Logic Issue向 HTTPS 发送 POST - 逻辑问题
【发布时间】:2025-12-29 16:20:18
【问题描述】:

任何人都知道我为什么会收到此错误。我正在尝试发送 POST 请求,这是我收到的错误消息。

服务器响应:

Error while dispatching hrxml [ Server was unable to process request. --> Procedure or function 'sp__LogMessage' expects parameter '@pi_ClientID', which was not supplied.   at System.Web.Services.Protocols.SoapHttpClientProtocol.ReadResponse(SoapClientMessage message, WebResponse response, Stream responseStream, Boolean asyncCall)
   at System.Web.Services.Protocols.SoapHttpClientProtocol.Invoke(String methodName, Object[] parameters)
   at DispatchService.HRISMessageRouter.MessageRouter.Route(String HRXML)
   at DispatchService.DispatchMessage.Dispatch(String HRXML)]

我的代码:

URL link = new URL("https://example.com/example.asp"); 
        HttpsURLConnection com = (HttpsURLConnection) link.openConnection();
                  String l;

        con.setRequestMethod("POST");
con.setDoInput(true); 
        con.setDoOutput(true);
        con.setRequestProperty("name", "rrrrr");
        con.setRequestProperty("pwd", "ffff");

        OutputStream os = con.getOutputStream();

        os.flush();

        InputStream is = con.getInputStream();

        BufferedReader rd = new BufferedReader(new InputStreamReader(is));

          StringBuffer r = new StringBuffer(); 

          while((l = rd.readLine()) != null) {

            r.append(l);

            r.append('\r');

          }

          rd.close();

          System.out.println("out "+ r.toString());

我已经尝试调试代码等,但仍然无法找到导致这种情况发生的可能原因。谁能帮我找出这个问题的原因和可能的解决方案?

【问题讨论】:

    标签: java http post stored-procedures https


    【解决方案1】:

    错误信息是:

    服务器无法处理请求。 --> 过程或函数“sp__LogMessage”需要参数“@pi_ClientID”,但未提供。

    这看起来像是服务器上的 SQL 存储过程。检查以确保为其提供了客户端 ID。

    【讨论】:

    • 向它提供客户端 IT 是什么意思。我应该将客户端 ID 从我的代码传递到服务器吗?像这样的东西con.setRequestProperty("ID", "someID"); ?
    • 您需要确保您的调用符合您向其发送 POST 请求的 API 的合同。如果检查成功,您需要查看服务器端是否存在问题,阻止存储过程获取必要的客户端 ID。如果您无权访问服务器,则可能运气不佳。
    • 是否有任何模拟器可以用来测试 Web 服务是否正常工作?例如,当我输入参数并且模拟器发送一个 POST 来检查服务是否工作?
    【解决方案2】:

    从stacktrace来看:

    1. 您的应用程序正在与 SOAP 服务通信
    2. SOAP 服务需要一个(XML 编码的)请求,其中包含一个不存在的参数。

    但这与您的客户端代码正在执行的操作并不相符。实际上,您正在发送一个带有参数的 POST 请求,这将变成一个请求正文,它可能编码为 application/x-www-form-urlencoded ... 而不是 XML。那是行不通的。

    【讨论】:

    • 你认为我应该包括这一行con.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); 吗?你能告诉我一个例子来解释你的场景吗?
    • 添加Content-type 标头可能无济于事。该请求可能已经有一个。您需要找出服务器实际希望您发送的内容......然后发送。