|
|
导航: |
论坛 -> DELPHI技术
斑竹:liumazi,sephil |
|
作者: |
|
2017/7/14 12:39:42 |
标题: |
Datasnap服务器和客户端json交互,很奇怪的问题,请大侠协助... |
浏览:2061 |
|
加入我的收藏 |
楼主: |
服务器端很简单的写一个函数: function TdtmdlNetDogSvr.updateTestJsonString(const JsonValue: string): string; begin Result := JsonValue; end; 其实就是Delphi例子里的函数,我只是改了名字而已,用原函数也一样。 客户端,我用IDHttp进行post: procedure TForm3.BitBtn3Click(Sender: TObject); var resHttp: string; jo: TJSONObject; jp: TJSONPair; smPostData: TStringStream; begin smPostData := TStringStream.Create; jo := TJSONObject.Create; try jp := TJSONPair.Create('Value', '1234'); // 生成tjsonpair jo.AddPair(jp); // rbody := TStringStream.Create(AnsiToUTF8(jo.ToString)); // 这个可以: // smPostData.WriteString('"abcdegfg"'); // 这个不行: smPostData.WriteString(AnsiToUTF8(jo.ToString)); tmphttp.HandleRedirects := true; tmphttp.ReadTimeout := 3000; tmphttp.Request.ContentType := 'application/x-www-form-urlencoded'; tmphttp.Request.BasicAuthentication := true; tmphttp.Request.CharSet := 'utf-8'; tmphttp.Response.CharSet := 'utf-8'; tmphttp.Request.Username := 'yolosoft'; tmphttp.Request.Password := 'yolopwd'; resHttp := tmphttp.Post('http://20000006.abc.cc/datasnap/rest/TdtmdlNetDogSvr/TestJsonString', smPostData); mmJson.Lines.Add('接收<<' + resHttp); finally smPostData.Free; jo.Free; end; end;
因为考虑到实际应用,因此传入的应该是json格式的多参数,这个我想在客户端直接将json转为字符传递给服务器,然后服务器解释字符变为json对象。
但是现在最简单的都实现不了,我传入这种字符串,为什么写死就行,而使用json转一下字符就不行呢? 错误很直接: ---------- Project3 ---------- HTTP/1.1 500 Internal Server Error. ---------- 确定 ---------- 请指点迷津,先谢过。。请看内容,那个行的写法,能正确返回,而用json转字符的,不行。
----------------------------------------------
- |
作者: |
|
2017/7/14 13:52:41 |
1楼: |
数据格式转换问题.
----------------------------------------------
-
|
作者: |
|
2017/7/14 16:01:59 |
2楼: |
待发送字符串,先统一进行编码。中间件收到后先解码。 不要问为什么?这是常识。
----------------------------------------------
中间件QQ群: 92449782 博客: http://www.cnblogs.com/hnxxcxg/
|
作者: |
|
2017/7/14 16:11:02 |
3楼: |
to hnxxcxg (咏南中间件): AnsiToUTF8(jo.ToString),我这统一转码了呀,转码的反而不行。 而没转码的反而没问题,不知道有没有看一下代码哈,注释也说明了一下
这个写法是可以的: smPostData.WriteString('"abcdegfg"'); 服务器也有正确返回。 ---------- ---------- 而这个不行: smPostData.WriteString(AnsiToUTF8(jo.ToString)); 而从项目的可行性来说,这个写法是最灵活的,我可以传入json字符,写法就很灵活了。
----------------------------------------------
-
|
作者: |
|
2017/7/14 16:11:33 |
4楼: |
to zhangpuqing: 请问该怎么转换呢?谢谢
----------------------------------------------
-
|
作者: |
|
2017/7/14 16:18:39 |
5楼: |
用 RESTClient ,RESTRequest, RESTresponse 控件
----------------------------------------------
-
|
作者: |
|
2017/7/14 18:53:19 |
6楼: |
这个因为我要做多平台融合调用,所以,必须要实现post对于json格式的交互呢。服务器,我用Datasnap,客户端可能是php和idhttp来调用服务器的接口了
现在对于这部分说明和例子都比较少,比较简单的问题,不知道卡哪了,还希望能有大侠多多指教
----------------------------------------------
-
|
作者: |
|
2017/7/17 9:59:33 |
7楼: |
我给他Show出来,再直接填充进去,发现果然不行: json转为String后,是这个值:{"Value":"1234"} 我把上面那个值,固定填入后,这样发送,确实不行 smPostData.WriteString('"{"Value":"1234"}"');
但是把json里面的双引号去掉,发送是可以的: smPostData.WriteString('"{Value:1234}"'); 这个没问题,怎么办?
----------------------------------------------
-
|
作者: |
|
2017/7/18 11:09:26 |
8楼: |
这个问题卡在这了吗?Datasnap大家都用的少吗?其实做与一些网站BS的项目结合相互调用,这个很好用呀,只是资料太少了~~
----------------------------------------------
-
|
作者: |
janker (janker) |
★☆☆☆☆ |
-
|
盒子活跃会员 |
|
2017/7/18 11:23:15 |
9楼: |
我记得JSON可以取sting和value,string是加双引号的,value不加,你看看JSON的原代码
----------------------------------------------
-
|
作者: |
|
2017/7/20 13:41:21 |
10楼: |
传输的字符串你按这个格式弄下看看,这个是我里面的,post传字符串没问题 str := '"' + SQL_TXT + '"';
----------------------------------------------
-
|
作者: |
|
2017/7/20 15:36:40 |
11楼: |
嗯,我其实写死传入固定的字符,测试传入双引号,等号都会出错 smPostData.WriteString(AnsiToUTF8('"user=13424234"'));这个错误 smPostData.WriteString(AnsiToUTF8('"user:13424234"'));这个正确
不知道何故!!真是很头大。
----------------------------------------------
-
|
作者: |
|
2017/7/20 15:46:16 |
12楼: |
任何传入的字符里有中文也不行,请问我是不是有个什么东西或者什么编码没有设定好呢?TIdHTTP需要哪里有特殊设置吗? 或者Datasnap服务器上的TDSHTTPService需要哪里设置呢?是用的这个控件吗?
----------------------------------------------
-
|
作者: |
|
2017/7/22 17:57:22 |
13楼: |
stream := TStringStream.Create(JsonObject.ToString, TEncoding.UTF8);
----------------------------------------------
学无止境
|
|