-3

C# HttpWebRequest を使用して、http 要求でデータ サービスにアクセスしようとしています。ContentType が x-www-form-urlencoded の場合、機能します。しかし、そのリクエストでファイルを転送する必要があるため、multipart/form-data を使用し、サービスから 401 エラーが発生しました。どうにかしてファイルを x-www-form-urlencoded に入れる必要があるようですが、どうすればよいでしょうか?

私はphpで作業コードを持っています。生成されたリクエストで使用する ContenType と、その後のファイルのエンコード方法を説明できる人はいますか?

<?php
function encode($str) {
  return iconv("WINDOWS-1251", "UTF-8", $str);
}
function decode(&$resp) {
  if (is_array($resp)) {
    foreach ($resp as $key => $value) {
      if (is_string($value))
        $resp[$key] = iconv('UTF-8','WINDOWS-1251', $value);
      else 
        decode($value);
    }
  }
}

$url = "https://demo.krate.ru/api/v1/reports.json";
$api_key = "zzVAhVCj6rg1dAzAXo_c";

$request = array(
    'request[acceptance]' => '@d:/Users/RangerX/Downloads/YvFuRusNvwk.jpg',
    'request[passport_scan]' => '@d:/Users/RangerX/Downloads/YvFuRusNvwk.jpg',
    'request[reg_idx]' => '445000'
);

$curl = curl_init($url);
curl_setopt($curl, CURLOPT_HEADER, false);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, true);

curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 2);
curl_setopt($curl, CURLOPT_CAINFO, "d:\\Dev\\Projects\\krate2_demo\\doc\\v1-api-client-example\\AddTrustExternalCARoot.crt");

curl_setopt($curl, CURLOPT_POST, true);
curl_setopt($curl, CURLOPT_POSTFIELDS, $request);

$json_response = curl_exec($curl);

$status = curl_getinfo($curl, CURLINFO_HTTP_CODE);
if ( $status != 200 && $status != 201 ) {
  die("Error: call to URL $url failed with status $status, response $json_response, curl_error " . curl_error($curl) . ", curl_errno " . curl_errno($curl));
}
curl_close($curl);

$response = json_decode($json_response, true);
// chcp 65001
var_dump($response);
?>
4

2 に答える 2

0

コンテンツ タイプを設定しても、サーバーが送信内容を自動的に理解するわけではありません。

通信しているエンドポイントもコーディングしている場合は、PHP マニュアルの「ファイルのアップロードの処理」のセクションを確認してください。

また、 Guzzleもチェックしてください。これは、サービス クライアントを作成したり、数行のコードで API サーバーと通信したりできる HTTP クライアントです。

于 2013-10-07T00:11:38.427 に答える