Postman error against the HTTP JSON API

I’m trying to query the HTTP JSON API with Postman, but get the following answer. On some forums they say it’s an error on the server side. Is that true, or I am doing something wrong?

GET http://localhost:7575/v1/query: {
  "Error": "Parse Error: Expected HTTP/",
  "Request Headers": {
    "authorization": "Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJodHRwczovL2RhbWwuY29tL2xlZGdlci1hcGkiOnsibGVkZ2VySWQiOiJzYW5kYm94IiwiYXBwbGljYXRpb25JZCI6ImZvb2JhciIsImFjdEFzIjpbImNhcnJpZXIiXX19.E6TKljEjPA-1QxH-oR0k0GSuzbz6IaGrwExvuryUajA",
    "content-type": "application/json",
    "user-agent": "PostmanRuntime/7.29.0",
    "accept": "*/*",
    "postman-token": "253888c3-6822-4915-b96f-c219dc5b7b1d",
    "host": "localhost:7575",
    "accept-encoding": "gzip, deflate, br",
    "connection": "keep-alive"
  },
  "Request Body": "{}"
}

I’m not familiar with Postman; is there some sort of debug mode/output that would show you (and us if you share it) the exact content of the HTTP request it sent?

1 Like

The JSON API logs would also be very useful.

I can copy to clipboard what I included in the question.

This is printed to the console:

GET http://localhost:7575/v1/query
Error: Parse Error: Expected HTTP/
Proxy
id: "822b89ae-343f-4b35-8f46-be6bf32361ff"
disabled: false
host: "127.0.0.1."
match: {…}
pattern: "http://*:*/*"
port: 6865
tunnel: false
authenticate: false
Request Headers
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJodHRwczovL2RhbWwuY29tL2xlZGdlci1hcGkiOnsibGVkZ2VySWQiOiJzYW5kYm94IiwiYXBwbGljYXRpb25JZCI6ImZvb2JhciIsImFjdEFzIjpbImNhcnJpZXIiXX19.E6TKljEjPA-1QxH-oR0k0GSuzbz6IaGrwExvuryUajA
Content-Type: application/json
User-Agent: PostmanRuntime/7.29.0
Accept: */*
Postman-Token: 253888c3-6822-4915-b96f-c219dc5b7b1d
Host: localhost:7575
Accept-Encoding: gzip, deflate, br
Connection: keep-alive
Request Body
{}

I cannot see any effect of the Potman request in the log:

gyorgybalazsi@BGY init_examples % sh start_json_api.sh
08-08-2022 11:52:34.870 [main] INFO  com.daml.http.Main - Config(ledgerHost=localhost, ledgerPort=6865, address=localhost, httpPort=7575, portFile=None, packageReloadInterval=5 seconds, packageMaxInboundMessageSize=None, maxInboundMessageSize=4194304, tlsConfig=TlsConfiguration(false,None,None,None,None,REQUIRE,false,None), jdbcConfig=None, staticContentConfig=None, allowNonHttps=false, wsConfig=None, nonRepudiationCertificateFile=None, nonRepudiationPrivateKeyFile=None, nonRepudiationPrivateKeyAlgorithm=None, surrogateTpIdCacheMaxEntries=None), context: {instance_uuid: "8d74cdb2-770a-4df7-956f-2946a10bdc90"} 
08-08-2022 11:52:35.352 [http-json-ledger-api-akka.actor.default-dispatcher-5] INFO  akka.event.slf4j.Slf4jLogger - Slf4jLogger started 
08-08-2022 11:52:35.724 [http-json-ledger-api-akka.actor.default-dispatcher-9] INFO  com.daml.http.HttpService - HTTP Server pre-startup, context: {instance_uuid: "8d74cdb2-770a-4df7-956f-2946a10bdc90"} 
08-08-2022 11:52:36.066 [http-json-ledger-api-akka.actor.default-dispatcher-9] INFO  com.daml.http.LedgerClient - Attempting to connect to the ledger localhost:6865 (600 attempts), context: {instance_uuid: "8d74cdb2-770a-4df7-956f-2946a10bdc90"} 
08-08-2022 11:52:36.778 [http-json-ledger-api-akka.actor.default-dispatcher-9] INFO  com.daml.http.LedgerClient - Attempt 1/600 succeeded!, context: {instance_uuid: "8d74cdb2-770a-4df7-956f-2946a10bdc90"} 
08-08-2022 11:52:36.783 [http-json-ledger-api-akka.actor.default-dispatcher-9] INFO  com.daml.http.LedgerClient - Attempting to connect to the ledger localhost:6865 (600 attempts), context: {instance_uuid: "8d74cdb2-770a-4df7-956f-2946a10bdc90"} 
08-08-2022 11:52:36.792 [http-json-ledger-api-akka.actor.default-dispatcher-9] INFO  com.daml.http.LedgerClient - Attempt 1/600 succeeded!, context: {instance_uuid: "8d74cdb2-770a-4df7-956f-2946a10bdc90"} 
08-08-2022 11:52:36.793 [http-json-ledger-api-akka.actor.default-dispatcher-9] INFO  com.daml.http.HttpService - contractDao: None, context: {instance_uuid: "8d74cdb2-770a-4df7-956f-2946a10bdc90"} 
08-08-2022 11:52:37.663 [http-json-ledger-api-akka.actor.default-dispatcher-11] INFO  com.daml.http.Main - Started server: (ServerBinding(/127.0.0.1:7575),None), context: {instance_uuid: "8d74cdb2-770a-4df7-956f-2946a10bdc90"} 

What happens if you send the same request via Curl, e.g., curl localhost:7575/v1/query?

I get a correct answer:

% curl --location --request GET 'http://localhost:7575/v1/query' \
--header 'Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJodHRwczovL2RhbWwuY29tL2xlZGdlci1hcGkiOnsibGVkZ2VySWQiOiJzYW5kYm94IiwiYXBwbGljYXRpb25JZCI6ImZvb2JhciIsImFjdEFzIjpbImNhcnJpZXIiXX19.E6TKljEjPA-1QxH-oR0k0GSuzbz6IaGrwExvuryUajA' \
--header 'Content-Type: application/json' \
--data-raw '{}'
{"result":[],"status":200}% 

Sounds like it’s a postman issue.

1 Like

May be. Some time ago I used Postman for this purpose.

Looks like the HTTP version is missing from the HTTP request line sent by Postman (RFC 2616: Hypertext Transfer Protocol -- HTTP/1.1). The request line should be something like

GET http://localhost:7575/v1/query HTTP/1.1

Postman is such a mature tool I’m a bit surprised by the error, there’s probably something we’re overlooking.

1 Like

Can you try that curl command again with an added -v at the end, and report the full result?

That’s it:

% curl --location --request GET 'http://localhost:7575/v1/query' \
--header 'Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJodHRwczovL2RhbWwuY29tL2xlZGdlci1hcGkiOnsibGVkZ2VySWQiOiJzYW5kYm94IiwiYXBwbGljYXRpb25JZCI6ImZvb2JhciIsImFjdEFzIjpbImNhcnJpZXIiXX19.E6TKljEjPA-1QxH-oR0k0GSuzbz6IaGrwExvuryUajA' \
--header 'Content-Type: application/json' \
--data-raw '{}' -v
*   Trying 127.0.0.1:7575...
* Connected to localhost (127.0.0.1) port 7575 (#0)
> GET /v1/query HTTP/1.1
> Host: localhost:7575
> User-Agent: curl/7.79.1
> Accept: */*
> Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJodHRwczovL2RhbWwuY29tL2xlZGdlci1hcGkiOnsibGVkZ2VySWQiOiJzYW5kYm94IiwiYXBwbGljYXRpb25JZCI6ImZvb2JhciIsImFjdEFzIjpbImNhcnJpZXIiXX19.E6TKljEjPA-1QxH-oR0k0GSuzbz6IaGrwExvuryUajA
> Content-Type: application/json
> Content-Length: 2
> 
* Mark bundle as not supporting multiuse
< HTTP/1.1 200 OK
< Server: akka-http/10.2.8
< Date: Mon, 08 Aug 2022 13:55:37 GMT
< Transfer-Encoding: chunked
< Content-Type: application/json
< 
* Connection #0 to host localhost left intact
{"result":[],"status":200}% 

I wanted to double-check that it wasn’t an issue with the response, but it looks well-formed to me.

I don’t know how to help further in the absence of an option for Postman to display detailed logs like these, i.e. that include the exact HTTP message sent.

1 Like

Thank you for your effort, I let this go, I can solve my problem with different tools.

I ran into this problem just now. I’d like to document the solution that worked for me, in case someone finds this page like I did. In my case…


I had my Postman port number variable set to the wrong port. In my Postman request, I was using {{ApiPort}}, which I had previously configured for the Ledger API, port 6865. When I blindly reused my {{ApiPort}} variable for a new JSON API request, I received the message:

GET http://localhost:6865/v1/query
Error: Parse Error: Expected HTTP/

When I changed the value of {{ApiPort}} to 7575, the GET of the v1/query endpoint returned a proper result and I no longer saw the error message.


This does not appear to have been the case for gyorgybalazsi, but if you make the same mistake I did,… you are welcome! :slight_smile: