gSOAP指定Access-Control-Allow-Origin

时间:2015-10-07 20:16:08

标签: c++ json web-services jsonp gsoap

我是gSOAP的开发人员webservice。其中一个方法返回json输出。但是浏览器需要传递标题(Access-Control-Allow-Origin)。 gSOAP是否支持在发送数据之前传递标头?

UPD:

找到解决方案。只需在http_response函数中添加一些代码:

static int
http_response(struct soap *soap, int status, size_t count)
{
 /* some code goes here*/
if ((err = soap->fposthdr(soap, "Access-Control-Allow-Origin", "*")))
      return err;
  if ((err = soap->fposthdr(soap, "Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, CONNECT")))
      return err;
  if ((err = soap->fposthdr(soap, "Access-Control-Allow-Headers", "X-Requested-With, Content-Type")))
      return err;
  if ((err = soap->fposthdr(soap, "Access-Control-Allow-Credentials", "true")))
      return err;
 /* some code goes here*/
}

2 个答案:

答案 0 :(得分:0)

我从来没有在我自己的代码中找到任何方法 - 但是我能够通过修改stdsoap2.cpp来做到这一点似乎没问题因为你需要将它编译到你的代码中。我所做的是在http_post函数结束之前添加ClientCertSubjectDN标头:

/******************************************************************************/
#ifndef WITH_NOHTTP
#ifndef PALM_1
static int
http_post(struct soap *soap, const char *endpoint, const char *host, int port, const char *path, const char *action, size_t count)
{ register const char *s;
  register int err;
  ... the code of the function (except the return at the end) ...

  /* add more headers */
  if ((err = soap->fposthdr(soap, "ClientCertSubjectDN", "CN=IVR Production")))
    return err;

  return soap->fposthdr(soap, NULL, NULL);
}
#endif
#endif

答案 1 :(得分:0)

实际上,在不更改gsoap代码的情况下,将自己的HTTP标头添加到服务器响应中的方法实际上有些麻烦。

  1. 定义一个变量来存储原始回调钩子fposthdr的地址
  2. 定义您自己的fposthdr实现
  3. 将函数fposthdr的地址存储在上述变量
  4. 设置您自己的fposthdr实现
  5. 在你自己的fposthdr实现中使用fposthdr的原始实现来发出HTTP头
  6. 代码示例:

    groovy-ant

    <强>备注: 以上 my_fposthdr 的示例实现在所有&#34;默认&#34;之后发出额外的HTTP标头。 gsoap发出的HTTP标头。每个标头由gsoap调用一次回调挂钩,最后在 key val 为NULL指针的情况下再次调用。因此,您可以让代码检测这些NULL指针并发出自己的标头。最后,您必须使用 key val 作为NULL指针调用原始fposthdr,否则将不会发送HTTP有效负载,即SOAP响应。