DELPHI盒子
!实时搜索: 盒子论坛 | 注册用户 | 修改信息 | 退出
检举帖 | 全文检索 | 关闭广告 | 捐赠
技术论坛
 用户名
 密  码
自动登陆(30天有效)
忘了密码
≡技术区≡
DELPHI技术
lazarus/fpc/Free Pascal
移动应用开发
Web应用开发
数据库专区
报表专区
网络通讯
开源项目
论坛精华贴
≡发布区≡
发布代码
发布控件
文档资料
经典工具
≡事务区≡
网站意见
盒子之家
招聘应聘
信息交换
论坛信息
最新加入: laidabin
今日帖子: 0
在线用户: 3
导航: 论坛 -> DELPHI技术 斑竹:liumazi,sephil  
作者:
男 yesin119 (yesin119) ★☆☆☆☆ -
盒子活跃会员
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转字符的,不行。
----------------------------------------------
-
作者:
男 zhangpuqing (pupu) ★☆☆☆☆ -
普通会员
2017/7/14 13:52:41
1楼: 数据格式转换问题.
----------------------------------------------
-
作者:
男 hnxxcxg (咏南中间件) ★☆☆☆☆ -
盒子活跃会员
2017/7/14 16:01:59
2楼: 待发送字符串,先统一进行编码。中间件收到后先解码。
不要问为什么?这是常识。
----------------------------------------------
中间件QQ群: 92449782 博客: http://www.cnblogs.com/hnxxcxg/
作者:
男 yesin119 (yesin119) ★☆☆☆☆ -
盒子活跃会员
2017/7/14 16:11:02
3楼: to hnxxcxg (咏南中间件):
AnsiToUTF8(jo.ToString),我这统一转码了呀,转码的反而不行。
而没转码的反而没问题,不知道有没有看一下代码哈,注释也说明了一下

这个写法是可以的:
    smPostData.WriteString('"abcdegfg"');
服务器也有正确返回。
----------
----------
而这个不行:
    smPostData.WriteString(AnsiToUTF8(jo.ToString));
而从项目的可行性来说,这个写法是最灵活的,我可以传入json字符,写法就很灵活了。
----------------------------------------------
-
作者:
男 yesin119 (yesin119) ★☆☆☆☆ -
盒子活跃会员
2017/7/14 16:11:33
4楼: to zhangpuqing:
请问该怎么转换呢?谢谢
----------------------------------------------
-
作者:
男 delphiilove (乌羽玉) ★☆☆☆☆ -
普通会员
2017/7/14 16:18:39
5楼: 用 RESTClient ,RESTRequest, RESTresponse 控件
----------------------------------------------
-
作者:
男 yesin119 (yesin119) ★☆☆☆☆ -
盒子活跃会员
2017/7/14 18:53:19
6楼: 这个因为我要做多平台融合调用,所以,必须要实现post对于json格式的交互呢。服务器,我用Datasnap,客户端可能是php和idhttp来调用服务器的接口了

现在对于这部分说明和例子都比较少,比较简单的问题,不知道卡哪了,还希望能有大侠多多指教
----------------------------------------------
-
作者:
男 yesin119 (yesin119) ★☆☆☆☆ -
盒子活跃会员
2017/7/17 9:59:33
7楼: 我给他Show出来,再直接填充进去,发现果然不行:
json转为String后,是这个值:{"Value":"1234"}
我把上面那个值,固定填入后,这样发送,确实不行
smPostData.WriteString('"{"Value":"1234"}"');

但是把json里面的双引号去掉,发送是可以的:
smPostData.WriteString('"{Value:1234}"');
这个没问题,怎么办?
----------------------------------------------
-
作者:
男 yesin119 (yesin119) ★☆☆☆☆ -
盒子活跃会员
2017/7/18 11:09:26
8楼: 这个问题卡在这了吗?Datasnap大家都用的少吗?其实做与一些网站BS的项目结合相互调用,这个很好用呀,只是资料太少了~~
----------------------------------------------
-
作者:
男 janker (janker) ★☆☆☆☆ -
盒子活跃会员
2017/7/18 11:23:15
9楼: 我记得JSON可以取sting和value,string是加双引号的,value不加,你看看JSON的原代码
----------------------------------------------
-
作者:
男 jljaaj (小强) ▲▲▲△△ -
普通会员
2017/7/20 13:41:21
10楼: 传输的字符串你按这个格式弄下看看,这个是我里面的,post传字符串没问题
str := '"' + SQL_TXT + '"';
----------------------------------------------
-
作者:
男 yesin119 (yesin119) ★☆☆☆☆ -
盒子活跃会员
2017/7/20 15:36:40
11楼: 嗯,我其实写死传入固定的字符,测试传入双引号,等号都会出错
smPostData.WriteString(AnsiToUTF8('"user=13424234"'));这个错误
smPostData.WriteString(AnsiToUTF8('"user:13424234"'));这个正确

不知道何故!!真是很头大。
----------------------------------------------
-
作者:
男 yesin119 (yesin119) ★☆☆☆☆ -
盒子活跃会员
2017/7/20 15:46:16
12楼: 任何传入的字符里有中文也不行,请问我是不是有个什么东西或者什么编码没有设定好呢?TIdHTTP需要哪里有特殊设置吗?
或者Datasnap服务器上的TDSHTTPService需要哪里设置呢?是用的这个控件吗?
----------------------------------------------
-
作者:
男 jjwwang (jjwwang) ★☆☆☆☆ -
普通会员
2017/7/22 17:57:22
13楼:   stream := TStringStream.Create(JsonObject.ToString, TEncoding.UTF8);
----------------------------------------------
学无止境
信息
登陆以后才能回复
Copyright © 2CCC.Com 盒子论坛 v3.0.1 版权所有 页面执行969.7266毫秒 RSS