2012-03-10 137 views
0

我想要使用Ideone.com的SOAP API編譯一些代碼片段。爲此,我必須在SOAP請求中發送源代碼。這裏是針對SOAP請求的規範:在SOAP請求中發送C++代碼

<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的東西,但是Dint做了任何事情。

所以,請指導我解決這個問題。如何在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

回答

0

今天,看起來他們的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; 

Sever的(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; 
} 

這似乎爲我工作的罰款。

+0

不,API沒有損壞。現在,我必須使用PHP代理來連接他們的API。它工作得很好。 (PHP使用'\ n'作爲將文本編碼爲字符串的新換行符。)但是,當我直接使用xhr進行嘗試時,它只是不想工作。 – 2012-03-11 09:52:30

0

沒問題。這是一個經過測試的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

這只是我用作解決方法,但我的問題不是這個。它正在工作,但我想要刪除php代理並直接使用xhr調用soap api。 – 2012-03-11 14:05:58