Я использую HttpWebRequest в C #, чтобы сделать POST для конкретного API. Проблема в том, что система на другом конце не получает тело запроса. Более того, при попытке отправить запрос с помощью таких инструментов, как Postman, у меня возникает та же проблема. Единственная вещь, которая работает, это реализация PHP, подробно описанная ниже.
Мое лучшее предположение заключается в том, что мне не хватает какого-либо заголовка или другого, который PHP устанавливает автоматически.
Кто-нибудь сталкивался с подобной проблемой / кто-нибудь знает, что мне не хватает?
Обе реализации приведены ниже.
<?php
error_reporting(E_ALL);
$url = <<the APIs url>>
$hash = base64_encode('<<username>>:<password>>');
$data = [];
$username = <<username>>
$password =<password>>
$data = array(array(
"id" => "9999999",
"status" => 1,
<<rest of the formated data>>
));
$requestData = array(
'data' => $data,
'hash' => $hash
);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HEADER, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_USERPWD, $username . ":" . $password);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($requestData));
$result = curl_exec($ch);
// $result = json_decode($result, true);
curl_close($ch);
die('done :'.$result);
?>
А вот и реализация C #:
var httpWebRequest = (HttpWebRequest)WebRequest.Create(this.api_url);
httpWebRequest.ContentType = "application/x-www-form-urlencoded";
httpWebRequest.Method = "POST";
httpWebRequest.KeepAlive = true;
httpWebRequest.Date = DateTime.Now.Date;
httpWebRequest.UserAgent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)";
httpWebRequest.Headers.Add("Authorization", "Basic " + Base64Encode(userName + ":" + password));
using (var streamWriter = new StreamWriter(httpWebRequest.GetRequestStream()))
{
streamWriter.Write(json);
streamWriter.Flush();
streamWriter.Close();
}
tring requestResult = null;
var httpResponse = (HttpWebResponse)httpWebRequest.GetResponse();
using (var streamReader = new StreamReader(httpResponse.GetResponseStream()))
{
requestResult= streamReader.ReadToEnd();
}
Если вы публикуете данные JSON, вы должны установить тип содержимого application/json
,
Других решений пока нет …