【问题标题】:gSoap how can I read a set of data from web services using credentialsgSoap 如何使用凭据从 Web 服务读取一组数据
【发布时间】:2023-01-13 22:16:31
【问题描述】:

我是 gSoap 的新手,需要创建一个 Web 服务客户端来接收包含 C 中多条记录的响应。

通过 wsdl2h 和 soapcpp2 我生成了各种中间文件,在 soapStub.h 下面

#ifndef soapStub_H
#define soapStub_H
#define SOAP_NAMESPACE_OF_ns1   "urn:eda-sw-schemas/page/salesorder"
#include "stdsoap2.h"
#ifdef __cplusplus
extern "C" {
#endif

/******************************************************************************\
 *                                                                            *
 * Enumerations                                                               *
 *                                                                            *
\******************************************************************************/


#ifndef SOAP_TYPE_xsd__boolean
#define SOAP_TYPE_xsd__boolean (7)
/* xsd:boolean */
enum xsd__boolean {xsd__boolean__false_ = 0, xsd__boolean__true_ = 1};
#endif

#ifndef SOAP_TYPE_ns1__Job_USCOREQueue_USCOREStatus
#define SOAP_TYPE_ns1__Job_USCOREQueue_USCOREStatus (10)
/* ns1:Job_Queue_Status */
enum ns1__Job_USCOREQueue_USCOREStatus {ns1__Job_USCOREQueue_USCOREStatus___USCOREblank_USCORE = 0, ns1__Job_USCOREQueue_USCOREStatus__Scheduled_USCOREfor_USCOREPosting = 1, ns1__Job_USCOREQueue_USCOREStatus__Error = 2, ns1__Job_USCOREQueue_USCOREStatus__Posting = 3};
#endif

#ifndef SOAP_TYPE_ns1__Status
#define SOAP_TYPE_ns1__Status (11)
/* ns1:Status */
enum ns1__Status {ns1__Status__Open = 0, ns1__Status__Released = 1, ns1__Status__Pending_USCOREApproval = 2, ns1__Status__Pending_USCOREPrepayment = 3};
#endif

#ifndef SOAP_TYPE_ns1__Prepmt_USCORECM_USCORERefers_USCOREto_USCOREPeriod
#define SOAP_TYPE_ns1__Prepmt_USCORECM_USCORERefers_USCOREto_USCOREPeriod (12)
/* ns1:Prepmt_CM_Refers_to_Period */
enum ns1__Prepmt_USCORECM_USCORERefers_USCOREto_USCOREPeriod {ns1__Prepmt_USCORECM_USCORERefers_USCOREto_USCOREPeriod___USCOREblank_USCORE = 0, ns1__Prepmt_USCORECM_USCORERefers_USCOREto_USCOREPeriod__Current = 1, ns1__Prepmt_USCORECM_USCORERefers_USCOREto_USCOREPeriod__Current_USCORECalendar_USCOREYear = 2, ns1__Prepmt_USCORECM_USCORERefers_USCOREto_USCOREPeriod__Previous_USCORECalendar_USCOREYear = 3};
#endif

#ifndef SOAP_TYPE_ns1__Type
#define SOAP_TYPE_ns1__Type (13)
/* ns1:Type */
enum ns1__Type {ns1__Type___USCOREblank_USCORE = 0, ns1__Type__G_USCOREL_USCOREAccount = 1, ns1__Type__Item = 2, ns1__Type__Resource = 3, ns1__Type__Fixed_USCOREAsset = 4, ns1__Type__Charge_USCOREItem = 5};
#endif

#ifndef SOAP_TYPE_ns1__IC_USCOREPartner_USCORERef_USCOREType
#define SOAP_TYPE_ns1__IC_USCOREPartner_USCORERef_USCOREType (14)
/* ns1:IC_Partner_Ref_Type */
enum ns1__IC_USCOREPartner_USCORERef_USCOREType {ns1__IC_USCOREPartner_USCORERef_USCOREType___USCOREblank_USCORE = 0, ns1__IC_USCOREPartner_USCORERef_USCOREType__G_USCOREL_USCOREAccount = 1, ns1__IC_USCOREPartner_USCORERef_USCOREType__Item = 2, ns1__IC_USCOREPartner_USCORERef_USCOREType__Charge_USCOREItem = 3, ns1__IC_USCOREPartner_USCORERef_USCOREType__Cross_USCOREReference = 4, ns1__IC_USCOREPartner_USCORERef_USCOREType__Common_USCOREItem_USCORENo = 5, ns1__IC_USCOREPartner_USCORERef_USCOREType__Vendor_USCOREItem_USCORENo = 6};
#endif

#ifndef SOAP_TYPE_ns1__Prepmt_USCORECM_USCORERefers_USCOREto_USCOREPeriod_USCORE12139
#define SOAP_TYPE_ns1__Prepmt_USCORECM_USCORERefers_USCOREto_USCOREPeriod_USCORE12139 (15)
/* ns1:Prepmt_CM_Refers_to_Period_12139 */
enum ns1__Prepmt_USCORECM_USCORERefers_USCOREto_USCOREPeriod_USCORE12139 {ns1__Prepmt_USCORECM_USCORERefers_USCOREto_USCOREPeriod_USCORE12139___USCOREblank_USCORE = 0, ns1__Prepmt_USCORECM_USCORERefers_USCOREto_USCOREPeriod_USCORE12139__Current = 1, ns1__Prepmt_USCORECM_USCORERefers_USCOREto_USCOREPeriod_USCORE12139__Current_USCORECalendar_USCOREYear = 2, ns1__Prepmt_USCORECM_USCORERefers_USCOREto_USCOREPeriod_USCORE12139__Previous_USCORECalendar_USCOREYear = 3};
#endif

#ifndef SOAP_TYPE_ns1__SalesOrder_USCOREFields
#define SOAP_TYPE_ns1__SalesOrder_USCOREFields (16)
/* ns1:SalesOrder_Fields */
enum ns1__SalesOrder_USCOREFields {ns1__SalesOrder_USCOREFields__No = 0, ns1__SalesOrder_USCOREFields__Sell_USCOREto_USCORECustomer_USCORENo = 1, ns1__SalesOrder_USCOREFields__Sell_USCOREto_USCORECustomer_USCOREName = 2, ns1__SalesOrder_USCOREFields__Job_USCOREQueue_USCOREStatus = 3, ns1__SalesOrder_USCOREFields__Status = 4};
#endif

/******************************************************************************\
 *                                                                            *
 * Types with Custom Serializers                                              *
 *                                                                            *
\******************************************************************************/


/******************************************************************************\
 *                                                                            *
 * Classes and Structs                                                        *
 *                                                                            *
\******************************************************************************/


#if 0 /* volatile type: do not declare here, declared elsewhere */

#endif

#ifndef SOAP_TYPE_ns1__Sales_USCOREOrder_USCORELine
#define SOAP_TYPE_ns1__Sales_USCOREOrder_USCORELine (17)
/* ns1:Sales_Order_Line */
struct ns1__Sales_USCOREOrder_USCORELine
{
    char *Key;  /* optional element of type xsd:string */
    enum ns1__Type *Type;   /* optional element of type ns1:Type */
    char *FilteredTypeField;    /* optional element of type xsd:string */
    char *No;   /* optional element of type xsd:string */
    enum xsd__boolean *Include_USCOREin_USCOREVAT_USCORETransac_USCORERep;  /* optional element of type xsd:boolean */
    enum ns1__IC_USCOREPartner_USCORERef_USCOREType *IC_USCOREPartner_USCORERef_USCOREType; /* optional element of type ns1:IC_Partner_Ref_Type */
    enum ns1__Prepmt_USCORECM_USCORERefers_USCOREto_USCOREPeriod_USCORE12139 *Prepmt_USCORECM_USCORERefers_USCOREto_USCOREPeriod;   /* optional element of type ns1:Prepmt_CM_Refers_to_Period_12139 */
    char *Requested_USCOREDelivery_USCOREDate;  /* optional element of type xsd:date */
    char *Whse_USCOREOutstanding_USCOREQty; /* optional element of type xsd:decimal */
    int *Appl_USCOREfrom_USCOREItem_USCOREEntry;    /* optional element of type xsd:int */
};
#endif

#ifndef SOAP_TYPE_ns1__Sales_USCOREOrder_USCORELine_USCOREList
#define SOAP_TYPE_ns1__Sales_USCOREOrder_USCORELine_USCOREList (23)
/* ns1:Sales_Order_Line_List */
struct ns1__Sales_USCOREOrder_USCORELine_USCOREList
{
    int __sizeSales_USCOREOrder_USCORELine; /* sequence of elements <Sales_Order_Line> */
    struct ns1__Sales_USCOREOrder_USCORELine *Sales_USCOREOrder_USCORELine; /* required element of type ns1:Sales_Order_Line */
};
#endif

#ifndef SOAP_TYPE_ns1__SalesOrder
#define SOAP_TYPE_ns1__SalesOrder (25)
/* ns1:SalesOrder */
struct ns1__SalesOrder
{
    char *Key;  /* optional element of type xsd:string */
    char *No;   /* optional element of type xsd:string */
    char *Sell_USCOREto_USCORECustomer_USCORENo;    /* optional element of type xsd:string */
    char *Sell_USCOREto_USCORECustomer_USCOREName;  /* optional element of type xsd:string */
    enum ns1__Job_USCOREQueue_USCOREStatus *Job_USCOREQueue_USCOREStatus;   /* optional element of type ns1:Job_Queue_Status */
    enum ns1__Status *Status;   /* optional element of type ns1:Status */
    struct ns1__Sales_USCOREOrder_USCORELine_USCOREList *SalesLines;    /* optional element of type ns1:Sales_Order_Line_List */
};
#endif

#ifndef SOAP_TYPE_ns1__SalesOrder_USCOREList
#define SOAP_TYPE_ns1__SalesOrder_USCOREList (29)
/* ns1:SalesOrder_List */
struct ns1__SalesOrder_USCOREList
{
    int __sizeSalesOrder;   /* sequence of elements <SalesOrder> */
    struct ns1__SalesOrder *SalesOrder; /* required element of type ns1:SalesOrder */
};
#endif

#ifndef SOAP_TYPE_ns1__SalesOrder_USCOREFilter
#define SOAP_TYPE_ns1__SalesOrder_USCOREFilter (31)
/* ns1:SalesOrder_Filter */
struct ns1__SalesOrder_USCOREFilter
{
    enum ns1__SalesOrder_USCOREFields Field;    /* required element of type ns1:SalesOrder_Fields */
    char *Criteria; /* required element of type xsd:string */
};
#endif

#ifndef SOAP_TYPE__ns1__ReadMultiple
#define SOAP_TYPE__ns1__ReadMultiple (32)
/* ns1:ReadMultiple */
struct _ns1__ReadMultiple
{
    int __sizefilter;   /* sequence of elements <filter> */
    struct ns1__SalesOrder_USCOREFilter *filter;    /* required element of type ns1:SalesOrder_Filter */
    char *bookmarkKey;  /* optional element of type xsd:string */
    int setSize;    /* required element of type xsd:int */
};
#endif

#ifndef SOAP_TYPE__ns1__ReadMultiple_USCOREResult
#define SOAP_TYPE__ns1__ReadMultiple_USCOREResult (34)
/* ns1:ReadMultiple_Result */
struct _ns1__ReadMultiple_USCOREResult
{
    struct ns1__SalesOrder_USCOREList *ReadMultiple_USCOREResult;   /* SOAP 1.2 RPC return element (when namespace qualified) */    /* optional element of type ns1:SalesOrder_List */
};
#endif

#ifndef SOAP_TYPE___ns1__ReadMultiple
#define SOAP_TYPE___ns1__ReadMultiple (39)
/* Operation wrapper: */
struct __ns1__ReadMultiple
{
    struct _ns1__ReadMultiple *ns1__ReadMultiple;   /* optional element of type ns1:ReadMultiple */
};
#endif

#ifndef SOAP_TYPE_SOAP_ENV__Header
#define SOAP_TYPE_SOAP_ENV__Header (40)
/* SOAP Header: */
struct SOAP_ENV__Header
{
#ifdef WITH_NOEMPTYSTRUCT
    char dummy; /* dummy member to enable compilation */
#endif
};
#endif

#ifndef SOAP_TYPE_SOAP_ENV__Code
#define SOAP_TYPE_SOAP_ENV__Code (41)
/* SOAP Fault Code: */
struct SOAP_ENV__Code
{
    char *SOAP_ENV__Value;  /* optional element of type xsd:QName */
    struct SOAP_ENV__Code *SOAP_ENV__Subcode;   /* optional element of type SOAP-ENV:Code */
};
#endif

#ifndef SOAP_TYPE_SOAP_ENV__Detail
#define SOAP_TYPE_SOAP_ENV__Detail (43)
/* SOAP-ENV:Detail */
struct SOAP_ENV__Detail
{
    int __type; /* any type of element <fault> (defined below) */
    void *fault;    /* transient */
    char *__any;
};
#endif

#ifndef SOAP_TYPE_SOAP_ENV__Reason
#define SOAP_TYPE_SOAP_ENV__Reason (46)
/* SOAP-ENV:Reason */
struct SOAP_ENV__Reason
{
    char *SOAP_ENV__Text;   /* optional element of type xsd:string */
};
#endif

#ifndef SOAP_TYPE_SOAP_ENV__Fault
#define SOAP_TYPE_SOAP_ENV__Fault (47)
/* SOAP Fault: */
struct SOAP_ENV__Fault
{
    char *faultcode;    /* optional element of type xsd:QName */
    char *faultstring;  /* optional element of type xsd:string */
    char *faultactor;   /* optional element of type xsd:string */
    struct SOAP_ENV__Detail *detail;    /* optional element of type SOAP-ENV:Detail */
    struct SOAP_ENV__Code *SOAP_ENV__Code;  /* optional element of type SOAP-ENV:Code */
    struct SOAP_ENV__Reason *SOAP_ENV__Reason;  /* optional element of type SOAP-ENV:Reason */
    char *SOAP_ENV__Node;   /* optional element of type xsd:string */
    char *SOAP_ENV__Role;   /* optional element of type xsd:string */
    struct SOAP_ENV__Detail *SOAP_ENV__Detail;  /* optional element of type SOAP-ENV:Detail */
};
#endif

/******************************************************************************\
 *                                                                            *
 * Typedefs                                                                   *
 *                                                                            *
\******************************************************************************/

#ifndef SOAP_TYPE__QName
#define SOAP_TYPE__QName (5)
typedef char *_QName;
#endif

#ifndef SOAP_TYPE__XML
#define SOAP_TYPE__XML (6)
typedef char *_XML;
#endif

#ifndef SOAP_TYPE_xsd__date
#define SOAP_TYPE_xsd__date (8)
typedef char *xsd__date;
#endif

#ifndef SOAP_TYPE_xsd__decimal
#define SOAP_TYPE_xsd__decimal (9)
typedef char *xsd__decimal;
#endif


/******************************************************************************\
 *                                                                            *
 * Externals                                                                  *
 *                                                                            *
\******************************************************************************/


/******************************************************************************\
 *                                                                            *
 * Server-Side Operations                                                     *
 *                                                                            *
\******************************************************************************/


SOAP_FMAC5 int SOAP_FMAC6 __ns1__ReadMultiple(struct soap*, struct _ns1__ReadMultiple *ns1__ReadMultiple, struct _ns1__ReadMultiple_USCOREResult *ns1__ReadMultiple_USCOREResult);

/******************************************************************************\
 *                                                                            *
 * Server-Side Skeletons to Invoke Service Operations                         *
 *                                                                            *
\******************************************************************************/

SOAP_FMAC5 int SOAP_FMAC6 soap_serve(struct soap*);

SOAP_FMAC5 int SOAP_FMAC6 soap_serve_request(struct soap*);

SOAP_FMAC5 int SOAP_FMAC6 soap_serve___ns1__ReadMultiple(struct soap*);

/******************************************************************************\
 *                                                                            *
 * Client-Side Call Stubs                                                     *
 *                                                                            *
\******************************************************************************/


SOAP_FMAC5 int SOAP_FMAC6 soap_call___ns1__ReadMultiple(struct soap *soap, const char *soap_endpoint, const char *soap_action, struct _ns1__ReadMultiple *ns1__ReadMultiple, struct _ns1__ReadMultiple_USCOREResult *ns1__ReadMultiple_USCOREResult);

#ifdef __cplusplus
}
#endif

#endif

/* End of soapStub.h */

在 SalesOrderRedux.c 文件中,我实现了以下代码:

#include "soapH.h"
#include "SalesOrder_USCOREBinding.nsmap"
int main() { 
    struct soap soap;
    struct _ns1__ReadMultiple_USCOREResult *ns1__ReadMultiple_USCOREResult;
    soap_init(&soap);
    soap.userid = "administrator";
    soap.passwd = "password";
    
    soap_call___ns1__ReadMultiple(&soap, "http://localhost:8012/ERP/WS/Vendor/Page/SalesOrder", "", NULL, ns1__ReadMultiple_USCOREResult);
    
    printf("ns1__ReadMultiple_USCOREResult %s\n", (ns1__ReadMultiple_USCOREResult == NULL)?"is NULL":"is Not NULL");
    
    return 0; 
}

上面的程序是我正在尝试做的事情的草稿: 如何通过凭据连接到 Web 服务并从 soap_call___ns1__ReadMultiple 服务获取数据集?

更新我听从了 rveerd 的建议:

我有消息:

Error 401 fault: SOAP-ENV:Server [no subcode] 
"HTTP Error" Detail: HTTP/1.1 401 Unauthorized

如果我使用浏览器连接到 url localhost:8012/ERP/WS/Vendor/Page/SalesOrder,则会向我显示用于输入凭据的面板,我输入它们并显示 wsdl 布局。

如果我使用以下 powershell 脚本,则连接有效:

$username = "myUser"
$password = "MyPasswd"

$URI = "http://localhost:8012/ERP/WS/Vendor/Page/SalesOrder"
$cred = New-Object System.Management.Automation.PSCredential -ArgumentList @($username,(ConvertTo-SecureString -String $password -AsPlainText -Force))
$WSProxy = New-WebServiceProxy -Uri $URI -Credential $cred
$WSProxy.ReadMultiple($null, "", 0)

有用 !

我错了什么?

【问题讨论】:

  • 到底是什么不起作用?
  • @rveerd 我不知道如何知道我是否已连接或身份验证是否错误,而且我不知道如何创建数据结构(例如,我是否必须使用 malloc 或 gSoap 提供分配内存的功能? ) 传递给函数 soap_call___ns1__ReadMultiple

标签: c window webservice-client gsoap


【解决方案1】:

gSoap 网站有一个basic client in C。为你的例子改变它给出:

int main()
{
  struct soap *soap = soap_new(); // allocate and initialize a context
  soap->userid = "administrator";
  soap->passwd = "password";
  struct _ns1__ReadMultiple_USCOREResult res;
  if (soap_call___ns1__ReadMultiple(soap, "http://localhost:8012/ERP/WS/Vendor/Page/SalesOrder", "", NULL, &res) == SOAP_OK) 
  {
    // process result through `res`
  }
  else
  {
    soap_print_fault(soap, stderr);
  }
  soap_destroy(soap); // delete managed deserialized C++ instances
  soap_end(soap);     // delete other managed data
  soap_free(soap);    // free the soap struct context data
}

设置 userid 和 passwd 仅在 Web 服务使用 HTTP 基本身份验证时有效。

当 SOAP 请求失败时打印错误有望让您了解哪里出了问题。

也可以通过定义宏DEBUG来build gSOAP in debug mode。

【讨论】:

  • 谢谢,我按照你的例子,我收到消息:错误 401 故障:SOAP-ENV:服务器 [无子代码]“HTTP 错误”详细信息:HTTP/1.1 401 未授权如果我使用浏览器连接到 url localhost:8012/ERP/WS/Vendor/Page/SalesOrder,则用于输入凭据的面板显示给我,我输入它们并显示 wsdl 布局。我错了什么?
  • 当您通过 HTTP 在本地运行服务器时,我会首先检查服务器日志并比较两个请求。您还可以拦截网络流量并比较两个请求。您可以使用 Wireshark 或 tcpdump 拦截网络流量。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-03
  • 1970-01-01
  • 2012-02-19
  • 1970-01-01
  • 2012-04-20
相关资源
最近更新 更多