php cURL库和REST POST请求遇到问题

问题描述:

我在发布API的最终版本发布API后遇到REST POST请求问题。它没有发生任何事情,我被告知,在新版本中,服务器对于'application/json'类型更加严格。以下cli curl命令可以很好地工作:php cURL库和REST POST请求遇到问题

cat json.txt|curl -v -k -u user:password -F '[email protected];type=application/json' https://my.url.here 

但是,我需要在代码中执行此操作。使用PHP卷曲库我有一个简单的测试脚本了,看起来像这样:

$post = array(
    "exchangeInstance" => $json_string, 
    "type" => "application/json", 
); 
    $url = 'myurlhere'; 

    $ch = curl_init(); 
    curl_setopt($ch, CURLOPT_URL, $url); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); 
    curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC); 
    curl_setopt($ch, CURLOPT_USERPWD, "user:pass"); 
    curl_setopt($ch, CURLOPT_POST, true); 
    curl_setopt($ch, CURLOPT_POSTFIELDS, $post); 

    $result = curl_exec($ch); 
    $info = curl_getinfo($ch); 

    var_dump($post); 
    var_dump($result); 
    echo $result; 
    var_dump($info); 

当我阅读文档,内容类型在头会自动设置为“多/形式”如果我将一个数组作为CURLOPT_POSTFIELDS传递,然后我将元素传递的类型设置为数组中的'application/json'。

但是,API没有我的POST请求。而且我收到的错误清楚地表明他们正在收到GET请求。这怎么可能?我错过了什么?

+0

你有followlocation =真。如果服务器正在进行重定向,那么即使您刚开始使用POST,重定向到的url也会通过GET获取。把它关掉,看看你回来。 – 2013-02-21 19:43:18

+0

哇。这当然符合我正在处理的内容,但我找不到任何文档。任何线索?我有一种感觉,我在A点进行身份验证,然后重定向到B点。我被重定向到一个特定的端口,但我使用的是与CLI命令中相同的URL。 – 2013-02-21 20:28:35

卷曲-F!== -d

$post = array(
    "exchangeInstance" => sprintf('@%s;type=application/json', $json_string), 
); 
+0

这非常有趣。感谢上帝赐给聪明人。我相信这是问题的一部分,但目前还不是全部。当我知道更多时,我会回复 - 谢谢! – 2013-02-21 20:29:40

+0

所以,除非我传递一个路径到一个文件,否则这不会真正起作用。否则,它发送一个字符串附加@符号...我没有找到一种方法来设置个别MIME多部分头的内容类型,而不传递文件。在我看来,应该有更好的方法比将我的字符串写入临时文件,然后将其发送到卷曲库...任何想法? – 2013-02-25 19:05:57

+0

http://*.com/questions/4074936/how-to-use-php-curl-to-send-images-with-the-correct-content-type – cetver 2013-02-26 07:36:34