Cómo arreglar la solicitud de la API de REDCap que devuelve 403 con Javascript pero funciona con otros lenguajes

Conocedor raro

SOLUCIÓN:

function REDCapImportRecord() {
  const url = 'https://redcap.INSTITUTION.edu/api/'

  const testdata = [{
    record_id: 'TEST123456',
    testfield: 'test'
  }]

  const body = new FormData();
  body.append('token', 'MYTOKEN');
  body.append('content', 'record');
  body.append('format', 'json');
  body.append('data', JSON.stringify(testdata));

  const params = {
    method: 'POST',
    body,
  }

return fetch(url, params)
  .then(data => {
    console.log('fetch data: ', data)
  })
  .catch(error => console.log('Error: ', error))
}

Pregunta original:

Estoy creando una aplicación React Native para interactuar con REDCap y tengo dificultades para utilizar la API en Javascript.

He habilitado todos los privilegios en REDCap y puedo hacer llamadas con éxito usando PHP y en REDCap API Playground.

Para la aplicación, estoy usando fetch:

async function REDCapImport() {
  const url = 'https://redcap.med.INSTITUTION.edu/api/'

  const testdata = {
    record_id: 'TEST1234',
    test_field: 'TEST'
  }

  const params = {
    method: 'POST',
    token: 'MYTOKEN',
    content: 'record',
    format: 'json',
    type: 'flat',
    overwriteBehavior: 'normal',
    forceAutoNumber: false,
    data: JSON.stringify(testdata),
    returnContent: 'count',
    returnFormat: 'json',
  }

  return await fetch(url, params)
    .then(data => {
      console.log('fetch data: ', data)
    })
    .then(response => console.log('Response: ', response))
    .catch(error => console.log('Error: ', error))
  }

}

Aquí está el PHP que funciona:

<?php
$data = array(
    'token' => 'MYTOKEN',
    'content' => 'record',
    'format' => 'json',
    'type' => 'flat',
    'overwriteBehavior' => 'normal',
    'forceAutoNumber' => 'false',
    'data' => $testdata,
    'returnContent' => 'count',
    'returnFormat' => 'json'
);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://redcap.med.upenn.edu/api/');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_VERBOSE, 0);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_AUTOREFERER, true);
curl_setopt($ch, CURLOPT_MAXREDIRS, 10);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_FRESH_CONNECT, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data, '', '&'));
$output = curl_exec($ch);
print $output;
curl_close($ch);

Recibo un error 403:

error

Incluso parece que en el objeto params, si elimino el token de API, no cambia el error; todavía devuelve 403.

Funciona bien en PHP, así que siento que estoy haciendo algo mal ya que mi token y mis privilegios funcionan.

Cualquier ayuda sobre cómo hacer que esta solicitud funcione en Javascript será muy apreciada. ¡Gracias!

Patrick Evans

Está poniendo sus datos en el lugar incorrecto en su js. El segundo argumento del método fetch () es un objeto de configuración, no un objeto de datos directo. Sus datos deben ir a una propiedad de ese objeto de configuración, específicamente la bodypropiedad. Puede estar en algunas estructuras diferentes blob, FormData, cadena de consulta, etc.

Entonces harías algo como:

let data = new FormData();
data.append('token','your token');
data.append('format','json');
data.append('data',JSON.stringify(testData));
/* etc, keep appending all your data */

let settings={
  method:'post',
  body:data
};
fetch('url',settings)

Este artículo se recopila de Internet, indique la fuente cuando se vuelva a imprimir.

En caso de infracción, por favor [email protected] Eliminar

Editado en
0

Déjame decir algunas palabras

0Comentarios
Iniciar sesiónRevisión de participación posterior

Artículos relacionados