Puncte:0

Cum se configurează o API POST personalizată pentru a accepta o solicitare cu Content-Type ca „application/x-www-form-urlencoded” în antet?

drapel bw

Am creat un controler într-un modul personalizat care acceptă a POST cerere.
Am o configurație astfel încât să primesc un POST cerere de la un server de aplicații terță parte către acest API. Cu exceptia POST cererea are o Tip de conținut: „application/x-www-form-urlencoded” în antet.
Și din această cauză primesc următoarea eroare în mesajele de jurnal recente:

Symfony\Component\HttpKernel\Exception\UnsupportedMediaTypeHttpException: Nu s-a găsit nicio rută care să se potrivească cu „Content-Type: application/x-www-form-urlencoded” în Drupal\Core\Routing\ContentTypeHeaderMatcher->filter() (linia 49 din /var/ www/html/web/core/lib/Drupal/Core/Routing/ContentTypeHeaderMatcher.php).```

Când testez API-ul folosind poștaș:

  1. dacă folosesc Tip de conținut: „application/json” în antet, codul din interiorul API este executat și primesc răspunsul corect.
  2. dacă folosesc Tip de conținut: „application/x-www-form-urlencoded”, primesc aceeași eroare.

Nu pot configura serverul de aplicații terță parte pentru a schimba Tipul de conținut. Deci singura opțiune pentru mine este să configurez API-ul pentru a accepta POST cerere cu Tip de conținut: „application/x-www-form-urlencoded”. Cum pot face acest lucru?

Editat: Clasa mea extinde clasa ResourceBase. Definirea rutei controlerului. De asemenea, folosesc drupal 8.

 * @RestResource(
 * id = "test_abc_callback",
 * label = @Translation(„API-ul personalizat pentru testare”),
 * uri_paths = {
 * "create" = "/api/v1/test_callback",
 *}
 * )
4uk4 avatar
drapel cn
Acesta este formatul implicit pentru cererile POST. Ce este în definiția rutei controlerului?
drapel bw
@4k4 Am editat întrebarea pentru a adăuga definiția rutei. Mulțumesc.
Puncte:0
drapel cn

Acesta nu este un controler personalizat. Pentru întrebarea inițială, ar trebui să definiți metoda POST într-o rută personalizată. Vedea https://www.drupal.org/docs/drupal-apis/routing-system/structure-of-routes

Dar nu aveți neapărat nevoie de un controler personalizat. Puteți adăuga serializatoare la REST API pentru formatele deja definite în obiectul de solicitare Symfony:

Solicitare::initializeFormats

funcție statică protejată initializeFormats()
{
    static::$formate = [
        'html' => ['text/html', 'application/xhtml+xml'],
        'txt' => ['text/plain'],
        'js' => ['application/javascript', 'application/x-javascript', 'text/javascript'],
        'css' => ['text/css'],
        'json' => ['application/json', 'application/x-json'],
        'jsonld' => ['application/ld+json'],
        'xml' => ['text/xml', 'application/xml', 'application/x-xml'],
        'rdf' => ['application/rdf+xml'],
        'atom' => ['application/atom+xml'],
        „rss” => [„aplicație/rss+xml”],
        'form' => ['application/x-www-form-urlencoded'],
    ];
}

Vedea https://www.drupal.org/docs/drupal-apis/serialization-api/adding-new-formats și Cum pot POST date x-www-form-urlencoded din pluginul REST API?

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.