Отправить код C ++ в запросе SOAP - PullRequest
0 голосов
/ 10 марта 2012

Я пытаюсь получить фрагмент кода, скомпилированный с использованием SOAP API от Ideone.com. Для этого я должен отправить исходный код в запросе SOAP. Вот спецификация для этого SOAP-запроса:

<message name="createSubmissionIn">
<part name="user" type="xsd:string"/>
<part name="pass" type="xsd:string"/>
<part name="sourceCode" type="xsd:string"/>
<part name="language" type="xsd:int"/>
<part name="input" type="xsd:string"/>
<part name="run" type="xsd:boolean"/>
<part name="private" type="xsd:boolean"/>
</message>

Как уже упоминалось, sourceCode должен быть строкой, а код - текстом. Возьмите, например, следующий код:

#include <iostream>

using namespace std;

int main()
{
    cout<<"Hello Ideone!";
    return 0;
}

Если я encodeURIComponent это в клиенте javascript перед отправкой запроса (как упоминалось где-то еще), результирующий текст будет:

%23include%20%0A%0Ausing%20namespace%20std%3B%0A%0Aint%20main()%0A%7B%0A%09cout%3C%3C%22Hello%20Ideone!%22%3B%0A%09return%200%3B%0A%7D

, который считается неверным кодом (ошибка компиляции). Я подтвердил код, полученный на сервере, и код не декодируется на стороне сервера. Если я отправлю его одной строкой, то ошибка компиляции все еще будет, так как вы не можете получить оставшуюся часть кода в строке #include. Я тоже попробовал CDATA, но ничего не делаю.

Итак, пожалуйста, проведите меня через эту проблему. Как успешно отправить фрагмент кода в запросе SOAP.

P.S. На случай, если мой клиент плохо спроектирован, я использую онлайн-клиент SOAP: http://soapclient.com/soapclient?template=%2Fclientform.html&fn=soapform&SoapTemplate=%2FSoapResult.html&SoapWSDL=http%3A%2F%2Fideone.com%2Fapi%2F1%2Fservice.wsdl&_ArraySize=5

Ответы [ 2 ]

0 голосов
/ 11 марта 2012

Нет проблем. Вот рабочая и проверенная версия PHP. Я на самом деле проверил это и загрузил код с помощью сервиса. Я заметил, что мне нужно обновить свой профиль, хотя я установил свой пароль API во время создания своей учетной записи.

<?php

$client = new SoapClient('http://ideone.com/api/1/service.wsdl');

$user = "VALID_USER_NAME";
$pass = "VALID_PASSWORD";
$lang=1;
$source = <<<CODEDOC
#include <iostream>
using namespace std;

int main()
{
cout<<"Hello Ideone!";
return 0;
}
CODEDOC;
$input="INPUT";
$run=0;
$private=0;

print_r($client->createSubmission($user, $pass, $source, $lang, $input, $run, $private));
?>
0 голосов
/ 10 марта 2012

Сегодня кажется, что их API может быть сломан. Демо Python-клиент предоставляется здесь. http://ideone.com/files/python-test/ideone.py Однако происходит сбой с ошибкой аутентификации. Итак, чтобы попытаться ответить на ваш вопрос, я написал эти две мини-программы на Perl.

Клиент

#!/usr/bin/perl -w

use SOAP::Lite;

my ($user, $pass, $source, $lang, $input, $run, $private);

$user = "FRED";
$pass = "PASS";
$lang=1;
$source = <<CODEDOC;
#include <iostream>
using namespace std;

int main()
{
cout<<"Hello Ideone!";
return 0;
}
CODEDOC
$input="INPUT";
$run=0;
$private=0;

print SOAP::Lite                                            
-> proxy('http://localhost/cgi-bin/code_demo.pl')
-> uri('http://localhost/CodeDemo')                                    
-> code($user, $pass, $source, $lang, $input, $run, private)                                             
-> result;

Север (CGI)

#!/usr/bin/perl -w

use SOAP::Transport::HTTP;

SOAP::Transport::HTTP::CGI   
-> dispatch_to('CodeDemo')     
-> handle;

package CodeDemo;

sub code{
    my ($self, $user, $pass, $source, $lang, $input, $run, $private) = @_;
    my $retval ;
    $retval = sprintf("User:%s\nPass:%s\nSource:%s\nLang:%s\nInput:%s\nRun:%s\nPrivate:%s\n",
        $user, $pass, $source, $lang, $input, $run, $private);
    return $retval;
}

Мне показалось, что это нормально работает.

...