Gửi bài đăng json bằng php


83

Tôi có dữ liệu json này:

{ 
    userID: 'a7664093-502e-4d2b-bf30-25a2b26d6021',
    itemKind: 0,
    value: 1,
    description: 'Saude',
    itemID: '03e76d0a-8bab-11e0-8250-000c29b481aa'
}

và tôi cần đăng vào url json: http: // domain / OnLeagueRest / resources / onleague / Account / CreditAccount

sử dụng php làm thế nào tôi có thể gửi yêu cầu bài đăng này?


2
cung cấp cho một số chi tiết hoặc mã
Jimy

Tôi chỉ cần gửi bài json với userID, itemKind, giá trị, mô tả và ItemID
Carlos Martins

@Gumbo Chrome không đồng ý với bạn;)
Phil

3
@Phil: JSON không phải là JavaScript hoặc ngược lại. Chrome có thể chấp nhận mã đó vì nó có trình thông dịch JavaScript. Nhưng nếu bạn sử dụng JSON.parseđể phân tích cú pháp mã đó, nó chắc chắn sẽ bị lỗi.
Gumbo

@Gumbo Cảm ơn vì thông tin bổ sung. Vấn đề là các phím chưa được trích dẫn?
Phil

Câu trả lời:


116

Không sử dụng bất kỳ thư viện hoặc phụ thuộc bên ngoài nào:

$options = array(
  'http' => array(
    'method'  => 'POST',
    'content' => json_encode( $data ),
    'header'=>  "Content-Type: application/json\r\n" .
                "Accept: application/json\r\n"
    )
);

$context  = stream_context_create( $options );
$result = file_get_contents( $url, false, $context );
$response = json_decode( $result );

$ response là một đối tượng. Các thuộc tính có thể được truy cập như bình thường, ví dụ: $ response -> ...

trong đó $ data là mảng chứa dữ liệu của bạn:

$data = array(
  'userID'      => 'a7664093-502e-4d2b-bf30-25a2b26d6021',
  'itemKind'    => 0,
  'value'       => 1,
  'description' => 'Boa saudaÁ„o.',
  'itemID'      => '03e76d0a-8bab-11e0-8250-000c29b481aa'
);

Cảnh báo : điều này sẽ không hoạt động nếu cài đặt allow_url_fopen được đặt thành Tắt trong php.ini.

Nếu bạn đang phát triển cho WordPress , hãy xem xét sử dụng các API được cung cấp: https://developer.wordpress.org/plugins/http-api/


1
Tôi biết mình đã trễ nhiều năm, nhưng liệu có thể nhận được tiêu đề phản hồi bằng phương pháp này không?
solarshado

3
Tuyệt vời, cảm ơn bạn đã đề cập đến việc thực hiện điều này mà không cần bất kỳ tiện ích mở rộng nào!
joonas.fi

Không có phần mở rộng luôn được chào đón. Tôi không biết rằng WP có một API tiêu chuẩn hóa cho việc này. Cảm ơn thêm vì chút thông tin đó!
Vedran Šego

2
@solarshado tiêu đề phản hồi thô có thể được tìm nạp bằng stream_get_meta_data .
Daniels118

1
Một gợi ý cải tiến nhỏ, bạn cũng có thể đặt các tiêu đề trong một mảng, đặc biệt nếu cần thêm nhiều tiêu đề như Ủy quyền. Trong trường hợp đó, không nên thêm "\ r \ n" .
zero0cool

135

Bạn có thể sử dụng CURL cho mục đích này, hãy xem mã ví dụ:

$url = "your url";    
$content = json_encode("your data to be sent");

$curl = curl_init($url);
curl_setopt($curl, CURLOPT_HEADER, false);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_HTTPHEADER,
        array("Content-type: application/json"));
curl_setopt($curl, CURLOPT_POST, true);
curl_setopt($curl, CURLOPT_POSTFIELDS, $content);

$json_response = curl_exec($curl);

$status = curl_getinfo($curl, CURLINFO_HTTP_CODE);

if ( $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);

1
Tôi có một số giá trị hơn JSON - Vâng, tôi cũng có giá trị JSON .. Làm cách nào để làm điều đó bây giờ? Tôi có tổng cộng ba giá trị cần đăng: title = somevalue & hash = somevalue & json = JSON VALUE. Bây giờ làm thế nào để làm điều này bằng php?
LIGHT

1
Điều này không hoạt động trong trường hợp của tôi ( stackoverflow.com/questions/34021817/… ). Nodejs của tôi đã nhận được {}. Có bất kỳ ý tưởng tại sao?
Fane

Nếu bạn chuẩn này và có nguồn gốc file_get_contentsphương pháp, họ về chính xác cùng tốc độ
Brian Leishman


@LIGHT - $content = http_build_query( array( 'key1' => 'value1', 'key2' => 'value2', 'json' => json_encode($array_to_become_json) ) );nơi bạn đã chuẩn bị $array_to_become_json = array(...)trước đó.
ToolmakerSteve

0

sử dụng CURL luke :) nghiêm túc, đó là một trong những cách tốt nhất để làm điều đó VÀ bạn nhận được phản hồi.


10
curl không phải luôn luôn được kích hoạt ... đôi khi bạn cần nó để làm cách thời trang cũ ...
Benjamin Eckstein

0

Hãy lưu ý rằng giải pháp file_get_contents không đóng kết nối như bình thường khi máy chủ trả về Kết nối: đóng trong tiêu đề HTTP.

Mặt khác, giải pháp CURL ngắt kết nối để tập lệnh PHP không bị chặn do chờ phản hồi.


Quan sát tuyệt vời
nensamuel
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.