2017-12-04 2 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에 대한 블록에 다음 자바 스크립트를 부착 .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 

:

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

    }); 

상태가 400이고 응답이 { "message": "Syntax error"}입니다. 다음 로그는 레코드입니다 :

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을 참조하십시오.

관련 문제