2012-06-04 43 views
8

Tôi đang cố gắng BÀI ĐĂNG đến một dịch vụ web đang mong nhận JSON làm trọng tải bằng Google Apps Script. Tôi đang sử dụng đoạn mã sau:Google Apps Script UrlFetchApp với JSON Payload

var options = 
{ 
    "method" : "post", 
    "contentType" : "application/json", 
    "headers" : { 
    "Authorization" : "Basic <Base64 of user:password>" 
    }, 
    "payload" : { "endDate": "2012-06-03" } 
}; 

var response = UrlFetchApp.fetch("http://www.example.com/service/expecting/json", options); 

Về phía server Tôi nhận được lỗi sau:

WARN [facade.SettingsServlet] 04 Jun 2012 15:30:26 - Unable to parse request body: endDate=2012-06-03 
net.liftweb.json.JsonParser$ParseException: unknown token e 

Tôi giả định rằng các máy chủ được mong đợi để có được

{ "endDate": "2012-06-03" } 

thay vì

endDate=2012-06-03 

nhưng tôi không biết cách làm cho UrlFetchApp làm điều đó.

Trả lời

10

Tôi không hiểu lỗi phía máy chủ nhưng thông số 'tải trọng' phải là một chuỗi như được chỉ định tại đây: https://developers.google.com/apps-script/class_urlfetchapp?hl=fr-FR#fetch.

thử:

var options = 
{ 
    "method" : "post", 
    "contentType" : "application/json", 
    "headers" : { 
    "Authorization" : "Basic <Base64 of user:password>" 
    }, 
    "payload" : '{ "endDate": "2012-06-03" }' 
}; 
+0

Người ta nói về tải trọng trong liên kết:" ... Nó có thể là một String, một mảng byte, hoặc một chìa khóa JavaScript/value map. Xem ví dụ. " Khi tôi thử đề xuất của bạn, tôi nhận được mã Lỗi 400 từ máy chủ. Tôi đã thử 'Utilities.jsonStringify' cũng với cùng một mã phản hồi 400. – Guy

+0

Nhưng thông báo lỗi phía máy chủ có giống nhau không? Thử chụp yêu cầu để xem cơ thể trông như thế nào. –

+0

Thông báo lỗi là khác nhau vì tôi không nhận được yêu cầu cho máy chủ ở tất cả (400). Tôi không thể nắm bắt được yêu cầu từ phía máy khách (Google Apps Script) và tôi không thấy yêu cầu đó vượt qua Tomcat. Không theo dõi nó trong nhật ký Tomcat. – Guy

2
  • Nếu bạn đặt tải trọng như một String, nó sẽ được chuyển trực tiếp (như là một UTF-8 string).
  • Nếu bạn đặt tải trọng làm Đối tượng, nó sẽ được gửi như biểu mẫu HTML (có nghĩa là 'application/x-www-form-urlencoded' nếu trường đơn giản hoặc 'multipart/form-data' nếu Object bao gồm một tập tin/blob ).

Đối với trường hợp sử dụng của bạn (máy chủ dự kiến ​​nhận JSON), có vẻ như Utilities.jsonStringify() là cách để thực hiện.

+0

Tôi nghi ngờ rằng có thể có vấn đề với GAS trong trường hợp này vì phần thân yêu cầu trong trường hợp này không hợp lệ theo một cách nào đó. Máy chủ thường phân tích cú pháp JSON trong cơ thể từ các nguồn khác, không thể phân tích cú pháp yêu cầu đến từ GAS. Tôi đã thử cả hai phiên bản Stringing tải trọng, với '...' và Utilities.jsonStringify (...). – Guy

+1

Có thể để so sánh các yêu cầu, hãy thử POST tới URL echo như: http://responseecho.appspot.com/ –

0

Ở đây sẽ là mã mà nên làm việc với một số ý kiến ​​quan trọng:

function testMe() { 
    var products_authkey = "------------"; 
    try { 
     var url = "https://app.ecwid.com/api/v1/---------/product?id=----------&secure_auth_key=" + products_authkey; 
     //url= "http://requestb.in/----------"; // you can actually debug what you send out with PUTs or POSTs using Requestb.in service 
     var payload = { 
      id: "21798583", // id is necessary and should be a string, or it might be sent in scientific representation (with E) 
      price: 62755 
     }; 

     payload = JSON.stringify(payload); // the payload needs to be sent as a string, so we need this 
     var options = { 
      method: "put", 
      contentType: "application/json", // contentType property was mistyped as ContentType - case matters 
      payload: payload 
     }; 
     var result = UrlFetchApp.getRequest(url, options); 
     Logger.log(result) // a better way to debug 
     var result = UrlFetchApp.fetch(url, options); // works perfectly in my case 
     Logger.log(result) 
    } catch (e) { 
     Logger.log(e) 
    } 
} 
+0

Phải là 'JSON.stringify (payload)' –

Các vấn đề liên quan