BadRequestHttpException POST REST Resource

淺唱寂寞╮ 提交于 2019-12-11 18:02:29

问题


I am attempting to create a custom REST resource. My module is as follows:

/example.info.yml

name: Example
description: ''
type: module
core: 8.x
version: DEV
dependencies:
 - serialization
 - basic_auth
 - rest

/src/Plugin/rest/resource/BasicGetResource.php

namespace Drupal\Example\Plugin\rest\resource;

use Drupal\rest\Plugin\ResourceBase;
use Drupal\rest\ResourceResponse;

/**
 * Provides an Example Resource
 *
 * @RestResource(
 *   id = "example_resource",
 *   label = @Translation("Example Resource"),
 *   uri_paths = {
 *     "canonical" = "/api/basic",
 *     "https://www.drupal.org/link-relations/create" = "/api/basic"
 *   }
 * )
 */

class ExampleResource extends ResourceBase {
    /**
    * Responds to GET requests.
    * @return \Drupal\rest\ResourceResponse
    */
    public function get() {
        $response = ['data' => 'Basic Authentication'];
        return new ResourceResponse($response);
    }

    /**
    * Responds to POST requests.
    * @return \Drupal\rest\ResourceResponse
    */
    public function post($data) {
        $response = ['data' => $data];
        return new ResourceResponse($response);
    }
}

/config/install/rest.resource.example_resource.yml

langcode: en
status: true
dependencies:
  module:
    - basic_auth
    - example
    - serialization
_core:
  default_config_hash: NSa-WWwv2X-ogB4ojX2-m6rCsWMY6tzOZFZySnI5yfM
id: example_resource
plugin_id: example_resource
granularity: resource
configuration:
  methods:
    - GET
    - POST
  formats:
    - json
  authentication:
    - basic_auth

Attaching the following Javascript to a Block for POST:

var token;
var credentials = btoa("[USERNAME]:[PASSWORD]");

var settings = {
    "async": true,
    "crossDomain": true,
    "url": "/rest/session/token",
    "method": "GET",
    "headers": {"Content-Type": "application/x-www-form-urlencoded"},
};

$.ajax(settings).done(function (response) {
    token = response;
});

$('#btn-basic-post').click(function() {
    var form = new FormData();
    form.append("message", "Hello World!");

    var settings = {
        "async": true,
        "crossDomain": true,
        "url": "/api/basic?_format=json",
        "method": "POST",
        "headers": {
                "x-csrf-token": token,
            "authorization": "Basic " + credentials,
            "cache-control": "no-cache",
            "Content-Type": "application/json",
            "Accept": 'application/json',
          },
          "processData": false,
          "contentType": false,
          "mimeType": "multipart/form-data",
          "data": form
        }

        $.ajax(settings).done(function (response) {
          alert(response.data);
        });

    });

I receive status 400, with response {"message":"Syntax error"}. The following log is records:

Symfony\Component\HttpKernel\Exception\BadRequestHttpException: Syntax error in Drupal\rest\RequestHandler->handle() (line 101 of C:\Users\bamberj\Sites\devdesktop\drupal-rest\core\modules\rest\src\RequestHandler.php).

Any advice would be much appreciated. Thanks.

https://www.drupal.org/project/drupal/issues/2928340


回答1:


Data was not encoded correctly ...

var data = JSON.stringify({
    message: 'Hello World',
});

var settings = {
  "async": true,
  "crossDomain": true,
  "url": "/api/basic?_format=json",
  "method": "POST",
  "headers": {
    "x-csrf-token": token,
    "authorization": "Basic YWRtaW46YWRtaW4=",
    "cache-control": "no-cache",
    "Content-Type": "application/json",
    "Accept": 'application/json',
  },
  "data": data,
  "dataType": "JSON",
}

$.ajax(settings).done(function (response) {
  console.log(response);
});

Thanks cilefen. See https://www.drupal.org/project/drupal/issues/2928340#comment-12371675.



来源:https://stackoverflow.com/questions/47637936/badrequesthttpexception-post-rest-resource

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!