c # — PostAsJsonAsync публикует текстовые / html на сервер, а не как JSON

Я пытаюсь опубликовать строку JSON на странице PHP, используя методы Async следующим образом:

using System;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Threading.Tasks;

namespace test_http
{
class Product
{
public string Name { get; set; }
public double Price { get; set; }
public string Category { get; set; }
}

class Program
{
static void Main()
{
RunAsync().Wait();
}

static async Task RunAsync()
{
using (var client = new HttpClient())
{
client.BaseAddress = new Uri("http://localhost/ABC/products.php");
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

// HTTP GET
HttpResponseMessage response = await client.GetAsync("products/1");
Console.WriteLine(response.ToString());
if (response.IsSuccessStatusCode)
{
Product product = await response.Content.ReadAsAsync<Product>();
Console.WriteLine("{0}\t${1}\t{2}", product.Name, product.Price, product.Category);
}

// HTTP POST
var gizmo = new Product() { Name = "Gizmo", Price = 100, Category = "Widget" };
response = await client.PostAsJsonAsync(client.BaseAddress, gizmo);
Console.WriteLine(response.ToString());

if (response.IsSuccessStatusCode)
{
Uri gizmoUrl = response.Headers.Location;

// HTTP PUT
gizmo.Price = 80;   // Update price
response = await client.PutAsJsonAsync(gizmoUrl, gizmo);
Console.WriteLine(response.ToString());
// HTTP DELETE
response = await client.DeleteAsync(gizmoUrl);
Console.WriteLine(response.ToString());
}
}
}
}
}

Я получаю 200 статус OK для операций POST, PUT и DELETE в окне консоли. Но на странице PHP ничего не отображается.
Код PHP:

<?php
$json = json_encode($_POST);
var_dump(json_decode($json));

?>

Я выяснил, что тип содержимого публикуемых данных отображается в консоли как «text / html» вместо «application / json», и, следовательно, PHP не может распознать POST. Но я не знаю, что я делаю здесь неправильно.
Может ли кто-нибудь помочь?

0

Решение

Во-первых, нет необходимости использовать json_encode как вы уже отправляете JSON.

Во-вторых, phps global $_POST будет заполняться только при отправке пар ключ: значение. Если вы отправляете json, вы должны использовать поток ввода:

<?php
var_dump(json_decode(file_get_contents('php://input')));
0

Другие решения

Других решений пока нет …