F# - Http.RequestString Error - CURL And PowerShell OK - powershell

I am trying to access a remote service using "F# Data Http Utilities" but without success:
let account token = Http.RequestString("https://api.example.com/v1",
httpMethod = "POST",
headers = ["Accept", "application/json";
"Content-Type", "application/json";
"X-Application", "JRQ";
"X-Authentication", "MOl5C9ZZ";],
body = TextRequest """ {"jsonrpc": "2.0", "method": "getAccount"} """)
even though both the curl and PowerShell equivalents work correctly:
curl -i -X POST \
-H "Accept:application/json" \
-H "Content-Type:application/json" \
-H "X-Application:JRQ" \
-H "X-Authentication:MOl5C9ZZ" \
-d '{"jsonrpc": "2.0", "method": "getAccount"}' \
'https://api.example.com/v1'
What am I missing?

It seems that there is no error in the original F# code. Setting the following property:
System.Net.ServicePointManager.Expect100Continue <- false;
resolved the problem!

Related

How to update KeyResult Actual Values Using Rally REST API

I want to update actual value for some Objective Key Result.
I am using following curl-
curl --location -g --request POST 'https://rally1.rallydev.com/slm/webservice/v2.0/keyresultactualvalue/{Key Result UUID}' \
--header 'zsessionid: xxxxxxxxxxxxxxxxxxxxxxxx' \
--header 'Authorization: Basic xxxxxxxxxxxxxxxxxxxxxxxxxxxx' \
--header 'Content-Type: application/json' \
--header 'Cookie: JSESSIONID=gc-app-xxxxxxxxxxxxxxxxxxx.gc-app-18; SERVERID=xxxxxxxxxxxxxxxxxxxxx; SUBBUCKETID=100; SUBSCRIPTIONID=100; __cflb=xxxxxxxxxxxxxxxxxxxxxx; _username=test#ktestlera.io' \
--data-raw '{
"KeyResultActualValues":{
"Date":"2023-10-10",
"ActualValue":"100"
}
}'
But I am getting error:
{
"OperationResult": {
"_rallyAPIMajor": "2",
"_rallyAPIMinor": "0",
"Errors": [
"Cannot parse number: For input string: \"ObjectReference[oid=null, type=null]\""
],
"Warnings": []
}
}
I am sure that I am sending wrong request body.
Please help me in that.

KSQLDB Rest API: return query results as json

I'm issuing the following request:
curl --http2 -X "POST" "http://localhost:8088/query-stream"
-H "Content-Type: application/vnd.ksql.v1+json; charset=utf-8"
-d $'{
"sql": "SELECT * FROM USERS EMIT CHANGES;",
"streamsProperties": {
"ksql.streams.auto.offset.reset": "earliest"
}
}
The result I'm getting is:
{"queryId":"cdfb3ccc-0ab5-4186-a249-b279bfc09587","columnNames":["USERID","NAME"],"columnTypes":["STRING","STRING"]}
["1","Max"]
["2","Alex"]
["13","Andrew"]
...
Is there a way I could get the data in json format?
{"userid":"1","name":"Max"}
{"userid":"2","name":"Alex"}
{"userid":"13","name":"Andrew"}
It is easier to deserialize this data into POCO objects if they are in json than to parse the 'row' format.
Per the docs you can set the Accept header. It defaults to application/vnd.ksqlapi.delimited.v1 but can also be set to application/json:
curl --show-error --silent \
-H "application/vnd.ksqlapi.delimited.v1" \
--http2 'http://localhost:8088/query-stream' \
--data-raw '{"sql":"SELECT * FROM CUSTOMERS WHERE ID=42;"}'
{"queryId":null,"columnNames":["ID","FIRST_NAME","LAST_NAME","EMAIL","GENDER","COMMENTS"],"columnTypes":["INTEGER","STRING","STRING","STRING","STRING","STRING"]}
[42,"Rick","Astley","r.astley#example.com","Male",""]
curl --show-error --silent \
-H "Accept:application/json" \
--http2 'http://localhost:8088/query-stream' \
--data-raw '{"sql":"SELECT * FROM CUSTOMERS WHERE ID=42;"}'
[{"queryId":null,"columnNames":["ID","FIRST_NAME","LAST_NAME","EMAIL","GENDER","COMMENTS"],"columnTypes":["INTEGER","STRING","STRING","STRING","STRING","STRING"]},[42,"Rick","Astley","r.astley#example.com","Male",""]]

Request using Curl (Windows 10) in Matlab gives error message

I am sending a curl command to a server, but get an error message which I do not understand.
The request I need to send to the server is
body=$(cat << EOF
{
"order": {
"units": "100",
"instrument": "EUR_USD",
"timeInForce": "FOK",
"type": "MARKET",
"positionFill": "DEFAULT"
}
}
EOF
)
curl \
-X POST \
-H "Content-Type: application/json" \
-H "Authorization: Bearer TOKEN>" \
-d "$body" \
"https://api-fxtrade.oanda.com/v3/accounts/<ACCOUNT>/orders"
What I do is that I translate this into a curl command like :
curlcmd = 'curl -s \ -X POST \ -H "Content-Type: application/json" \ -H "Authorization: Bearer " \ -d "{"order": {"units": "100", "instrument": "EUR_USD", "timeInForce": "FOK", "type": "MARKET", "positionFill": "DEFAULT" }}" \ "https://api-fxpractice.oanda.com/v3/accounts/AccountID/orders"'
I send the command via resp = system (curlcmd) via Matlab to the server. What I get as an error message is :
errorMessage: 'Invalid JSON, ParseErrorCode: 4, Message: Missing a name for object member.'
Any idea what this means and how I can solve this ? I am using Matlab on Windows 10, so curl is part of Windows 10.
Response should be a placed order and response data of the trade.
The JSON doesn't seem to be properly quoted.
Try this:
curl -s -X POST -H "Content-Type: application/json" -H "Authorization: Bearer " -d "{\"order\": {\"units\": \"100\", \"instrument\": \"EUR_USD\", \"timeInForce\": \"FOK\", \"type\": \"MARKET\", \"positionFill\": \"DEFAULT\" }}" "https://api-fxpractice.oanda.com/v3/accounts/AccountID/orders"
Test with Proxy
With the appropriate escape of the JSON quotes, as shown in the above CURL command line, the JSON looks correct when viewed in an HTTPS proxy:

Alamofire with -d

I need to make request like this Postman one, but in Alamofire
curl -X DELETE \
http://someUrl \
-H 'authorization: JWT someToken' \
-H 'cache-control: no-cache' \
-H 'content-type: application/x-www-form-urlencoded' \
-H 'postman-token: 0149ef1e-5d45-34ce-3344-4b658f01bd64' \
-d id=someId
I guess it should be something like:
let headers = ["Content-Type": "application/x-www-form-urlencoded", "Authorization": "JWT someToken"]
let params: [String: Any] = ["id": "someId"]
Alamofire.request("http://someUrl", method: .delete, parameters: params, headers: headers).validate().responseJSON { responseJSON in
switch responseJSON.result {
case .success( _):
let data = responseJSON.result.value!
print(data)
case .failure(let error):
print(error.localizedDescription)
}
}
How can I check that my request has option like this from cUrl - -d id=someId
You do this:
Alamofire.request("http://someUrl", method: .delete, parameters: params, headers: headers).validate().responseJSON { ... }
In fact, it can be deconstruct like that:
let request = Alamofire.request("http://someUrl", method: .delete, parameters: params, headers: headers)
request.validate().responseJSON { ... }
request is a DataRequest, which inherits from Request which has a pretty override of debugDescription that calls curlRepresentation().
If you print request, you'll have:
$> CredStore - performQuery - Error copying matching creds. Error=-25300, query={
atyp = http;
class = inet;
"m_Limit" = "m_LimitAll";
ptcl = http;
"r_Attributes" = 1;
sdmn = someUrl;
srvr = someUrl;
sync = syna;
}
$ curl -v \
-X DELETE \
-H "Accept-Encoding: gzip;q=1.0, compress;q=0.5" \
-H "User-Agent: iOSTest/1.0 (nt.iOSTest; build:1; iOS 11.4.0) Alamofire/4.7.3" \
-H "Accept-Language: en;q=1.0, fr-FR;q=0.9" \
"http://someUrl?id=someId"
Pretty cool, right? But no -d option. You can even check it with print(request.request.httpBody) and get:
$> nil
To fix it, use the encoding (ParameterEncoding) parameter in the init. You can use by default JSONEncoding, URLEncoding and PropertyListEncoding.
But you want to put the parameter in the httpBody, so use URLEncoding(destination: .httpBody):
Alamofire.request("http://someUrl", method: .delete, parameters: params, encoding: URLEncoding(destination: .httpBody), headers: headers)
And you'll get:
$>CredStore - performQuery - Error copying matching creds. Error=-25300, query={
atyp = http;
class = inet;
"m_Limit" = "m_LimitAll";
ptcl = http;
"r_Attributes" = 1;
sdmn = someUrl;
srvr = someUrl;
sync = syna;
}
$ curl -v \
-X DELETE \
-H "Authorization: JWT someToken" \
-H "User-Agent: iOSTest/1.0 (nt.iOSTest; build:1; iOS 11.4.0) Alamofire/4.7.3" \
-H "Accept-Language: en;q=1.0, fr-FR;q=0.9" \
-H "Content-Type: application/x-www-form-urlencoded" \
-H "Accept-Encoding: gzip;q=1.0, compress;q=0.5" \
-d "id=someId" \
"http://someUrl"

How to set a related object using HATEOAS?

I fail to consume a restful API with HATEOAS links generated from springboot repositories.
Consider the following model:
public class Order {
private UUID id;
private String orderNumber;
private Location location;
}
public class Location {
private String street;
private String town;
}
Just for the sake of readability I left out any boilerplate code such as getters, setters and constructors.
After starting the service, I created an empty Order, that I can query like:
>curl http://localhost:8080/orders/1
Which returns:
{
"orderNumber": "ON 0815",
"_links": {
"self": {
"href": "http://localhost:8080/orders/1"
},
"location": {
"href": "http://localhost:8080/orders/1/location"
}
}
}
Now if i call curl http://localhost:8080/orders/1/location, it returns HTTP 404 - Not found, which is reasonable, because I didn't set that yet.
Next I create the Location to set via HTTP POST:
curl -XPOST http://localhost/8080/locations \
-H 'Content-Type: application/json' \
-d '{"street": "Bakerstreet 221B", "town": "London"}'
The service answers with:
{
"street": "Bakerstreet 221B",
"town": "London",
"_links": {
"self": {
"href": "http://localhost:8080/locations/1"
}
}
}
Now we get to the point, I am stuck at. How do I link the Location to the Order? None of my attempts worked out. I'd be grateful for any advice.
So far I tried:
1. PUT the object
>curl -XPUT http://localhost:8080/orders/1 \
-H 'Content-Type: application/json' \
-d '{"orderNumber": "ON 0815", "_links": {"self": {"href": "http://localhost:8080/orders/1"}, "location": {"href": "http://localhost:8080/orders/1/location"}}}'
2. PATCH the object
>curl -XPATCH http://localhost:8080/orders/1 \
-H 'Content-Type: application/json' \
-d '{"_links": {"self": {"href": "http://localhost:8080/orders/1"}, "location": {"href": "http://localhost:8080/orders/1/location"}}}'
3. POST to the link
>curl -XPOST http://localhost:8080/orders/1/location \
-H 'Content-Type: application/json' \
-d '{"street": "Bakerstreet 221B", "town": "London"}'
Management Summary
>curl -XPUT http://localhost:8080/orders/1/location \
-H "Content-Type: text/uri-list" \
-d "http://localhost:8080/location/1"
Detailed Description
If I call the nested location uri with a -I flag and a forbidden method, the allowed methods are listed.
>curl -I -XPOST http://localhost:8080/orders/1/location \
-H 'Content-Type: application/json'
HTTP/1.1 405
Allow: GET,PUT,PATCH,DELETE
Content-Length: 0
Date: Mon, 29 Oct 2018 08:59:19 GMT
This means a PUT on this url must be valid. Putting on this url with an empty body yields:
>curl -XPUT http://localhost:8080/orders/1/location \
-H 'Content-Type: application/json' \
-d '{}'
{"cause":null,"message":"Must send only 1 link to update a property reference that isn't a List or a Map."}
After searching for this message, I found, that my Content-Type was wrong. I need to use Content-Type: text/uri-list and add the url of the location to set as body.
>curl -XPUT http://localhost:8080/orders/1/location \
-H "Content-Type: text/uri-list" \
-d "http://localhost:8080/location/1"