HTTP/1.1 400 лоша заявка Delphi VCL XE6

Трябва да изпратя по пощата до URL низ от JSON текст, използвам TidHTTP компонент за изпращане по пощата, както е показано в кода по-долу, но когато натисна бутона за изпращане, пропускам тази грешка, търсих в Google към друга хора, че това се случва, но нито едно от решенията не ми помогна в този случай.

var
postData:String;
url:String;
contestacion:String;
datosPOst:TStringList;
lista:TMemoryStream;
begin
datosPOst:=TStringList.Create;
datosPOst.Text:='{'+#10+'"ticketCode": "asdasd",'+#10+
'"CIF": "***",'+#10+
'"storeCode": "***",'+#10+
'"saleTimeStamp": "\/Date(123456000000)\/",'+#10+
'"email": "prueba@***",'+#10+
'"userCP": "30280",'+#10+
'"products": ['+#10+
'{'+#10+
'"Amount": 1,'+#10+
'"Description": "PRUEBA ticket",'+#10+
'"Name": "Prueba ticket 2",'+#10+
'"Price": 25.25,'+#10+
'"ProductCode": "50",'+#10+
'"Tax": 21,'+#10+
'"UnitPrice": 250.00'+#10+
'}'+#10+
'],'+#10+
'"user": "****",'+#10+
'"password": "****"'+#10+
'}';
lista:=TMemoryStream.Create;
datosPOst.SaveToStream(lista);
contestacion:=conexion.Post('http://****.com/Ticket.svc/rest/InsertTicket',lista);

Също така, ако има някакъв начин за формиране на json от delphi, също бих оценил

Благодаря


person Lluis Bernabeu    schedule 03.10.2014    source източник
comment
@whosrdaddy не е дубликат, въпросът, който сте свързали, е за поставянето му в списък с низове, където е необходим поток. Става въпрос за 400 bad-request и факта, че в този случай idHTTP не ви връща тялото, от което се нуждаете.   -  person Pieter B    schedule 03.10.2014
comment
Липсва ви запетая след потребителя, трябва да е '"user": "****",'+#10+   -  person David A    schedule 03.10.2014
comment
проблемът не е в запетаята   -  person Lluis Bernabeu    schedule 03.10.2014
comment
Можете да използвате библиотеката с отворен код SuperObject, за да създадете JSON от Delphi.   -  person mjn    schedule 04.10.2014


Отговори (2)


Сега имам решението:

conexion.Request.ContentType:='application/json';

И работи

person Lluis Bernabeu    schedule 03.10.2014

Грешка 400 е отговор, който получавате, когато има грешки във вашия JSON.

Бих посъветвал да използвате друг компонент, за да изпратите вашата POST заявка, компонент, който ви връща основния текст, защото това е, от което се нуждаете.

Synapse има алтернатива на idHTTP.

person Pieter B    schedule 03.10.2014
comment
Текстът на отговора, който можете да получите от свойството EIdHTTPProtocolException.ErrorMessage. Не бих предложил да използвате друга библиотека. - person TLama; 03.10.2014
comment
Получавате отговора за грешка, а не тялото, това са 2 различни неща. Получавам отговор за грешка: [не може да се декодира JSON обект], но той не показва информацията, която всъщност е полезна: {потребител: [Невалиден потребител]} - person Pieter B; 03.10.2014
comment
@PieterB можеш ли да включиш пълния HTTP отговор, за да илюстрираш къде са двете различни неща в отговора? - person mjn; 03.10.2014
comment
Мога да потвърдя, че EIdHTTPProtocolException.ErrorMessage наистина съдържа тялото на HTTP отговора. Текстът на HTTP отговора (Bad Request) е в EIdHTTPProtocolException.Message. - person Remy Lebeau; 03.10.2014