我尝试使用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);
?>
答案 0 :(得分:0)
您无法在x-www-form-urlencoded
内传输文件 - 请调查您收到自己身份验证的回复的原因。
答案 1 :(得分:0)
设置内容类型并不意味着服务器会自动了解您要发送的内容。
如果您还在编写正在进行通信的端点,请查看PHP手册中的“Handling file uploads”部分。
同时查看Guzzle,它是一个HTTP客户端,可以让您创建服务客户端或使用几行代码与API服务器通信。