将PHP PUT HTTP请求翻译为ColdFusion

问题描述:

此代码在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

这里的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

我会尝试在你的cfhttp调用中添加method =“put”。这将使CFHTTP发送正确的http动词(在这种情况下是PUT)。

假设您正在执行PUT方法,您可以使用ColdFusion的GetHttpRequestData()函数来获取XHR数据。

然后,您可以节省出来做这样的事情:

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