从存储过程调用API

时间:2017-11-21 09:37:37

标签: sql sql-server database tsql

我试图从存储过程中的API内部获取结果,但结果为null。我不能代表实际的调用,因为它包含敏感信息,但它有这样的逻辑:

EXEC @hResult = sp_OACreate 'MSXML2.XMLHTTP', @Object OUT;
Select @hResult as Create1 --@hResult=0 --> Create OK

EXEC @hResult = sp_OAMethod @Object, 'open', NULL, 'get',@WebAPI,'false'
Select @hResult as Get1 --@hResult=0 --> GET OK

EXEC @hResult = sp_OAMethod @Object, 'send'
Select @hResult as SEND1 --@hResult=0 --> SEND OK

declare @XML table(yourXML XML) INSERT @xml ( yourXML )
EXEC @hResult = sp_OAGetProperty @Object, 'responseXML.xml'
Select @hResult as Response1 --@hResult=0 --> Response OK

Select * from @XML

我在SQL服务器外测试了查询,它运行正常。我从SQL服务器调用了一个虚拟API('https://www.mocky.io/v2/5185415ba171ea3a00704eed'),结果没问题。

由于输出很长,我试图将结果存储到表或XML变量中,但结果仍为空。

API将返回JSON或XML。例如,结果集将是:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<route code="200" message="OKs">
    <cross_seca>false</cross_seca>
    <total_distance>14417.8587</total_distance>
    <total_seca_distance>0.0</total_seca_distance>
    <section>
        <from_port seca_port="true">CORINTH</from_port>
        <to_port seca_port="false">PUSAN</to_port>
        <distance>14417.8587</distance>
        <distance_seca>0.0</distance_seca>
        <waypoint lat="37.9333000183105" lon="22.9500007629395" name="CORINTH" seca="false"/>
        <waypoint lat="37.9612731933594" lon="22.9347362518311" seca="false"/>
        <waypoint lat="38.0481071472168" lon="22.8005352020264" seca="false"/>
        <waypoint lat="38.2301750183105" lon="22.4502639770508" seca="false"/>
        <waypoint lat="38.3078460693359" lon="22.0923881530762" seca="false"/>
        <waypoint lat="38.3470115661621" lon="21.9775218963623" seca="false"/>
        <waypoint lat="38.3525581359863" lon="21.8507251739502" seca="false"/>
        <waypoint lat="38.3245086669922" lon="21.7836151123047" seca="false"/>
        <waypoint lat="1.5563510656357" lon="108.975273132324" name="KALIMANTAN WEST (RP)" seca="false"/>
        <waypoint lat="3.5768096446991" lon="110.003883361816" seca="false"/>
        <waypoint lat="17.2663631439209" lon="118.031089782715" seca="false"/>
        <waypoint lat="21.8487491607666" lon="121.073471069336" seca="false"/>
        <waypoint lat="22.5359420776367" lon="121.593360900879" name="LAN YU IS. (RP)" seca="false"/>
        <waypoint lat="34.9842147827148" lon="129.087631225586" seca="false"/>
        <waypoint lat="35.0500526428223" lon="129.164993286133" seca="false"/>
        <waypoint lat="35.1067888889" lon="129.0624694444" name="PUSAN" seca="false"/>
    </section>
</route>

为什么我无法通过SQL服务器获得结果?

EDIT1: API提供有关返回结果的次数的信息。当我从SQL服务器调用它时,它返回null但是API已经发送了所有信息。

EDIT2:

  • 当我在Postman上运行Web API时,它运行正常。
  • 如果我复制结果并创建一个模拟API来给我相同的结果集,并从SQL服务器调用模拟API就可以正常工作
  • (!)如果我从服务器调用API,则所有hResults报告为0(成功)但数组上的最终选择返回null

EDIT3:

从程序中调用 https API时存在一些问题。当我尝试调用 http API工作正常时。

1 个答案:

答案 0 :(得分:1)

由于缺少客户端证书,我可以从程序中调用任何HTTP而不是HTTPS。我从浏览器复制了证书,呼叫成功。邮递员和浏览器具有获取证书的内置功能。<​​/ p>

但是在任何情况下都应该阻止来自程序的直接HTTP调用,因为这里的评论中提到了它。