2016-07-29 3 views
-2

Фон: У меня есть HTML-файл, содержащий JavaScript. Этот файл размещен на сервере. В том же каталоге есть файл PHP. Имейте это в виду.запрос ajax не удается связаться с php

Пользователь выбирает некоторые параметры, и сайт генерирует строку XML на основе этих параметров. Затем я хочу передать эту строку XML в файл PHP для создания XML-файла и выполнить команду, относящуюся к этому файлу на этом сервере.

Проблема: При получении запроса AJAX GET появляется ошибка 400 (неправильный запрос). Зачем? Это потому, что файлы находятся в одном каталоге?

JS AJAX:

 $.ajax({ 
     type: "GET", 
     url: 'Submit_Job_to__Computer_Cluster.php', 
     data: {XML_requested_job : XML_string}, 
     dataType: "json", 
     success: function (msg) { 
      console.log(msg); 
     }, 
     error: function (errormessage) { 
      console.log("error: " + errormessage); 
     } 
    }); 

PHP:

<?php 
header("Access-Control-Allow-Origin: *"); 
$today = getdate(); 
$year = (string) $today['year']; 
$month = (string) $today['month']; 
$day = (string) $today['mday']; 
$XML_string = $_GET["XML_requested_job"]; //here's where the query data comes into play 
$db_path = " /tmp/"; 
$db_path .= $year; 
$db_path .= $month; 
$db_path .= $day; 
$db_path .= ".db"; 
$rocoto_path = "/work/apps/gnu_4.8.5/rocoto/1.2.1/bin/rocotorun"; 
$XML_file= "workflowPROD.xml"; 
$file_handle = fopen($XML_file, 'w') or die("Can't open the file"); 
fwrite($file_handle, $XML_string); 
fclose($file_handle); 
//concatenate command 
$exec_command = $rocoto_path; 
$exec_command .= " -w "; 
$exec_command .= $XML_file; 
$exec_command .= " -d"; 
$exec_command .= $db_path; 
echo json_encode($XML_string); 
shell_exec($exec_command);?> 

EDIT: Изменение типа для POST кидает 501 не реализовано ошибку вместо этого.

+1

Избегайте отправки слишком большого количества данных с помощью запроса GET. Вместо этого используйте POST. – Ibrahim

+1

Почему ваш текст на стороне клиента text/html? вы не отправляете текст/html. Почему для CrossDomain установлено значение true? –

+1

'crossDomain: true,' - Это только различие, если вы делаете запрос к ** тому же происхождению **, который будет ** перенаправлен ** на другой. Это очень редкая вещь, которая почти наверняка раздувается. – Quentin

ответ

0

Обнаружили проблему и решили ее.

Оказывается, мне пришлось кодировать передаваемые данные, новичковую ошибку.

  1. Сделан переменный: var encodedXML = encodeURI(XML_String);
  2. Именуется этим переменным (encodedXML) вместо: data: {XML_requested_job : encodedXML}

Спасибо за все замечания и помощи.

2

Наиболее вероятной причиной является то, что вы сказали:

contentType: "text/html; charset=utf-8", 

Этот тип контента вызывает preflight OPTIONS request, потому что это не в списке безопасных типов контента (то есть те, которые вы могли бы вызвать с простая форма HTML).

Вы можете проверить это, используя вкладку «Сеть» в Инструментах разработчика вашего браузера.

Если сервер настроен неправильно, он может ответить на запрос OPTIONS с ошибкой 400 Bad Request.

Чтобы исправить это, удалите эту линию. Поскольку вы не используете POSTING, PUTing или иным образом отправляете HTML-документ в тело запроса, это все равно ложь.

+0

Это запрос на перекрестный поиск, 'crossDomain: true' обеспечивает предполетную проверку не? – etherealite

+0

К сожалению, удаление этой строки не устранило проблему. –

+0

@etherealite - Нет. Он ** останавливается ** предполетным, когда (а) вы делаете тот же запрос происхождения, который перенаправляется на другое происхождение, и (б) вы не добавляете вручную то, что вызовет предполетную – Quentin

Смежные вопросы