0

我正在编写我的第一个 Web 服务,但我遇到了与 JSON 数据传递相关的问题。我的 Web 服务分为两个文件:controller.php包含服务处理程序,以及service.php包含应请求提供的类和方法。

这是来自 controller.php 的获取片段:

    public function atender() {
        // pre-procesamos la petición
        if (!empty($_POST)) {
            if (!empty($_POST["class"]) && !empty($_POST["action"]) && !empty($_POST["function"])) {
                $clase = ucwords($_POST["class"]);
                $metodo = "{$_POST["action"]}{$this->obtenerMetodo($_POST["function"])}";
                $id = (!empty($_POST["datos"]) ? stripslashes($_POST["datos"]) : null);

我可以在 GET 和 POST 模式下处理请求(我将 GET 用于不需要身份验证的方法,例如getCategoriesgetCategoryByIdgetProductsgetProductById。这些是获取寿司餐厅菜肴类别和菜肴的方法。)

对于任何 GET 请求,一切都按预期进行。当我处理 POST 请求时,我的问题就来了。我需要以 JSON 格式获取所有 URL 参数,因为这是为 iOS 应用程序提供服务,而 JSON 是我们处理传入/传出数据的方式。

这是来自 service.php 的处理片段:

    public function putUser($datos) {
        if (!empty($datos)) {
            $usuario = json_decode($datos);
            $this->log .= implode("/", $usuario) . "\r\n";

在这种情况下,$datos是来自请求的 JSON 编码数据。它在 controller.php (上面的代码)中作为$id接收。因为这是我的第一个 Web 服务,所以我很可能在这里做了一些非常糟糕的事情,但我有点失明。

我尝试了服务处理代码的不同变体。使用 json_decode($datos, true) 也不起作用。我明白了

'Unexpected token <' 作为响应,并以原始形式(使用 Google Chrome 的高级 REST 客户端)显示:''Warning: implode() [ <a href='function.implode'>function.implode</a>]: Invalid arguments pass in /home/refine/public_html/sushigo/palma /service.php 在第 344 行'。

我知道 SOAP 通常是编写此类自定义代码的更好替代方案,但现在,我需要坚持使用此代码并为我的下一个项目实现更好的替代方案。你能告诉我我做错了什么吗?

4

1 回答 1

1

基本上,错误消息说它不是一个有效的 JSON - 而且这样的错误消息通常是正确的。

您的错误出现在发送/接收代码中。可能您以一种形式发送 JSON 并尝试以其他方式访问它。由于我无法查看电话发送的请求,我猜想:

  • 您将数据作为 application/json 发送并尝试以 url 编码形式接收它。如果您不了解其中的区别,那么这就是您的问题。
  • 您在 JSON 数据上使用了带斜杠,这是错误的。除非你打开了magic_quotes,这也是错误的(即:magic_quotes 和stripslashes 都必须去)。
于 2013-03-15T10:58:45.633 回答