Gửi dữ liệu POST qua raw json với người đưa thư


107

Tôi có Postman (ứng dụng không mở được trong Chrome) và tôi đang cố gắng thực hiện yêu cầu ĐĂNG bằng cách sử dụng raw json.

Trong tab Nội dung, tôi đã chọn "thô" và "JSON (ứng dụng / json)" với nội dung này:

{
    "foo": "bar"
}

Đối với tiêu đề tôi có 1, Content-Type: application/json

Về phía PHP, tôi chỉ đang làm print_r($_POST);bây giờ và tôi nhận được một mảng trống.


Nếu tôi sử dụng jQuery và làm:

$.ajax({
    "type": "POST",
    "url": "/rest/index.php",
    "data": {
        "foo": "bar"
    }
}).done(function (d) {
    console.log(d);
});

Tôi đang nhận được như mong đợi:

Array
(
    [foo] => bar
)

Vậy tại sao nó không hoạt động với Postman?


Ảnh chụp màn hình của người đưa thư:

nhập mô tả hình ảnh ở đây

và tiêu đề:

nhập mô tả hình ảnh ở đây


Hãy thử $ _REQUEST thay vì $ _POST và var_dump () thay vào đó print_r ()
Sâu

@Deep Tôi nhận được array(1) {["foo"]=> string(3) "bar"}với jQuery và vẫn là một mảng trống với Postman:array(0) {}
Dallas

Vì vậy, Người đưa thư không gửi yêu cầu
Sâu

@smerny trong bài đăng của bạn fieldsfoosẽ không khớp vì vậy nó sẽ không hoạt động, Tôi không chắc đó có phải là lỗi đánh máy hay không nhưng hãy đảm bảo rằng chúng khớp nhau
meda

@meda, đúng là lỗi đánh máy, nhưng nếu tôi có các trường, nó vẫn phải có đầu ra trong var dump là $ _REQUEST hoặc $ _POST
Dallas.

Câu trả lời:


38

Không giống như jQueryđể đọc thô, JSONbạn sẽ cần phải giải mã nó bằng PHP.

print_r(json_decode(file_get_contents("php://input"), true));

php://input là một luồng chỉ đọc cho phép bạn đọc dữ liệu thô từ phần thân yêu cầu.

$_POSTlà biến biểu mẫu, bạn sẽ cần chuyển sang nút formradio postmansau đó sử dụng:

foo=bar&foo2=bar2

Để đăng thô jsonvới jquery:

$.ajax({
    "url": "/rest/index.php",
    'data': JSON.stringify({foo:'bar'}),
    'type': 'POST',
    'contentType': 'application/json'
});

vâng, đăng exaclty json và biến post là khác nhau
meda

43

Chỉ cần kiểm tra tùy chọn JSON từ menu thả xuống bên cạnh nhị phân; khi bạn nhấp vào thô. Điều này nên làm

kỹ năng synon chuyền json cho người đưa thư


4
đây là một bài viết khá cũ .. nhưng nếu bạn nhìn vào câu hỏi, bạn sẽ thấy rằng tôi đã làm chính xác điều đó. bạn có thể muốn đọc câu hỏi, câu trả lời đã chọn và nhận xét về câu trả lời đã chọn để hiểu vấn đề và giải pháp tốt hơn.
Dallas

1
Chắc chắn, nhưng điều này thực sự xác định chính xác vấn đề tôi gặp phải; Tôi đã chọn "Văn bản", không phải ứng dụng / json, mặc dù điều đó đã được đề cập trong phần Tiêu đề. Khó hiểu của nó; nếu bạn chọn "Văn bản", thì toàn bộ "mã" HTTP POST sẽ được hiển thị, bao gồm cả JSON, mà tôi dự kiến ​​sẽ hoạt động, vì nó là một lệnh gọi POST đầy đủ, không chỉ json.
Ted

7

Câu trả lời của meda là hoàn toàn hợp pháp, nhưng khi tôi sao chép mã, tôi đã gặp lỗi!

Ở đâu đó "php://input"có một ký tự không hợp lệ (có thể là một trong những dấu ngoặc kép?).

Khi tôi nhập "php://input"mã theo cách thủ công, nó đã hoạt động. Mất một thời gian để tôi tìm ra!


1
Rất vui vì tôi đã cuộn xuống thêm một chút và thấy điều này - tôi đang gặp vấn đề tương tự. Tốt tìm thấy!
Charlie Stanard

2
Có vẻ như ai đó đã sửa nó trong một bản chỉnh sửa cho bài đăng của meda. Nhưng tôi đã xem lịch sử chỉnh sửa và thấy rằng bài đăng ban đầu có 200c 200b(ký tự có độ rộng bằng không) giữa "n" và "p" trong "đầu vào". Không chắc anh ta đã kết thúc như thế nào với điều đó, nhưng nó đã được khắc phục ngay bây giờ.
Dallas

6

Tôi đang gặp phải vấn đề tương tự, mã sau phù hợp với tôi:

$params = (array) json_decode(file_get_contents('php://input'), TRUE);
print_r($params);


1

Cài đặt ứng dụng gốc Postman, tiện ích mở rộng của Chrome không được dùng nữa. (Của tôi đang mở trong cửa sổ riêng nhưng vẫn chạy dưới dạng ứng dụng Chrome)


2
Điều này không trả lời câu hỏi.
jhpratt

@jhpratt thực sự có. Tôi đã có cùng một vấn đề. Khi sử dụng ứng dụng Postman, nó đã hoạt động. Câu hỏi là: Vậy tại sao nó không hoạt động với Postman?
Jaroslav Štreit
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.