【问题标题】:Translate PHP PUT HTTP request to ColdFusion将 PHP PUT HTTP 请求转换为 ColdFusion
【发布时间】:2010-08-09 19:41:03
【问题描述】:

这段代码在 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 中复制它。

【问题讨论】:

  • 我也不是 php 大师。但我的猜测是它在请求的“正文”中发送 XML。尝试使用 cfhttpparam type="body" 并使用 #requestXML# 作为值。
  • 在 Coldfusion 安装中已经有 Apache http 库,检查它如何在 Java 中完成,这可能是我现在能想到的最快和最可定制的解决方案。
  • @Leigh - 我刚刚尝试过,但仍然出现错误。如果有帮助,我得到的错误是:不支持的媒体类型'application/octet-stream'
  • @Jason - 接收端的预期内容类型是什么(文本/xml)?听起来您可能需要在 cfhttp 调用中添加内容类型标头。
  • @Jason - 您可能只是缺少一些参数或标题。如果你真的不能让它与 CF 一起工作,那么按照@zarko 的建议尝试 java。如果可行,我将使用 Live http 标头之类的内容查看成功请求的标头。然后尝试使用 cfhttp 复制它。 (我喜欢 java,但只有当我无法使用 vanilla CF 时才尝试使用它)

标签: php xml coldfusion http-request


【解决方案1】:

我会尝试将 method="put" 添加到您的 cfhttp 调用中。这将使 CFHTTP 发送正确的 http 动词(在本例中为 PUT)。

【讨论】:

    【解决方案2】:

    这是 Java spark(来自 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 解决方案并将其翻译成 CF。

    编辑:

    请参阅下面的 cmets 以获得解决方案。

    【讨论】:

    • 您认为有没有纯 CFML 解决方案?
    • 在 cfrest google 组中的做法如下:cfrest.googlegroups.com/web/…
    • 下面是如何将文件“附加”到 cfhttp bennadel.com/blog/…
    • 所以有可能,如果有人提出了关于某事的新问题,我认为他已经尝试过并且发现它对他不起作用,所以我的第一个想法是尝试 Java。如果 cfhttp 能完成这项工作,那就太棒了! :)
    • @zarko - cfrest.googlegroups 链接帮助了我。好像我只是传递了错误的标题。谢谢!
    【解决方案3】:

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

    然后您可以通过执行以下操作将其保存:

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

    【讨论】:

      猜你喜欢
      • 2021-12-05
      • 1970-01-01
      • 2020-01-12
      • 1970-01-01
      • 1970-01-01
      • 2018-01-26
      • 2016-05-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多