Отправка фида контента Google Search Appliance (GSA) с ошибкой PHP cURL — 400

Поэтому я пытаюсь разработать модуль для моего веб-приложения, который передает поток контента в наше Google Search Appliance (GSA) с использованием PHP cURL для передачи данных на устройство в виде информации POST через порт 19900. На основе всего, что я прочитал в документации по созданию и отправке канала в GSA это должно работать без проблем, и все же сервер возвращается со следующей (невероятно неопределенной и в значительной степени бесполезной) ошибкой:

  1. Это ошибка.

Ваш клиент отправил неверный или незаконный запрос. Это все, что мы знаем.

Я устранял эту проблему с архитектором, который помог установить GSA на нашем дочернем сайте, и мы не смогли определить причину нашей проблемы. По словам нашего ИТ-отдела, все порты открыты для этого взаимодействия (и мы не получили бы сообщение об ошибке, если бы они были закрыты), и мы убедились, что IP-адрес отправляющего сервера указан как «разрешенный» в GSA. Излишне говорить, что мы в тупике.

Вот код, который передает канал XML:

<?php
$target_url = 'http://gsadomain.com:19900/xmlfeed';

$header = array('Content-Type: multipart/form-data');

$fields = array(
'feedtype'=>'incremental',
'datasource'=>'datasourcename',
'data'=>'@'.realpath('gsa_feed.xml')
);

$ch = curl_init();

curl_setopt($ch, CURLOPT_USERPWD, "gsaadmin:gsaadminpassword");
curl_setopt($ch, CURLOPT_HTTPHEADER,$header);
curl_setopt($ch, CURLOPT_TIMEOUT,120);
curl_setopt($ch, CURLOPT_URL,$target_url);
curl_setopt($ch, CURLOPT_POST,1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($fields));

$return = curl_exec($ch);

if (curl_errno($ch)) {
$msg = curl_error($ch);
}

curl_close ($ch);

echo $return;
?>

И вот XML, который мы пытаемся представить:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE gsafeed PUBLIC "-//Google//DTD GSA Feeds//EN" "http://this.is.the.ip/gsafeed.dtd">
<gsafeed>
<header>
<datasource>datasource</datasource>
<feedtype>incremental</feedtype>
</header>
<group>
<record url="http://website.com/mod/view.php?id=15903" mimetype="text/html" last-modified="Thu, 14 Aug 2014 18:53:00 GMT">
<acl inheritance-type="and-both-permit">
<principal scope="group" access="permit" namespace="Default" case-sensitivity-type="everything-case-insensitive">customers</principal>
<principal scope="group" access="permit" namespace="Default" case-sensitivity-type="everything-case-insensitive">partners</principal>
<principal scope="group" access="permit" namespace="Default" case-sensitivity-type="everything-case-insensitive">employees</principal>
</acl>
<metadata>
<meta name="type" content="module" />
<meta name="id" content="1" />
<meta name="name" content="Module for Everyone" />
<meta name="course_id" content="655" />
</metadata>
<content>
This is the description of the Module for Everyone.
</content>
</record>
<record url="http://website.com/mod/view.php?id=15904" mimetype="text/html" last-modified="Thu, 14 Aug 2014 18:53:00 GMT">
<acl inheritance-type="and-both-permit">
<principal scope="group" access="permit" namespace="Default" case-sensitivity-type="everything-case-insensitive">employees</principal>
<principal scope="group" access="permit" namespace="Default" case-sensitivity-type="everything-case-insensitive">partners</principal>
</acl>
<metadata>
<meta name="type" content="module" />
<meta name="id" content="2" />
<meta name="name" content="Module for Partners" />
<meta name="course_id" content="655" />
</metadata>
<content>
This is the description of the Module for Partners.
</content>
</record>
<record url="http://website.com/mod/view.php?id=15905" mimetype="text/html" last-modified="Thu, 14 Aug 2014 18:53:00 GMT">
<acl inheritance-type="and-both-permit">
<principal scope="group" access="permit" namespace="Default" case-sensitivity-type="everything-case-insensitive">employees</principal>
</acl>
<metadata>
<meta name="type" content="module" />
<meta name="id" content="3" />
<meta name="name" content="Module for Employees" />
<meta name="course_id" content="655" />
</metadata>
<content>
This is the description of the Module for Employees.
</content>
</record>
<record url="http://website.com/course/view.php?id=655#section-1" mimetype="text/html" last-modified="Thu, 14 Aug 2014 18:53:00 GMT">
<acl inheritance-type="and-both-permit">
<principal scope="group" access="permit" namespace="Default" case-sensitivity-type="everything-case-insensitive">customers</principal>
<principal scope="group" access="permit" namespace="Default" case-sensitivity-type="everything-case-insensitive">partners</principal>
<principal scope="group" access="permit" namespace="Default" case-sensitivity-type="everything-case-insensitive">employees</principal>
</acl>
<metadata>
<meta name="type" content="topic" />
<meta name="id" content="1" />
<meta name="name" content="Course Topic for Everyone" />
<meta name="course_id" content="655" />
</metadata>
<content>
This is the description of the Course Topic for All Audiences.
</content>
</record>
<record url="http://website.com/course/view.php?id=655#section-2" mimetype="text/html" last-modified="Thu, 14 Aug 2014 18:53:00 GMT">
<acl inheritance-type="and-both-permit">
<principal scope="group" access="permit" namespace="Default" case-sensitivity-type="everything-case-insensitive">employees</principal>
<principal scope="group" access="permit" namespace="Default" case-sensitivity-type="everything-case-insensitive">partners</principal>
</acl>
<metadata>
<meta name="type" content="topic" />
<meta name="id" content="2" />
<meta name="name" content="Course Topic for Partners" />
<meta name="course_id" content="655" />
</metadata>
<content>
This is the description of the Course Topic for Partners.
</content>
</record>
<record url="http://website.com/course/view.php?id=655#section-3" mimetype="text/html" last-modified="Thu, 14 Aug 2014 18:53:00 GMT">
<acl inheritance-type="and-both-permit">
<principal scope="group" access="permit" namespace="Default" case-sensitivity-type="everything-case-insensitive">employees</principal>
</acl>
<metadata>
<meta name="type" content="topic" />
<meta name="id" content="3" />
<meta name="name" content="Course Topic for Employees" />
<meta name="course_id" content="655" />
</metadata>
<content>
This is the description of the Course Topic for Employees.
</content>
</record>
<record url="http://website.com/course/view.php?id=655" mimetype="text/html" last-modified="Thu, 14 Aug 2014 18:53:00 GMT">
<acl inheritance-type="and-both-permit">
<principal scope="group" access="permit" namespace="Default" case-sensitivity-type="everything-case-insensitive">customers</principal>
<principal scope="group" access="permit" namespace="Default" case-sensitivity-type="everything-case-insensitive">partners</principal>
<principal scope="group" access="permit" namespace="Default" case-sensitivity-type="everything-case-insensitive">employees</principal>
</acl>
<metadata>
<meta name="type" content="course" />
<meta name="id" content="655" />
<meta name="name" content="Course for Everyone" />
<meta name="course_id" content="655" />
</metadata>
<content>
This is the description of the Course for Everyone.
</content>
</record>
<record url="http://website.com/course/view.php?id=656" mimetype="text/html" last-modified="Thu, 14 Aug 2014 18:53:00 GMT">
<acl inheritance-type="and-both-permit">
<principal scope="group" access="permit" namespace="Default" case-sensitivity-type="everything-case-insensitive">employees</principal>
<principal scope="group" access="permit" namespace="Default" case-sensitivity-type="everything-case-insensitive">partners</principal>
</acl>
<metadata>
<meta name="type" content="course" />
<meta name="id" content="656" />
<meta name="name" content="Course for Partners" />
<meta name="course_id" content="656" />
</metadata>
<content>
This is the description of the Course for Partners.
</content>
</record>
<record url="http://website.com/course/view.php?id=657" mimetype="text/html" last-modified="Thu, 14 Aug 2014 18:53:00 GMT">
<acl inheritance-type="and-both-permit">
<principal scope="group" access="permit" namespace="Default" case-sensitivity-type="everything-case-insensitive">employees</principal>
</acl>
<metadata>
<meta name="type" content="course" />
<meta name="id" content="657" />
<meta name="name" content="Course for Employees" />
<meta name="course_id" content="657" />
</metadata>
<content>
This is the description of the Course for Employees.
</content>
</record>
</group>
</gsafeed>

На основании всего, что мы видим, это должно работать, и все же мы сталкиваемся с кирпичной стеной. У кого-нибудь есть какие-либо идеи?

Как добавленное примечание, из-за того, как настроена страница, которую мы пытаемся проиндексировать, сканирование устройства не будет работать (слишком много интерактивных элементов, и все, что я прочитал, говорит о том, что GSA не может индексировать тех, кто правильно).

РЕДАКТИРОВАТЬ 1: Как предложил Марк в ответах, вот ссылка на Руководство разработчика GSA Feed: http://www.google.com/support/enterprise/static/gsa/docs/admin/72/gsa_doc_set/feedsguide/feedsguide.html

РЕДАКТИРОВАТЬ 2: успех! Смотрите мой ответ ниже. Ключ должен позволить cURL обрабатывать кодирование массива $ fields и передавать содержимое файла, а не только путь к файлу.

0

Решение

Короче говоря, я смог правильно передать фид, и все это было связано с тем, как cURL обрабатывает данные. Ни я, ни инженер, с которым я работал, чтобы попытаться получить отправку фида, не имели большого опыта с плагином cURL для PHP, ни с тем, как заставить GSA принимать поля ввода. Частично спасибо этот вопрос от Кена, ответ от ThiefMaster, следующий ответ от чеховедения, и помощь Майка выше, я придумал следующий код:

<?php
$target_url = 'http://gsadomain.com:19900/xmlfeed';

$header = array('Content-Type: multipart/form-data');

$fields = array(
'feedtype'=>'incremental',
'datasource'=>'datasourcename',
'data'=>file_get_contents(realpath('gsa_feed.xml'))
);

$ch = curl_init();

curl_setopt($ch, CURLOPT_USERPWD, "gsaadmin:gsaadminpassword");
curl_setopt($ch, CURLOPT_HTTPHEADER,$header);
curl_setopt($ch, CURLOPT_TIMEOUT,120);
curl_setopt($ch, CURLOPT_URL,$target_url);
curl_setopt($ch, CURLOPT_POST,1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_POSTFIELDS, $fields);

$return = curl_exec($ch);

if (curl_errno($ch)) {
$msg = curl_error($ch);
}

curl_close ($ch);

echo $return;
?>

Сложность заключалась в методе http_build_query (), который пытался выполнить работу cURL и не правильно устанавливал границы для данных POST.

Мы также столкнулись с некоторыми трудностями позже с некоторыми полями в XML, но это было главным образом потому, что мы забыли str_replace амперсанды, одиночные и двойные кавычки. После того, как об этом позаботились, XML был правильно проанализирован, и мы все запустили.

1

Другие решения

Я не знаком с GSA API, но не похоже, что вы на самом деле отправляете какие-либо данные XML. Строковое значение, для которого вы будете отправлять data параметр будет просто что-то вроде @/path/to/gsa_feed.xml, Я полагаю, вам на самом деле нужно разместить XML правильно?

Возможно, что-то больше похоже

$fields = array(
'feedtype'=>'incremental',
'datasource'=>'datasourcename',
'data'=> file_get_contents(realpath('gsa_feed.xml'))
);
0

По вопросам рекламы [email protected]