BadRequestHttpException POST REST资源

时间:2017-12-04 16:37:19

标签: rest post drupal drupal-8 bad-request

我正在尝试创建自定义REST资源。我的模块如下:

/example.info.yml

http://URL-FROM-EXAM.com

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

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

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

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);
    }
}

将以下Javascript附加到POST for POST:

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

我收到状态400,回复{“message”:“语法错误”}。以下日志是记录:

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);
        });

    });

非常感谢任何建议。感谢。

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

1 个答案:

答案 0 :(得分:0)

数据编码不正确......

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);
});

谢谢cilefen。请参阅https://www.drupal.org/project/drupal/issues/2928340#comment-12371675