Php 使用文件指针资源发送到RESTful服务JSON

Php 使用文件指针资源发送到RESTful服务JSON,php,json,rest,file-pointer,Php,Json,Rest,File Pointer,我试图弄清楚如何通过PHP将此类数据发送到RESTful服务: { "api_version": 1.0, "project_id" : 123, "batch_id" : 111, "accesskey" : "abc123", "job": { "file": file, "word_count": 111, "title": "FAQ", "cms_id": "page_123_en_sp", "url" : "http://or

我试图弄清楚如何通过PHP将此类数据发送到RESTful服务:

{
  "api_version": 1.0,
  "project_id" : 123,
  "batch_id" : 111,
  "accesskey" : "abc123",
  "job": {
    "file": file,
    "word_count": 111,
    "title": "FAQ",
    "cms_id": "page_123_en_sp",
    "url" : "http://original_post_url.com",
    "is_update": false, 
    "translator_id": 123,
    "note": "Translate these words",
    "source_language": "en",
    "target_language": "it"
  }
}
首先,我不能使用curl,因为使用此代码的人可能没有安装它,或者可能不允许安装它

这不是一个“普通”JSON对象。 job->file属性是一个实际的文件(甚至不是文件的url)

这就是我用来发送所有请求的实际代码,在我遇到这个特定情况之前,它一直有效:

“文件”属性是这样创建的:

$file = generate_file( $content );

protected static function generate_file($content) {
    $file = fopen('php://temp','r+');
    fwrite($file, $content);
    rewind($file);
    return $file;        
}
现在,在发送数据时,如果在PHP端正确设置了$params参数,RESTful将返回一个关于缺少“api_版本”和“project_id”的错误,但它们仍然存在。 我很确定问题在于他没有以JSON的形式接收数据,但是我如何将一个在他的属性中包含文件指针资源的对象转换为JSON呢

发送数据和构建文件的代码是由一位前开发人员创建的,我无法与他联系

我试图理解这里的错误,到目前为止,对于另一个不相关的问题,我唯一能解决的问题是实际发送JSON数据(当$multipart==false时),正如您在链接代码的第16-19行中看到的那样,而不是发送urlencoded数据

有什么提示吗?

JSON没有“文件”概念。您可以加载文件内容,使用Base64对其进行编码,然后将其填充到JSON字符串中,也可以使用多部分格式在一部分发送文件,在另一部分发送完整的JSON。多部分解决方案应该是性能最好的,因为它不必对文件内容进行base64编码

下面是一个类似的示例消息格式,它试图将json/多部分用法形式化:

POST /projects/2/issues HTTP/1.1
Accept: application/vnd.mason+json
Content-Type: multipart/form-data; boundary=d636dfda-b79f-4f29-aaf6-4b6687baebeb

--d636dfda-b79f-4f29-aaf6-4b6687baebeb
Content-Disposition: form-data; name="attachment"; filename="hogweed.jpg"
... binary data for attached image ...

--d636dfda-b79f-4f29-aaf6-4b6687baebeb
Content-Disposition: form-data; name="args"; filename="args"
Content-Type: application/json

{
  "Title": "Hogweeds on the plaza",
  "Description": "Could you please remove the hogweeds growing at the plaza?",
  "Severity": 5,
  "Attachment":
  {
    "Title": "Hogweed",
    "Description": "Photo of the hogweeds."
  }
}

如果它“不是一个‘正常’的JSON对象”,那么它就不是JSON。你确定服务器能处理吗?显然是的。我已经和开发人员联系过,他说他们对所有API都进行了单元测试。我正试着再次与他们联系,看看他们是如何发送内容的,但这并不容易,因为要把内容发送到不同的时区。老实说,我称之为“不正常”,但我不确定这是否正常:我对RESTful服务没有太多经验,也不知道这种发送数据的方式是否可行,但看起来是这样的:直到我从开发人员那里获得更多信息,我必须想当然地认为这样做是可能的。最终我不得不放弃以JSON的形式发送数据(仅适用于多部分文章),回到最初的内容配置:表单数据方法。这样就行了。无论如何,@jorn-wildt是我能找到的更好的答案(我甚至实现了它,但另一端的服务器似乎真的希望数据采用不同的格式,当涉及附件时)。