ส่งข้อมูล POST ผ่าน raw json กับบุรุษไปรษณีย์


107

ฉันมี Postman (อันที่ไม่ได้เปิดใน Chrome) และฉันกำลังพยายามส่งคำขอ POST โดยใช้ raw json

ในแท็บ Body ฉันได้เลือก "raw" และ "JSON (application / json)" ด้วยเนื้อหานี้:

{
    "foo": "bar"
}

สำหรับส่วนหัวฉันมี 1 Content-Type: application/json

ด้าน PHP print_r($_POST);ตอนนี้ฉันกำลังทำอยู่และฉันได้รับอาร์เรย์ว่างเปล่า


ถ้าฉันใช้ jQuery และทำ:

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

ฉันได้รับตามที่คาดไว้:

Array
(
    [foo] => bar
)

เหตุใดจึงไม่ทำงานร่วมกับบุรุษไปรษณีย์?


ภาพหน้าจอบุรุษไปรษณีย์:

ป้อนคำอธิบายภาพที่นี่

และส่วนหัว:

ป้อนคำอธิบายภาพที่นี่


ลองใช้ $ _REQUEST แทน $ _POST และ var_dump () แทน print_r ()
ลึก

@Deep ฉันได้รับarray(1) {["foo"]=> string(3) "bar"}jQuery และยังคงเป็นอาร์เรย์ว่างเปล่ากับบุรุษไปรษณีย์:array(0) {}
Dallas

บุรุษไปรษณีย์จึงไม่ส่งคำขอ
Deep

@smerny ในโพสต์ของคุณfieldsและfooเคยชินกับการจับคู่ดังนั้นมันจะไม่ทำงานฉันไม่แน่ใจว่ามันเป็นการพิมพ์ผิด แต่ให้แน่ใจว่าตรงกัน
meda

@meda ถูกต้องนั่นคือการพิมพ์ผิด แต่ถ้าฉันมีช่องก็ควรมีเอาต์พุตในการถ่ายโอนข้อมูล var ที่ $ _REQUEST หรือ $ _POST
Dallas

คำตอบ:


38

ไม่เหมือนjQueryในการอ่าน Raw JSONคุณจะต้องถอดรหัสเป็น PHP

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

php://input เป็นสตรีมแบบอ่านอย่างเดียวที่ให้คุณอ่านข้อมูลดิบจากเนื้อหาคำขอ

$_POSTเป็นตัวแปรรูปแบบคุณจะต้องเปลี่ยนเป็นformradiobutton postmanจากนั้นใช้:

foo=bar&foo2=bar2

หากต้องการโพสต์ข้อมูลดิบjsonด้วยjquery:

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

ใช่การโพสต์ json กับตัวแปรโพสต์ที่ยอดเยี่ยมแตกต่างกัน
meda

43

เพียงตรวจสอบตัวเลือก JSON จากเมนูแบบเลื่อนลงถัดจากไบนารี เมื่อคุณคลิกดิบ สิ่งนี้ควรทำ

สกิล Synon ส่ง json ให้บุรุษไปรษณีย์


4
นี่เป็นโพสต์ที่ค่อนข้างเก่า .. แต่ถ้าคุณดูคำถามคุณจะเห็นว่าฉันทำอย่างนั้น คุณอาจต้องการอ่านคำถามคำตอบที่เลือกและความคิดเห็นเกี่ยวกับคำตอบที่เลือกเพื่อให้เข้าใจปัญหาและแนวทางแก้ไขได้ดีขึ้น
Dallas

1
แน่นอน แต่สิ่งนี้ชี้ให้เห็นปัญหาที่ฉันมีจริงๆ ฉันได้เลือก "ข้อความ" ไม่ใช่ application / json แม้ว่าจะมีการกล่าวถึงแล้วในส่วนส่วนหัว มันสับสน; หากคุณเลือก "ข้อความ" รหัส "HTTP POST" ทั้งหมดจะปรากฏขึ้นรวมถึง JSON ซึ่งฉันคาดว่าจะใช้งานได้เนื่องจากเป็นการเรียก POST แบบเต็มไม่ใช่เฉพาะ json
Ted

7

คำตอบของ meda นั้นถูกต้องสมบูรณ์ แต่เมื่อฉันคัดลอกรหัสฉันพบข้อผิดพลาด!

ที่ไหนสักแห่งใน"php://input"มีตัวอักษรที่ไม่ถูกต้อง (อาจจะเป็นหนึ่งในคำพูด?)

เมื่อฉันพิมพ์"php://input"รหัสด้วยตนเองมันใช้งานได้ ใช้เวลาสักพักเพื่อคิดออก!


1
ดีใจที่ฉันเลื่อนลงไปอีกเล็กน้อยและเห็นสิ่งนี้ - ฉันกำลังมีปัญหาเดียวกัน หาดี!
Charlie Stanard

2
ดูเหมือนว่าจะมีคนแก้ไขในการแก้ไขโพสต์ของ meda แต่ฉันดูประวัติการแก้ไขและพบว่าโพสต์ต้นฉบับมี200c 200b(อักขระที่มีความกว้างเป็นศูนย์) อยู่ระหว่าง "n" และ "p" ใน "input" ไม่แน่ใจว่าเขาลงเอยอย่างไร แต่ตอนนี้แก้ไขแล้ว
Dallas

6

ฉันประสบปัญหาเดียวกันรหัสต่อไปนี้ใช้ได้กับฉัน:

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


1

ติดตั้งแอป Postman เนทีฟส่วนขยาย Chrome เลิกใช้งานแล้ว (ของฉันเปิดในหน้าต่างของตัวเอง แต่ยังคงทำงานเป็นแอป Chrome)


2
นี่ไม่ตอบคำถาม
jhpratt

@jhpratt มันทำจริง ฉันมีปัญหาเดียวกัน เมื่อใช้แอพ Postman มันใช้งานได้ คำถามคือเหตุใดจึงไม่ทำงานร่วมกับบุรุษไปรษณีย์?
Jaroslav Štreit
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.