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:
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!
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 body
propiedad. 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
Déjame decir algunas palabras