Post List <int> in http Flutter - json

I want to send a data like this :
{
"ad_title": "test",
"year": "2019",
"class": "Highline",
"files": [ 212]
}
To api in flutter. I tried to do that
var data = {
"year": selectedYear,
"class": _classController.text.toString(),
"files": json.encode(carfilesids),
};
final response = await http.post(url, body: data,headers:
{'Accept': 'application/json'});
However there's no errors in run time and when I print the value of json.encoder.convert(carfilesids) it gives me List, I got a response status code of 422 and it tells me " {"message":"The given data was invalid.","errors":{"files":["The files must be an array."]}} ". I also tried to json.encode the whole data but it goes wrong with the other data attributes.

You must use jsonEncode on your map, or else the http package will treat it as form data.
From the documentation:
If body is a Map, it's encoded as form fields using encoding. The content-type of the request will be set to "application/x-www-form-urlencoded"; this cannot be overridden.

final response = await http.post(url,
body: {
"ad_title": "test",
"year": "2019",
"class": "Highline",
"files": [ 212 ]
},
headers: {
'Accept': 'application/json'
}
);

Related

Nested JSON on WireMock Response

Is there any way to dynamically include JSON from the request body in the response?
Input Request
{
"id":"1234",
"message":"{\"key\":\"value\"}"
}
Expected Output
{
"status":"CREATED",
"id":"1234",
"message":"{\"key\":\"value\"}"
}
The message and id fields are dynamic and need to be picked from the request.
I have tried the below mapping to dynamically load the response from the request but \" inside message json is converted to "
{
"request": {
"method": "POST",
"urlPath": "/test"
},
"response": {
"status": 200,
"transformers": [
"response-template"
],
"jsonBody": {
"status": "CREATED",
"id": "{{jsonPath request.body '$.id'}}",
"message": "{{jsonPath request.body '$.message'}}"
}
}
}
This returns message as {"key":"value"}.
Even, I have tried changing the mapping to {{{jsonPath request.body '$.message'}}}. But this messes up the whole response json and message value is being returned as "{"key":"value"}" without escape characters.
I'm looking for suggestions to map message dynamically. Thanks in advance.

Upload data to server Retrofit 2

i use com.github.ChiliLabs:ChiliPhotoPicker:0.3.1 to select photos to upload. It gives me such a path to the photo
file:///storage/emulated/0/KatePhotos/1641933129.jpg
my code for uploading the image to the server
fun formData(uri: ArrayList<Uri>) {
// Create Retrofit
val retrofit = Retrofit.Builder()
.baseUrl("https://httpbin.org")
.build()
// Create Service
val service = retrofit.create(APIService::class.java)
// List of all MIME Types you can upload: https://www.freeformatter.com/mime-types-list.html
// Get file from assets folder
val imgFile = File(uri[0].path)
val fields: HashMap<String?, RequestBody?> = HashMap()
fields["email"] = ("test#test.com").toRequestBody("text/plain".toMediaTypeOrNull())
val filename = imgFile.name
fields["file\"; filename=\"$filename\" "] =
(imgFile).asRequestBody("image/*".toMediaTypeOrNull())
CoroutineScope(Dispatchers.IO).launch {
// Do the POST request and get response
val response = service.uploadEmployeeData(fields)
withContext(Dispatchers.Main) {
if (response.isSuccessful) {
// Convert raw JSON to pretty JSON using GSON library
val gson = GsonBuilder().setPrettyPrinting().create()
val prettyJson = gson.toJson(
JsonParser.parseString(
response.body()
?.string() // About this thread blocking annotation : https://github.com/square/retrofit/issues/3255
)
)
println(prettyJson)
} else {
Log.e("RETROFIT_ERROR", response.code().toString())
}
}
}
}
The problem is that when I use decoding on the server, I only get a piece of the image. Tell me what I'm doing wrong and how can I fix it?
Its my response:
{
"args": {},
"data": "",
"files": {
"file": "data:image/*;base64,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
},
"form": {
"email": "test#test.com"
},
"headers": {
"Accept-Encoding": "gzip",
"Content-Length": "387553",
"Content-Type": "multipart/form-data; boundary\u003da3942d3b-e13b-43de-9abd-642750914c37",
"Host": "httpbin.org",
"User-Agent": "okhttp/4.9.0",
"X-Amzn-Trace-Id": "Root\u003d1-61ddfc53-4b83816821e2302e6f2b8951"
},
"origin": "",
"url": "https://httpbin.org/post"
}
and so I see what php saves, even notepad considers it to be text.
In decode i see

Not a valid json request, from DolphinDB JSON API

I'm trying the JSON API provided by DolphinDB, following this tutorial.
And I tried the code snippet like this:
var code = "1+2";
code = encodeURIComponent(code);
paramJson = {
"sessionID": "942605602",
"functionName": "executeCode",
"params": [{
"name": "script",
"form": "scalar",
"type": "string",
"value": code
}]
}
var option = {
url: "http://localhost:9920",
async: true,
data: paramJson,
type: "POST",
dataType: "json",
success: function (data) {
var resultJson = data;
console.log(data);
}
}
$.ajax(option);
Here is the log I got from chrome:
{sessionID: "800870454", userId: "", resultCode: "1", msg: "not a valid json request [sessionID=942605602&func…type%5D=string&params%5B0%5D%5Bvalue%5D=1%252B2].", object: Array(0)}msg: "not a valid json request [sessionID=942605602&functionName=executeCode&params%5B0%5D%5Bname%5D=script&params%5B0%5D%5Bform%5D=scalar&params%5B0%5D%5Btype%5D=string&params%5B0%5D%5Bvalue%5D=1%252B2]."object: []resultCode: "1"sessionID: "800870454"userId: ""__proto__: Object
It report not a valid json request, but I don't know what's wrong with my request.
You can try serializing JSON objects before sending requests
data = JSON.stringify(paramJson)

How to Retrieve (not create) Tasks from Asana using Apps Script & Personal Access Token

I am attempting to retrieve, but not create, tasks from Asana using Google Apps Script.
Using the Asana API Explore, I have constructed a URL that returns the data I desire: https://app.asana.com/api/1.0/tasks?opt_fields=name,assignee_status&assignee=987654321987654&completed_since=2018-02-22&limit=100&workspace=456789123456
This URL returns the desired data, in the following format:
{
"data": [
{
"id": 147258369147258,
"assignee_status": "inbox",
"name": "An example task name"
},
{
"id": 963852741963852,
"assignee_status": "upcoming",
"name": "And second example task name."
},
//etc...
]
}
With that URL as a model, I have created a Personal Access Token and executed the following function within Apps Script:
function getTasks5() {
// Asana Personal Token
var bearerToken = "Bearer " + "asdf123456789asdf456789456asdf";
//Request
var request = {
data: {
opt_fields: ["name", "assignee_status"],
assignee: "987654321987654",
completed_since: "2018-02-22",
limit: "100",
workspace: "456789123456"
}
};
// Request options
var options = {
method: "GET",
headers: {
"Authorization": bearerToken
},
contentType: "application/json",
payload: JSON.stringify(request)
};
var url = "https://app.asana.com/api/1.0/tasks";
var result = UrlFetchApp.fetch(url, options);
var reqReturn = result.getContentText();
Logger.log(reqReturn);
}
Instead of returning the desired data as the aforementioned URL does, the function creates an unnamed task in Asana, which is undesirable. It also returns this response containing undesired data:
{
"data": {
"id": 123456789123456,
"created_at": "2018-02-22T20:59:49.642Z",
"modified_at": "2018-02-22T20:59:49.642Z",
"name": "",
"notes": "",
"assignee": {
"id": 987654321987654,
"name": "My Name Here"
},
"completed": false,
"assignee_status": "inbox",
"completed_at": null,
"due_on": null,
"due_at": null,
"projects": [],
"memberships": [],
"tags": [],
"workspace": {
"id": 456789123456,
"name": "Group Name Here"
},
"num_hearts": 0,
"num_likes": 0,
"parent": null,
"hearted": false,
"hearts": [],
"followers": [
{
"id": 987654321987654,
"name": "My Name Here"
}
],
"liked": false,
"likes": []
}
}
Is it possible to simply GET a list of tasks in the manner exemplified by my first JSON example above without creating a task, and without resorting to using OAuth? If so, what changes to the Apps Script function need to be made?
Alright, the problem was with the approach I was taking. Rather than format the request with a payload (which infers a POST request), I needed to structure it more traditionally as a GET request, like so:
var requestUrl = "https://app.asana.com/api/1.0/tasks?opt_fields=name,assignee_status&assignee=123456789123&completed_since=2018-02-22&limit=100&workspace=987654321987";
var headers = {
"Authorization" : "Bearer " + AUTH_TOKEN
};
var reqParams = {
method : "GET",
headers : headers,
muteHttpExceptions: true
};
Then I was able to perform:
UrlFetchApp.fetch(requestUrl, reqParams);
And obtain the data I was after.

Use API's URL to receive json

I am accessing the api of world weather online. I have configured the url and it is displayed below-
http://api.worldweatheronline.com/premium/v1/marine.ashx?key=XXXXXXXXXXXXXXXX&q=-34.48,150.92&format=json
Note: my API key is displayed as XXXXXXXXXXXX and this is returning the following:
{
"data": {
"request": [],
"weather": [
{
"date": "2016-11-20",
"astronomy": [],
"maxtempC": "27",
"maxtempF": "80",
"mintempC": "15",
"mintempF": "58",
"hourly": [
{
"time": "0",
"tempC": "15",
...
I want to GET this json in JS and then log the value of TempC.
How can this be done?
The simplest way would be using request. You can install it with npm install request
const request = require('request')
const apiKey = 'XXXXXXXX'
let url = 'http://api.worldweatheronline.com/premium/v1/marine.ashx'
let qs = {
q: '-34.48,150.92',
format: 'json',
key: apiKey
}
request({ url, qs }, (err, response, body) => {
if (err)
return console.error(err)
if (response.statusCode != 200)
return console.error('status:', response.statusCode, body)
body = JSON.parse(body)
console.log(body.data.weather[0].hourly[0].tempC)
})