2017-03-15 23 views
1

CURL PostリクエストをAPIに送信します。成功すると、ヘッダのLOCATIONのリソースのURLとともにステータス「201 Created」が返されます。私が望むのは、新しく作成されたリソースを自動的に取得することですが、今のところできていません。私はcurl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);を設定しようとしましたが、無駄です。リソースにGETリクエストが必要であることに注意する価値があります。PHP Curl - 「201 Created」レスポンスヘッダを持つ場所

私はそれが201、またはリクエストメソッドがGETPOSTから変更する必要がありますが、何らかの理由でそれがLOCATIONヘッダを以下のいない場合というステータスコードだかはわかりません。 curl_getinfo($ch,CURLINFO_EFFECTIVE_URL);を取得すると、結果が元のURLと同じで、新しいLOCATIONではなく、これが確認されたようです。

最後の手段として、ヘッダーを解析して新しいCURLリクエストを作成することを検討しましたが、これは最適ではないでしょうし、私はこの仕事を望みどおりに単純にしていないと思っています。

GETリクエストをLOCATIONに返信すると、自動的にCURLが返信され、201返信が返されます。

答えて

3

できません。

curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);カールの場合はLOCATIONのステータスコードの3xxのみに対応してください。

AFAIKと書かれているように、カールを強制的に201レスポンスで追跡する方法はありません。

ヘッダーを解析し、LOCATIONを取り出してから、2番目のカール要求を発行する必要があります。

ステータスが3xx以外の場所に続いて異常が発生します。また、curlコマンドラインツールとCライブラリdocumentationから:あなたは/lib/http.c機能Curl_http_readwrite_headersに見つけるカールソースコードを簡単に見て与える-L, --location -- (HTTP) If the server reports that the requested page has moved to a different location (indicated with a Location: header and a 3XX response code), this option will make curl redo the request on the new place


。フォローはこの条件で内部処理され

場所:

else if((k->httpcode >= 300 && k->httpcode < 400) && 
     checkprefix("Location:", k->p) && 
     !data->req.location) { 
    /* this is the URL that the server advises us to use instead */ 
    char *location = Curl_copy_header_value(k->p); 
    if(!location) 
    return CURLE_OUT_OF_MEMORY; 
    if(!*location) 
    /* ignore empty data */ 
    free(location); 
    else { 
    data->req.location = location; 

    if(data->set.http_follow_location) { 
     DEBUGASSERT(!data->req.newurl); 
     data->req.newurl = strdup(data->req.location); /* clone */ 
     if(!data->req.newurl) 
     return CURLE_OUT_OF_MEMORY; 

     /* some cases of POST and PUT etc needs to rewind the data 
     stream at this point */ 
     result = http_perhapsrewind(conn); 
     if(result) 
     return result; 
    } 
    } 
} 

場所は300399

+0

ありがとう、私はそれを疑うようになっていた。これを説明するドキュメントへのリンクを追加できますか?私はそれが答えを改善すると思うし、どちらかを受け入れることを嬉しく思う。 – billynoah

+0

http://php.net/manual/en/function.curl-setopt.php – Paolo

+1

コメントを削除し、ソースコードの一部を投稿して、ドキュメントの解釈が正しいことを伝えました(ステータスのリダイレクトはありません)。範囲外の3xx) – Paolo

0

間のステータスコードで続いている私は、これは純粋な意味でのあなたの質問に答えていない理解それ - 私の解決策もPHPではありませんが、ここでのcURLで201をフォローする(JQを使用して)方法だ:

shrinkImageFunction() { 
echo 
echo Compressing $1 . . . 

curl --user api: https://tinypng.com/developers \ 
     --data-binary @$1 \ 
     -o .$1-json \ 
     -s \ 
     https://api.tinify.com/shrink 

cat .$1-json | jq -r '.output.url' > .$1-url 

url=$(cat .$1-url) 

if [ -z "$url" ]; then 
     echo Something went wrong 
     return 
fi 

echo Downloading $url . . . 

echo 
curl -o compressed-$1 $url 
echo 

rm .$1-json 
rm .$1-url 
} 

# alias for using tinypng 
alias shrinkImage=shrinkImageFunction 

私は今日これを一緒に投げました。同様の研究をしながら、オプションを探している間にこの質問に出会ったことを分かち合いました。

これは、jypの代わりにsedなどを使ってHTTP 201ヘッダー応答を解析するために簡単に微調整することができます。ここではtinypngによって提供されたhttp body json応答を解析しています。 )。

関連する問題