Php 使用文件指针资源发送到RESTful服务JSON
我试图弄清楚如何通过PHP将此类数据发送到RESTful服务: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
{
"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是我能找到的更好的答案(我甚至实现了它,但另一端的服务器似乎真的希望数据采用不同的格式,当涉及附件时)。