DELPHI盒子
!实时搜索: 盒子论坛 | 注册用户 | 修改信息 | 退出
检举帖 | 全文检索 | 关闭广告 | 捐赠
技术论坛
 用户名
 密  码
自动登陆(30天有效)
忘了密码
≡技术区≡
DELPHI技术
lazarus/fpc/Free Pascal
移动应用开发
Web应用开发
数据库专区
报表专区
网络通讯
开源项目
论坛精华贴
≡发布区≡
发布代码
发布控件
文档资料
经典工具
≡事务区≡
网站意见
盒子之家
招聘应聘
信息交换
论坛信息
最新加入: a12315
今日帖子: 49
在线用户: 9
导航: 论坛 -> Web应用开发 斑竹:bodies  
作者:
男 dpbug (dpbug) ★☆☆☆☆ -
普通会员
2018/1/14 16:10:14
标题:
请教:简单的Delphi向web服务器提交问题,初学,请指教! 浏览:2439
加入我的收藏
楼主: 开发环境:WIN10家庭版,Delphi XE4
功能需求:Delphi使用IdHTTP控件向web服务器发送一个请求,获得返回的数据。该服务器支持XML和JSON返回,说明中提到需要——“客户端指定Con_tentType="application/json",则服务器返回JSON格式”
请求语句:http://**.**.**.**:**/api/**/getlastinfo?tid=2123123&key=3546-2232-23421-2342

我使用Edge直接在浏览器中输入上述链接,返回正常:
{"tid":"2123123","Time":0,"Dir":240,"Mileage":0"Addr":{"Province":"山东省","City":"济南市"},}

我使用DELPHI写入,代码如下:
url := 'http://**.**.**.**:**/api/**/getlastinfo?tid=2123123&key=3546-2232-23421-2342';
IdHTTP.Get(url, ts);     // ts 为TStringStream
ts.Position := 0;
ajson := SuperObject.so(ts.DataString);    // ajson为ISuperObject
dir := ajson['Dir'].AsInteger;     // 此句报错了
我把报错的语句注释掉,加上了Memo1.Lines.Add(ajson.AsString); 想看看返回的是否正确,结果Memo1显示的内容如下:
<TDetail xmlns:i="http://www.w3.org/2001/XMLSchema-instance"; xmlns="http://schemas.datacontract.org/2004/07/CloudMap.Models";><Time>0</Time><Dir>240</Dir><Addr><City>娴庡崡甯?/City><Province>灞变笢鐪?/Province></Addr></TDetail>
返回的应该不是JSON类型了,而且还是乱码,明明浏览器中测试通过,为什么不行能。是不是用IdHTTP发送请求错误?
在线等,谢谢!
----------------------------------------------
-
作者:
男 xuchuantao (暗黑天使) ★☆☆☆☆ -
普通会员
2018/1/14 22:30:38
1楼: 返回的是xml类型,你没有指定返回类型
----------------------------------------------
按此在新窗口浏览图片
作者:
男 xuchuantao (暗黑天使) ★☆☆☆☆ -
普通会员
2018/1/14 22:32:08
2楼: 你直接showmessage显示以看看是不是乱码
----------------------------------------------
按此在新窗口浏览图片
作者:
男 dpbug (dpbug) ★☆☆☆☆ -
普通会员
2018/1/14 23:02:54
3楼: 上述信息我也showmessage了,和memo显示的一样,是乱码。
另外,好像这也不是XML格式啊,xml文件开头应该是:‘<?xml version="1.0" encoding="utf-8"?>’
所以我用delphi自带的xml控件也解析不了,提示错误。
怎么指定web服务器返回类型呢?为什么用windows的edge浏览器就能返回json格式?请指教
----------------------------------------------
-
作者:
男 cxg417 (cxg417) ★☆☆☆☆ -
盒子活跃会员
2018/1/14 23:52:36
4楼: 有在哪指定Con_tentType="application/json"这个的选项吗?
----------------------------------------------
-
作者:
男 dpbug (dpbug) ★☆☆☆☆ -
普通会员
2018/1/15 8:10:44
5楼: 是啊,我也不清楚哪里能设置ContentType="application/json",
----------------------------------------------
-
作者:
男 looper (keyo) ★☆☆☆☆ -
盒子活跃会员
2018/1/15 9:35:08
6楼: IdHTTP.Request.Accept='application/json'

IdHTTP.Request.Accept默认是'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',这里默认是没有json的

可能是这里的问题吧,试看看,我也没实际试过!
----------------------------------------------
虽千万人吾往矣!
作者:
男 wang_80919 (Flying Wang) ★☆☆☆☆ -
普通会员
2018/1/15 10:18:46
7楼: get post head 等 都可以带上请求头信息。
楼上的代码,应该就是请求的信息的一部分。

IdHTTP.Request 对象,内部有很多信息的。

但是,乱码问题,需要用另一个办法解决。

最简单的 ts 构造的时候,指定编码。
只要你编码指定对了,就不会乱码了。
----------------------------------------------
(C)(P)Flying Wang
作者:
男 looper (keyo) ★☆☆☆☆ -
盒子活跃会员
2018/1/15 10:55:41
8楼: json数据里面有中文,如果不注意编码就会出现乱码。

我前几天刚碰到,用ajax取回来的数据中文就是乱码的。后来我把服务端json数据文件(因为我是发送数据文件到浏览器的,所以是一个文件)另存为utf8格式,再发送就正常了。
----------------------------------------------
虽千万人吾往矣!
作者:
男 bjlg (蓝天) ★☆☆☆☆ -
盒子活跃会员
2018/1/15 22:11:41
9楼: 是delphi json对格式要求的严格而已格式错了,你看ajson 是不是nil
----------------------------------------------
http://delphi.icm.edu.pl/ftp/http://delphi-z.ru
作者:
男 bahamut8348 (leonna) ★☆☆☆☆ -
普通会员
2018/1/17 12:27:46
10楼: 指定了charset=utf-8,那么就要用utf8解一次码。
----------------------------------------------
--
作者:
男 dpbug (dpbug) ★☆☆☆☆ -
普通会员
2018/1/24 23:15:16
11楼: 感谢各位的帮助,问题已经解决。
设置IdHTTP.Request.Accept := 'application/json'后,服务器能够正常返回JSON数据了。
另外,加上一句ts := TStringStream.Create('', TEncoding.GetEncoding(65001));
可以解决乱码的问题。
谢谢各位!!!
----------------------------------------------
-
信息
登陆以后才能回复
Copyright © 2CCC.Com 盒子论坛 v3.0.1 版权所有 页面执行679.6875毫秒 RSS