線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:368
推到 Plurk!
推到 Facebook!

Rest Server如何取得從RESTREQUEST-POST/PUT的BODY資料

答題得分者是:GrandRURU
macchen
初階會員


發表:66
回覆:102
積分:33
註冊:2006-07-07

發送簡訊給我
#1 引用回覆 回覆 發表時間:2017-06-21 10:22:41 IP:219.87.xxx.xxx 未訂閱
請問一下,我有一個REST的SERVER,然後我想從RESTCLIENT中的POST/PUT指令送出JSON的資料到SERVER端,利用URL的方式,好像會出錯,所以才想從BODY送,但SERVER那端不知如何解析送過來的BODY資料,麻煩有經驗的人幫忙一下,謝謝。
REST CLIENT的程式碼如下,但SERVER那端要如何寫才可以接收到BODY的JSON資料:
[code delphi]
var
jo:TJSONObject ;
begin
RESTRequest1.Method := TRESTRequestMethod.rmPOST ;
RESTRequest1.Resource := 'boardinput/{itemid}';
RESTRequest1.AddParameter(
{ AName } 'itemid',
{ AValue } 'test',
{ AKind } TRESTRequestParameterKind.pkURLSEGMENT);
jo := TJSONObject.Create ;
jo.AddPair('string', 'aaa');
jo.AddPair('intvalue', '1234') ;
RESTRequest1.AddBody(jo);
RESTRequest1.Execute ;
[/code]
------
DELPHI初學者
GrandRURU
站務副站長


發表:234
回覆:1654
積分:1752
註冊:2005-06-21

發送簡訊給我
#2 引用回覆 回覆 發表時間:2017-06-22 14:17:26 IP:59.120.xxx.xxx 未訂閱
macchen
初階會員


發表:66
回覆:102
積分:33
註冊:2006-07-07

發送簡訊給我
#3 引用回覆 回覆 發表時間:2017-06-23 14:26:29 IP:219.87.xxx.xxx 未訂閱
你好,先謝謝你的回覆,這文章我之前有看過,但server那端範例是用php的語法去取得restclient傳過來的參數,如下:
此為restrequest傳送的程式碼。
var

nameStr : String;
begin
...
nameStr := TIdURI.ParamsEncode(nameStr, IndyTextEncoding_UTF8);
self.RESTRequest1.AddParameter('name', nameStr,
TRESTRequestParameterKind.pkGETorPOST,
[TRESTRequestParameterOption.poDoNotEncode]);
...
end;

但是server那端卻是只有用php說明,如下,我還是找不到delphi的rest server可以從那邊取得從client端post json的資料放在body裡,然後server端可以顯示出來,不好意思,可以再指導一下小弟嗎?或是再麻煩跟我說明一下,謝謝。
最後,我把 PHP 程式碼也附上來給大家參考:
<?php
date_default_timezone_set("Asia/Taipei");
header('Content-Type: charset=utf-8');

include("public/DBClassPDO.php");
$objDBPDO = new DBClassPDO();

===================引 用 GrandRURU 文 章===================
請參閱:http://firemonkeylessons.blogspot.tw/2017/06/http-client-encode.html
------
DELPHI初學者
GrandRURU
站務副站長


發表:234
回覆:1654
積分:1752
註冊:2005-06-21

發送簡訊給我
#4 引用回覆 回覆 發表時間:2017-06-23 15:23:55 IP:59.120.xxx.xxx 未訂閱
Server 端接受到 POST 請求,會主動尋找【update】開頭的 Method

以 EchoString 為例,Client 使用 POST 請求時,會去找【UpdateEchoString 】進行 POST

您可以另外建一個 Update 開頭的 Method 做和 GET 相同的函式。

至於您說的 BODY,我沒有寫過,暫時無法回答這個問題

===================引 用 macchen 文 章===================
你好,先謝謝你的回覆,這文章我之前有看過,但server那端範例是用php的語法去取得restclient傳過來的參數,如下:
此為restrequest傳送的程式碼。
var

nameStr : String;
begin
...
nameStr := TIdURI.ParamsEncode(nameStr, IndyTextEncoding_UTF8);
self.RESTRequest1.AddParameter('name', nameStr,
TRESTRequestParameterKind.pkGETorPOST,
[TRESTRequestParameterOption.poDoNotEncode]);
...
end;

但是server那端卻是只有用php說明,如下,我還是找不到delphi的rest server可以從那邊取得從client端post json的資料放在body裡,然後server端可以顯示出來,不好意思,可以再指導一下小弟嗎?或是再麻煩跟我說明一下,謝謝。
最後,我把 PHP 程式碼也附上來給大家參考:
date_default_timezone_set("Asia/Taipei");
header('Content-Type: charset=utf-8');

include("public/DBClassPDO.php");
$objDBPDO = new DBClassPDO();

===================引 用 GrandRURU 文 章===================
請參閱:http://firemonkeylessons.blogspot.tw/2017/06/http-client-encode.html
macchen
初階會員


發表:66
回覆:102
積分:33
註冊:2006-07-07

發送簡訊給我
#5 引用回覆 回覆 發表時間:2017-06-23 17:08:30 IP:219.87.xxx.xxx 未訂閱
謝謝,當client使用post時,如果會呼叫【UpdateEchoString 】,這個之前有查到了,只是因為http送出post/put時,可以用body帶資料,而別人使用post/put指令時,會需要帶json的資訊給我,所以才會想問如何可以當client送出post/put帶有body資訊時,server該如何抓取body的資訊,另外請問一下,有看過下面二個訊息嗎?謝謝。

第一個
Project RestServer.exe raised exception class TDBXError with message 'Cannot converter JSON value {"error":"no record."} input into TDBXTypes.WideString'.
第二個
message content is not a valid JSON

再麻煩指導我一下,謝謝您。

===================引 用 GrandRURU 文 章===================
Server 端接受到 POST 請求,會主動尋找【update】開頭的 Method

以 EchoString 為例,Client 使用 POST 請求時,會去找【UpdateEchoString 】進行 POST

您可以另外建一個 Update 開頭的 Method 做和 GET 相同的函式。

至於您說的 BODY,我沒有寫過,暫時無法回答這個問題
------
DELPHI初學者
GrandRURU
站務副站長


發表:234
回覆:1654
積分:1752
註冊:2005-06-21

發送簡訊給我
#6 引用回覆 回覆 發表時間:2017-06-23 17:41:10 IP:59.120.xxx.xxx 未訂閱
BODY 資料我只看到 RAD Server 可以應用
請參閱:http://blog.hjf.pe.kr/category/Delphi/C++Builder

===================引 用 macchen 文 章===================
謝謝,當client使用post時,如果會呼叫【UpdateEchoString 】,這個之前有查到了,只是因為http送出post/put時,可以用body帶資料,而別人使用post/put指令時,會需要帶json的資訊給我,所以才會想問如何可以當client送出post/put帶有body資訊時,server該如何抓取body的資訊,另外請問一下,有看過下面二個訊息嗎?謝謝。

第一個
Project RestServer.exe raised exception class TDBXError with message 'Cannot converter JSON value {"error":"no record."} input into TDBXTypes.WideString'.
第二個
message content is not a valid JSON

再麻煩指導我一下,謝謝您。

===================引 用 GrandRURU 文 章===================
Server 端接受到 POST 請求,會主動尋找【update】開頭的 Method

以 EchoString 為例,Client 使用 POST 請求時,會去找【UpdateEchoString 】進行 POST

您可以另外建一個 Update 開頭的 Method 做和 GET 相同的函式。

至於您說的 BODY,我沒有寫過,暫時無法回答這個問題
GrandRURU
站務副站長


發表:234
回覆:1654
積分:1752
註冊:2005-06-21

發送簡訊給我
#7 引用回覆 回覆 發表時間:2017-06-23 21:46:43 IP:180.217.xxx.xxx 未訂閱
我回答錯了
如果要使用 BODY,應該是這樣寫

RESTRequest1.AddBody(TStringStream.Create('{"test":"Q測試"}',TEncoding.UTF8),TRESTContentType.ctAPPLICATION_JSON);  
RESTRequest.Execute;  

Body 裡要放 JSON,同時也要在 Method 加入 TJSONObject
我使用 RESTDebugger 測試成功,理論上使用上述的程式碼應該就可以成功

但我手上目前只有 XE,但 REST Debugger 可以成功,代表只是 RESTRequest 要設定好而已

您最後問的錯誤訊息大致上是說: JSON 解析失敗
要試的話可以用簡單一點的 JSON 寫法,像是:
{
"error":"Message content is not a valid JSON value."
}

(笑)



以上
===================引 用 GrandRURU 文 章===================
BODY 資料我只看到 RAD Server 可以應用
請參閱:http://blog.hjf.pe.kr/category/Delphi/C++Builder

===================引 用 macchen 文 章===================
謝謝,當client使用post時,如果會呼叫【UpdateEchoString 】,這個之前有查到了,只是因為http送出post/put時,可以用body帶資料,而別人使用post/put指令時,會需要帶json的資訊給我,所以才會想問如何可以當client送出post/put帶有body資訊時,server該如何抓取body的資訊,另外請問一下,有看過下面二個訊息嗎?謝謝。

第一個
Project RestServer.exe raised exception class TDBXError with message 'Cannot converter JSON value {"error":"no record."} input into TDBXTypes.WideString'.
第二個
message content is not a valid JSON

再麻煩指導我一下,謝謝您。

===================引 用 GrandRURU 文 章===================
Server 端接受到 POST 請求,會主動尋找【update】開頭的 Method

以 EchoString 為例,Client 使用 POST 請求時,會去找【UpdateEchoString 】進行 POST

您可以另外建一個 Update 開頭的 Method 做和 GET 相同的函式。

至於您說的 BODY,我沒有寫過,暫時無法回答這個問題
編輯記錄
GrandRURU 重新編輯於 2017-06-23 22:15:34, 註解 無‧
macchen
初階會員


發表:66
回覆:102
積分:33
註冊:2006-07-07

發送簡訊給我
#8 引用回覆 回覆 發表時間:2017-06-26 15:52:42 IP:219.87.xxx.xxx 未訂閱
謝謝你給了我方向,我再去試試看,感謝你,先結案了。
------
DELPHI初學者
編輯記錄
macchen 重新編輯於 2017-06-26 16:13:29, 註解 無‧
macchen 重新編輯於 2017-06-26 16:21:02, 註解 無‧
macchen 重新編輯於 2017-06-26 16:23:33, 註解 無‧
macchen 重新編輯於 2017-06-26 17:34:02, 註解 無‧
系統時間:2017-11-24 20:58:48
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!