2010-08-09 111 views
5

此代碼在ColdFusion中的外觀如何?將PHP PUT HTTP請求翻譯爲ColdFusion

protected function httpPut($url, $params = null, $data = null) 
    { 
     $fh = fopen('php://memory', 'rw'); 
      fwrite($fh, $data); 
      rewind($fh); 

    $ch = curl_init($url); 
    $this->addOAuthHeaders($ch, $url, $params['oauth']); 
    curl_setopt($ch, CURLOPT_PUT, 1); 
    curl_setopt($ch, CURLOPT_INFILE, $fh); 
    curl_setopt($ch, CURLOPT_INFILESIZE, strlen($data)); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
    $resp = $this->curl->addCurl($ch); 
    fclose($fh); 
    return $resp; 
    } 

我有類似於下面的東西,但它似乎並不奏效。

<cffile action="write" file="d:\my\directory\path\test.xml" output="#arguments.requestXML#"> 
<cfhttp url="#oaAccessTokenURL#" method="#arguments.requestType#" charset="UTF-8"> 
    <cfheader name="Authorization" value="#oauthheader#"> 
    <cfhttpparam type="file" name="Course" file="d:\my\directory\path\test.xml">  
</cfhttp> 

我不知道有足夠的瞭解PHP,瞭解如何$ data變量(這僅僅是一個XML數據的字符串)是越來越放入HTTP請求和如何複製,在ColdFusion的。

+1

我不是PHP的大師無論是。但我的猜測是它會在請求的「主體」中發送XML。嘗試使用cfhttpparam type =「body」並使用#requestXML#作爲值。 – Leigh 2010-08-09 20:05:18

+0

在Coldfusion安裝中,已經存在Apache http庫,請檢查它是如何在Java中完成的,這可能是我現在可以想到的最快和最可定製的解決方案。 – 2010-08-09 20:08:27

+0

@Leigh - 我剛剛嘗試過,仍然出現錯誤。如果它有幫助,我得到的錯誤是:不支持的媒體類型'application/octet-stream' – Jason 2010-08-09 20:10:11

回答

0

這裏的Java火花(從Java文檔),你需要去解決它:

PutMethod put = new PutMethod("http://jakarta.apache.org"); 
     put.setRequestBody(new FileInputStream("UploadMe.gif")); 

翻譯在CF這樣的:

<cfset myPut = createObject("java", "org.apache.commons.httpclient.methods.PutMethod") /> 
<cfset myPut.init("http://example.com") /> 
<cfset myInputStream = createObject("java", "java.io.FileInputStream") /> 
<cfset myInputStream.init("myxml.xml") /> 
<cfset myPut.setRequestBody(myInputStream) /> 

等等......

在鏈接我上面貼上你可以看到服用點是這樣的:

URL url = new URL("http://www.example.com/resource"); 
HttpURLConnection httpCon = (HttpURLConnection) url.openConnection(); 
httpCon.setDoOutput(true); 
httpCon.setRequestMethod("PUT"); 
OutputStreamWriter out = new OutputStreamWriter(
    httpCon.getOutputStream()); 
out.write("Resource content"); 
out.close(); 

找到工作Java soution並在CF中翻譯它。

編輯:

請參閱下面的註釋以獲得解決方案。

+0

是否存在您認爲的純CFML解決方案? – Henry 2010-08-10 04:25:42

+2

下面介紹如何在谷歌cfrest做組:http://cfrest.googlegroups.com/web/apiUtilities.cfc?gda=GD5yz0IAAABIZNuY_A2GQeIp6iDWbK7VaStTUa30d_821IbfLDQgDohJfanwNHy4DV68OGE7zINV4u3aa4iAIyYQIqbG9naPgh6o8ccLBvP6Chud5KMzIQ – 2010-08-10 06:33:47

+0

這裏是如何「連接」文件CFHTTP http://www.bennadel.com/blog /619-Throwing-And-Catching-A-File-Using-CFHttp-For-Both-Actions.htm – 2010-08-10 06:35:53

1

我會嘗試在你的cfhttp調用中添加method =「put」。這將使CFHTTP發送正確的http動詞(在這種情況下是PUT)。

0

假設您正在執行PUT方法,您可以使用ColdFusion的GetHttpRequestData()函數來獲取XHR數據。

然後,您可以節省出來做這樣的事情:

<cfset xhr_data = GetHttpRequestData() /> 
<cffile action="write" file="PATH/FILENAME" output="#xhr_data.content#">