2016-05-23 1 views
1

J'utilise Amazons Mechanical Turk (Mturk) et j'essaie de soumettre une assignation comme étant complète pour qu'un travailleur puisse être montré au prochain HIT.Mturk externalQuestion avec jquery.ajax POST: erreur Access-Control-Allow-Origin

J'utilise externalQuestion et mon serveur stocke toutes les données que les travailleurs saisissent. Après un travailleur terminé, ils cliquent sur un bouton d'envoi qui envoient le POST suivant:

$.ajax({ 
    url: self.props.userData.turkSubmitTo + '/mturk/externalSubmit', 
    data: {assignmentId:self.props.userData.assignmentId}, 
    type: 'POST', 
    success: function(resp) { console.log('good');}, 
    error: function(resp, err) { console.log('fail'); console.log(resp); console.log(err);} 
}); 

Malheureusement, je reçois l'erreur suivante:

XMLHttpRequest cannot load https://workersandbox.mturk.com/mturk/externalSubmit?assignmentId=3AMYWKA6YBMSYVY7OGYPJIPCGPK6OK. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'https://shrouded-plains-8041.herokuapp.com' is therefore not allowed access. 

Notez que si je poste avec « jsonp » dataType pour essayer de contourner ce problème inter-domaine apparent puis le soumettre fonctionne bien, mais le iframe externalQuestion ne rafraîchit pas à la prochaine HIT. Je ne sais pas pourquoi j'obtiens ce problème inter-domaine «Access-Control-Allow-Origin». Toute aide s'il vous plaît?

+0

S'il vous plaît faire une recherche sur le Web pour cette erreur. Il arrive ici plusieurs fois par jour. En ce qui concerne l'utilisation de jsonp, vous ne pouvez pas utiliser 'POST' et jsonp puisqu'il s'agit d'une requête de script non ajax. Une réponse courte est que vous devez activer CORS sur API si possible ou utiliser un proxy – charlietfl

+0

Ok merci! Oui j'ai fait une quantité de googling. Cela a du sens à propos de jsonp, et pourquoi cela ne fonctionne pas comme prévu. Je n'ai pas accès à l'API pour activer les CORs. Je suppose que cela devra être un proxy alors. Il semble étrange que Mturk d'Amazon nécessite un proxy pour faire cette opération assez standard (et cette étrangeté est la raison pour laquelle je pose cette question). Est-ce que n'importe qui avec l'expérience de Mturk peut commenter s'il vous plaît? – Yetti

Répondre

1

Je suis entré en contact avec les gens utiles sur Amazon et ils ont répondu:

Hi Ben -

I believe the problem is that your code is attempting to get the user's browser to submit an AJAX request to Amazon. Since the page with this code is being generated by your own app on Heroku, the browser does not allow this by default (making AJAX calls from one domain to another).

The solution is to have the code do a form submit, not an AJAX submit. See documentation for JQuery's form submit here: https://api.jquery.com/submit/ .

Let me know if that works for you.

Thanks, Taneem

Voici le soumettre maintenant le code:

<rb.Modal.Footer> 
    <form name="mturk_form" method="post" id="mturk_form" action={self.props.userData.submitTo + "/mturk/externalSubmit"}> 
     <input type="hidden" value='' name="assignmentId" id={self.props.userData.assignmentId}/> 
     <rb.Input type="submit" style={{width:'70%', float: "left"}}/> 
     <rb.Button onClick={self.props.closeSubmit}>Cancel</rb.Button> 
    </form>