Hi everyone
Having some trouble with a Marketo Bulk API job. Here's the Python code:
# marketo params
parameters = {
'format': 'csv',
'access_token': access_token,
'createdAt': '{"startAt": "2020-02-15T23:59:59-00:00","endAt": "2020-02-26T23:59:59-00:00"}',
'activityTypeIds': '[113]'
}
headers = {'accept': 'application/json'}
# first call
response = requests.post(
"https://(redacted).mktorest.com/bulk/v1/activities/export/create.json",
params=parameters,
headers=headers
)
The error I get is 612 - invalid content type. This is a little confusing to me though. I'm not uploading a multipart file or anything, so shouldn't it be regular application/json?
Thanks.
Solved! Go to Solution.
Yes, when you POST JSON, the request Content-Type should be application/json.
So make sure you've set that header! Or use json=payload, which sets it automatically.
Note the way you're mixing params and body is pretty confusing, even if some Marketo API endpoints accept this mixture it's not advisable.
Yes, when you POST JSON, the request Content-Type should be application/json.
So make sure you've set that header! Or use json=payload, which sets it automatically.
Note the way you're mixing params and body is pretty confusing, even if some Marketo API endpoints accept this mixture it's not advisable.
Weird. Just tried in Postman, with these details:
https://(redacted).mktorest.com/bulk/v1/activities/export/create.json?format=csv&access_token=(redacted)&createdAt={ "startAt": "2020-02-15T23:59:59-00:00","endAt": "2020-02-26T23:59:59-00:00"}&activityTypeIds=[113]
Header is:
Content-Type: application/json
And error code is:
{
"requestId": "8c00#1709e393153",
"success": false,
"errors": [
{
"code": "609",
"message": "Required request body content is missing: org.springframework.web.method.HandlerMethod$HandlerMethodParameter@9bfa1393"
}
]
}
Hmmm what am I missing here?
Also, could you elaborate on what you mean by "mixing params and body" in the Python code?
Also, could you elaborate on what you mean by "mixing params and body"
You're passing some parameters in the query string (though apparently not URL-encoding them, which is bound to fail with some values!) yet POSTing other parameters in the JSON body.
You should be putting everything in the body (a.k.a. payload, a.k.a. request body, a.k.a. entity-body). The fact that certain things seem to work when passed in the query string is coincidental. (It's a factor of the way some web servers have a combined "params" object that merges query params, post bodies, HTTP headers, even environment variables and cookies - but isn't supported.)
Ah. But given my initial code was in Python, does't the requests library take care of that? In Postman I see what you mean though, but that was my secondary test.
So much left to learn!
Requests doesn't automatically take care of it.
You still need to pass the right stuff in the body, and set the Content-Type header if you don't expressly use the named json method.
N.B. Almost all HTTP client libraries are like this,. There may be a shortcut method for serializing an object to JSON, and if you use that client method -- one that has "json" in the name -- chances are 99.999% that it'll set the related Content-Type for you.
But there will also be a way to craft your own payload, because you'll need that customizability at times. And when you use that "plain HTTP" method, then the headers are not going to automatically synchronize with the text you happened to use as the payload. After all it is just text at that point!
Take the Fetch API for example. Even though JS is as JSON-friendly as you can get, the default type of a String body is text/plain. Not application/json. Even if you JSON.stringify()-ed an object to get the String, it's text as far as Fetch knows.
Bulk import fails with
curl --location --request POST 'https://asasas.mktorest.com/rest/v1/leads.json?json=payload' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer asasasas:sj' \
--form 'file=@"/Users/asasas/Downloads/All_People.json"'
<center>
<h1>400 Bad Request</h1>
</center>
<hr>
<center>nginx</center>
</body>
The body literally has to be a JSON string -- just getting into using the API myself. Please look at the docs here:
https://developers.marketo.com/rest-api/bulk-extract/bulk-activity-extract/
And the request needs to be submitted as a POST, not GET. This literally worked for me in Postman:
body
----------
{
"format": "CSV",
"filter": {
"createdAt": {
"startAt": "2020-02-01T00:00:00Z",
"endAt": "2020-03-01T00:00:00Z"
},
"acitivyTypeIds": [
113
]
}
}
response
-----------
Correct, that's what I said above. Pls highlight your JSON though.