2017-12-04 18 views
0

カスタムRESTリソースを作成しようとしています。次のように私のモジュールは、次のとおりです。BadRequestHttpException POST RESTリソース

/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 POSTのためのブロックに次のJavascriptを取り付け

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 

.example_resource.yml:

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

    }); 

ステータスが{message: "構文エラー}}で受信しました。以下のログはレコードです:

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). 

アドバイスをいただければ幸いです。ありがとう。データが正しくエンコードされませんでした

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

+0

謝罪。これはDrupal 8.4.1に関するものです。 – bamberjp

+0

ここで解決した問題... https://www.drupal.org/project/drupal/issues/2928340#comment-12371675ありがとう。 – bamberjp

答えて

0

... cilefen

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

感謝。 https://www.drupal.org/project/drupal/issues/2928340#comment-12371675を参照してください。

関連する問題