2

CURL投稿を実行しようとしていますが、いくつかの問題が発生しています。

基本的に、私は郵便番号のリストをAPIに投稿していますが、選択されているものによっては、非常に大きなリストになる可能性があります。いくつかの郵便番号だけを投稿すると、完璧に機能します。郵便番号のより大きなリストをスローすると、サーバーからの応答が空であるというエラーで失敗します。

private function sendApiRequest($action, $request)
{
    // Testing
    $request['Test'] = $this->apitest;

    // Build URL
    $postURL = "{$this->apiurl}?Key={$this->apikey}&API_Action={$action}";

    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $postURL);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($ch, CURLOPT_POST, true);
    curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($request));
    curl_setopt($ch, CURLOPT_HTTPHEADER, array('Expect:'));
    curl_setopt($ch, CURLOPT_TIMEOUT, 10);
    $resp = curl_exec($ch);

    if(curl_errno($ch))
    {
        var_dump(curl_getinfo($ch));
        throw new Exception('Curl Error: ' . curl_error($ch));
    }
    curl_close($ch);
    return $resp;
}

curl_getinfo()ダンプは次のとおりです。

array
  'url' => string 'https://api.example.com/api.php?Key=xxx&API_Action=insertFilterSet' (length=147)
  'content_type' => null
  'http_code' => int 0
  'header_size' => int 0
  'request_size' => int 11736
  'filetime' => int -1
  'ssl_verify_result' => int 20
  'redirect_count' => int 0
  'total_time' => float 0.374
  'namelookup_time' => float 0
  'connect_time' => float 0.093
  'pretransfer_time' => float 0.203
  'size_upload' => float 11486
  'size_download' => float 0
  'speed_download' => float 0
  'speed_upload' => float 30711
  'download_content_length' => float -1
  'upload_content_length' => float 11486
  'starttransfer_time' => float 0.374
  'redirect_time' => float 0
  'certinfo' => 
    array
      empty
  'redirect_url' => string '' (length=0)

私が言ったように、それは小さなリクエストには完璧に機能しますが、大きなリクエストではエラーになります。

4

1 に答える 1

0

同じ問題に遭遇しました。HTTP ステータス コードは 200 を返しましたが、応答は空でした。私が経験したように、これには多くの理由が考えられます。

ヘッダーが正しくない可能性があります

CURLOPT_HTTPHEADER => array('Content-Type:application/json', 'Expect:')

CURL の投稿フィールドとしてデータを送信し、URL に添付しない必要がある場合があります。url?p1=a1&p2=a2

$data = array (p1=>a1, p2=>a2)
CURLOPT_POSTFIELDS => $data

したがって、オプション配列は次のようになります

array(
    CURLOPT_URL => $url,
    CURLOPT_FAILONERROR => TRUE, // FALSE if in debug mode
    CURLOPT_RETURNTRANSFER => TRUE,
    CURLOPT_TIMEOUT => 4,
    CURLOPT_HTTPHEADER => array('Content-Type:application/json', 'Expect:'),
    CURLOPT_POST => TRUE,
    CURLOPT_POSTFIELDS => $data,
);
于 2013-08-21T06:02:24.097 に答える