【问题标题】:What kind of the Content-Type will this request use?这个请求将使用什么样的 Content-Type?
【发布时间】:2013-10-06 23:54:21
【问题描述】:

我尝试使用 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);
?>

【问题讨论】:

  • 它使用所有的内容类型!
  • 你确定要告诉全世界你的网站的 api 密钥吗?

标签: c# php http-post


【解决方案1】:

您无法在 x-www-form-urlencoded 中传输文件 - 调查为什么您会收到响应来验证自己的身份。

【讨论】:

    【解决方案2】:

    设置内容类型并不意味着服务器会自动理解您发送的内容。

    如果您还要对与之通信的端点进行编码,请查看 PHP 手册中的“Handling file uploads”部分。

    还可以查看Guzzle,它是一个 HTTP 客户端,可让您通过几行代码创建服务客户端或与 API 服务器通信。

    【讨论】:

      猜你喜欢
      • 2012-03-15
      • 1970-01-01
      • 2013-02-04
      • 1970-01-01
      • 2013-12-13
      • 1970-01-01
      • 2012-10-21
      • 2015-10-20
      • 1970-01-01
      相关资源
      最近更新 更多