【问题标题】:Laravel, with NuSOAP in a controller, does not work控制器中带有 NuSOAP 的 Laravel 不起作用
【发布时间】:2016-11-08 05:15:00
【问题描述】:

在内联路由闭包函数中定义 NuSOAP Web 服务效果很好,但在路由闭包控制器中则不行。

示例:工作

routes.php:

Route::any('api', function() {
    require_once ('nusoap.php');
    $server = new \nusoap_server();

    $server->configureWSDL('TestService', false, url('api'));

    $server->register('test',
        array('input' => 'xsd:string'),
        array('output' => 'xsd:string'),
    );

    function test($input){
        return $input;
    }

    $rawPostData = file_get_contents("php://input");
    return \Response::make($server->service($rawPostData), 200, array('Content-Type' => 'text/xml; charset=ISO-8859-1'));
});

SOAP 测试客户端

require_once('nusoap.php');

$client = new \nusoap_client('http://my-laravel-installation.com/api?wsdl', true);

$result = $client->call("test", "HelloWorld");

print_r($result); exit();

回复

你好世界

这按预期工作。

示例:不工作

将代码移动到专用控制器会破坏它:

routes.php:

Route::any('api', 'SoapController@server');

SoapController.php:

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class SoapController extends Controller {

    public function server() {
        require_once ('nusoap.php');
        $server = new \nusoap_server();

        $server->configureWSDL('TestService', false, url('api'));

        $server->register('test',
            array('input' => 'xsd:string'),
            array('output' => 'xsd:string'),
        );

        function test($input){
            return $input;
        }

        $rawPostData = file_get_contents("php://input");
        return \Response::make($server->service($rawPostData), 200, array('Content-Type' => 'text/xml; charset=ISO-8859-1'));
    }

}

SOAP 测试客户端

require_once('nusoap.php');

$client = new \nusoap_client('http://my-laravel-installation.com/api?wsdl', true);

$result = $client->call("test", "HelloWorld");

print_r($result); exit();

回复

“方法'test'('test')未在服务中定义('''')

复制步骤:

  1. 安装 Laravel v5.2.45 的新副本
  2. 下载最新的 NuSOAP 版本 (v0.9.5)
  3. 为 NuSOAP Web 服务定义路由 - 从上面复制并粘贴代码
  4. 创建 SoapController - 从上面复制并粘贴代码
  5. 创建一个新的临时路由作为 SOAP 客户端,并将上面 SOAP 测试客户端下面的代码复制并粘贴到该路由的闭包函数中
  6. 在浏览器中加载临时路由页面以执行对 Web 服务的 SOAP 调用

结论:

这表明,由于某种原因,使用内联路由功能与使用专用路由控制器时的输出不同。

这怎么可能?

非常感谢您的见解:

如果你有:

  • 有这方面的经验,您就有了解决方案
  • 或者,您知道为什么会发生这种情况
  • 或者,您对为什么将 NuSOAP 代码放在控制器中生成的响应与将其放在内联路由函数中产生不同的响应有任何想法

...请插话。

感谢您的意见!

【问题讨论】:

    标签: php web-services laravel soap laravel-5


    【解决方案1】:

    我有一个简单的解决方案。

    只需通过 composer 安装 nusoap

    1. composer require econea/nusoap
    2. 根据需要调用 nusoap:

      $client = new \nusoap_client('http://my-laravel-installation.com/api?wsdl', true);
      

    希望对你有帮助。

    【讨论】:

      【解决方案2】:

      对于当前的 laravel 版本,CSRF 验证应该是被动的。

      app\Http\Middleware\VerifyCsrfToken.php

          受保护的 $except = [ '你的方式' ];

      必须。

      【讨论】:

        猜你喜欢
        • 2013-03-28
        • 1970-01-01
        • 2015-11-12
        • 2017-01-03
        • 1970-01-01
        • 1970-01-01
        • 2018-10-30
        • 2015-10-17
        • 2020-03-28
        相关资源
        最近更新 更多