Powershell HTTPIE - api

I'm trying to POST the following but I keep getting an error:
"http: error: argument REQUEST_ITEM: "with" is not a valid value"
http POST https://someurl.com fields:='{\"example-api-identifier\":\"String with spaces\"}' Token:randomnumbers
How do I escape these spaces? I'm assuming that's the issue here?

I don't personally know about powershell, but httpie should be fine with spaces without needing the := syntax
$ http POST http://httpbin.org/post example-api-identifier="String with spaces"
yields
HTTP/1.1 200 OK
Access-Control-Allow-Credentials: true
Access-Control-Allow-Origin: *
Connection: close
Content-Length: 413
Content-Type: application/json
Date: Sat, 01 Feb 2020 00:25:41 GMT
Server: gunicorn/19.9.0
{
"args": {},
"data": "{\"example-api-identifier\": \"String with spaces\"}",
"files": {},
"form": {},
"headers": {
"Accept": "application/json, */*",
"Accept-Encoding": "gzip, deflate",
"Connection": "keep-alive",
"Content-Length": "48",
"Content-Type": "application/json",
"Host": "httpbin.org",
"User-Agent": "HTTPie/1.0.0"
},
"json": {
"example-api-identifier": "String with spaces"
},
"origin": "127.0.0.1",
"url": "http://httpbin.org/post"
}

Related

How to configure Krakend so it return http redirect response as-is instead of following the http redirect?

I am currently using Krakend (https://krakend.io) API Gateway to proxy request to my backend service. One of my backend service API response is a redirect response with http 303. The redirect response looks like this below :
HTTP/1.1 303 See Other
content-length: 48
content-type: text/plain; charset=utf-8
date: Thu, 16 Jul 2020 10:25:41 GMT
location: https://www.detik.com/
vary: Accept
x-powered-by: Express
x-envoy-upstream-service-time: 17
server: istio-envoy
The problem is that, instead of returning the http 303 response to client (with location response header) as-is, Krakend is actually following the http redirect and return the response of the redirect Url, which is the html response of https://www.detik.com/.
My current krakend configuration looks like this below :
{
"version": 2,
"extra_config": {
"github_com/devopsfaith/krakend-cors": {
"allow_origins": [],
"expose_headers": [
"Content-Length",
"Content-Type",
"Location"
],
"allow_headers": [
"Content-Type",
"Origin",
"X-Requested-With",
"Accept",
"Authorization",
"secret",
"Host"
],
"max_age": "12h",
"allow_methods": [
"GET",
"POST",
"PUT"
]
},
"github_com/devopsfaith/krakend-gologging": {
"level": "ERROR",
"prefix": "[GATEWAY]",
"syslog": false,
"stdout": true,
"format": "default"
},
"github_com/devopsfaith/krakend-logstash": {
"enabled": false
}
},
"timeout": "10000ms",
"cache_ttl": "300s",
"output_encoding": "json",
"name": "api-gateway",
"port": 8080,
"endpoints": [
{
"endpoint": "/ramatestredirect",
"method": "GET",
"extra_config": {},
"output_encoding": "no-op",
"concurrent_calls": 1,
"backend": [
{
"url_pattern": "/",
"encoding": "no-op",
"sd": "static",
"extra_config": {},
"method": "GET",
"host": [
"http://ramatestredirect.default.svc.cluster.local"
],
"disable_host_sanitize": false
}
]
}
]
}
So how can I make krakend to return original http 303 response unaltered from my backend service to the client ?
Thank You
I assume that you're calling this endpoint /ramatestredirect
To get backend http status code (as you said it return 303 http status code), you can use this way:
{
"endpoint": "/ramatestredirect",
"method": "GET",
"extra_config": {},
"output_encoding": "no-op",
"concurrent_calls": 1,
"backend": [
{
"url_pattern": "/",
"encoding": "no-op",
"sd": "static",
"extra_config": {
"github.com/devopsfaith/krakend/http": {
"return_error_details": "authentication"
}
},
"method": "GET",
"host": [
"http://ramatestredirect.default.svc.cluster.local"
],
"disable_host_sanitize": false
}
]
}
So, basically with this plugin you can get the original backend http status code
"github.com/devopsfaith/krakend/http": {
"return_error_details": "authentication"
}
If you use Lura Framework (formerly known as Kraken framework), then you may have to disable redirects for your http client.
client := &http.Client{
CheckRedirect: func(req *http.Request, via []*http.Request) error {
return http.ErrUseLastResponse
},
}

Why using axios to get public object on AWS S3 is returning empty data?

When I use curl it comes without any trouble:
time curl -vvv https://antivirus-static.s3.amazonaws.com/pt_BR/terms-of-use-app.txt -H "Accept: application/json, text/plain, */*" -H "maxContentLength: -1"
* Trying 52.216.24.116...
* TCP_NODELAY set
* Connected to antivirus-static.s3.amazonaws.com (52.216.24.116) port 443 (#0)
* Initializing NSS with certpath: sql:/etc/pki/nssdb
* CAfile: /etc/pki/tls/certs/ca-bundle.crt
CApath: none
* ALPN/NPN, server did not agree to a protocol
* SSL connection using TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
* Server certificate:
* subject: CN=*.s3.amazonaws.com,O="Amazon.com, Inc.",L=Seattle,ST=Washington,C=US
* start date: Nov 09 00:00:00 2019 GMT
* expire date: Mar 12 12:00:00 2021 GMT
* common name: *.s3.amazonaws.com
* issuer: CN=DigiCert Baltimore CA-2 G2,OU=www.digicert.com,O=DigiCert Inc,C=US
> GET /pt_BR/terms-of-use-app.txt HTTP/1.1
> Host: antivirus-static.s3.amazonaws.com
> User-Agent: curl/7.60.0
> Accept: application/json, text/plain, */*
> maxContentLength: -1
>
< HTTP/1.1 200 OK
< x-amz-id-2: sLTO+j2y3cmR/c/HRJrdTjmG17nL1fiDcczoJ/kb8CEs0ddZaSQUa1B+MJOHk1K65C/vExHTTi0=
< x-amz-request-id: 4A97D68F2C42E0E2
< Date: Thu, 21 May 2020 19:01:21 GMT
< Last-Modified: Wed, 20 May 2020 15:48:28 GMT
< ETag: "69d0be51e21257480ac0098fd7843d5f"
< Accept-Ranges: bytes
< Content-Type: text/plain
< Content-Length: 16157
< Server: AmazonS3
<
Termos e Condi�es de Uso
1. INTRODU�O E DISPOSI�ES GERAIS
1.1. Estes Termos e Condi�es de Uso ("Termos") regem o acesso e uso por toda ...
But when I do the same request with axios, an empty data is returned:
{"config": {"adapter": [Function xhrAdapter], "baseURL": "https://antivirus-static.s3.amazonaws.com/", "data": undefined, "headers": {"Accept": "application/json, text/plain, */*"}, "maxContentLength": -1, "method": "get", "timeout": 0, "transformRequest": [[Function transformRequest]], "transformResponse": [[Function transformResponse]], "url": "/pt_BR/terms-of-use-app.txt", "validateStatus": [Function validateStatus], "xsrfCookieName": "XSRF-TOKEN", "xsrfHeaderName": "X-XSRF-TOKEN"}, "data": "", "headers": {"accept-ranges": "bytes", "content-length": "16157", "content-type": "text/plain", "date": "Thu, 21 May 2020 18:29:33 GMT", "etag": "\"69d0be51e21257480ac0098fd7843d5f\"", "last-modified": "Wed, 20 May 2020 15:48:28 GMT", "server": "AmazonS3", "x-amz-id-2": "On0uiUG3e2CpvNu/SmMFjTefCuOABMreBngxsU0hXw9wo7rRXqLOKf1X82QzTm1g9s/wSEMox5I=", "x-amz-request-id": "E7C1A12F77B537BA"}, "request": {"DONE": 4, "HEADERS_RECEIVED": 2, "LOADING": 3, "OPENED": 1, "UNSENT": 0, "_aborted": false, "_cachedResponse": undefined, "_hasError": false, "_headers": {"accept": "application/json, text/plain, */*"}, "_incrementalEvents": false, "_lowerCaseResponseHeaders": {"accept-ranges": "bytes", "content-length": "16157", "content-type": "text/plain", "date": "Thu, 21 May 2020 18:29:33 GMT", "etag": "\"69d0be51e21257480ac0098fd7843d5f\"", "last-modified": "Wed, 20 May 2020 15:48:28 GMT", "server": "AmazonS3", "x-amz-id-2": "On0uiUG3e2CpvNu/SmMFjTefCuOABMreBngxsU0hXw9wo7rRXqLOKf1X82QzTm1g9s/wSEMox5I=", "x-amz-request-id": "E7C1A12F77B537BA"}, "_method": "GET", "_requestId": null, "_response": "", "_responseType": "", "_sent": true, "_subscriptions": [], "_timedOut": false, "_trackingName": "unknown", "_url": "https://antivirus-static.s3.amazonaws.com/pt_BR/terms-of-use-app.txt", "readyState": 4, "responseHeaders": {"Accept-Ranges": "bytes", "Content-Length": "16157", "Content-Type": "text/plain", "Date": "Thu, 21 May 2020 18:29:33 GMT", "ETag": "\"69d0be51e21257480ac0098fd7843d5f\"", "Last-Modified": "Wed, 20 May 2020 15:48:28 GMT", "Server": "AmazonS3", "x-amz-id-2": "On0uiUG3e2CpvNu/SmMFjTefCuOABMreBngxsU0hXw9wo7rRXqLOKf1X82QzTm1g9s/wSEMox5I=", "x-amz-request-id": "E7C1A12F77B537BA"}, "responseURL": "https://antivirus-static.s3.amazonaws.com/pt_BR/terms-of-use-app.txt", "status": 200, "timeout": 0, "upload": {}, "withCredentials": true}, "status": 200, "statusText": undefined}
On my code, I'm already placing things inside the promise callback:
var element = this;
axios.create({
baseURL: "https://antivirus-static.s3.amazonaws.com/",
headers: {}
}).get('/pt_BR/terms-of-use-app.txt')
.then(function (response) {
console.log(response);
element.setState({agree_terms_text: response.data, init: 1});
})
.catch(function (error) {
console.error(error);
element.setState({agree_terms_text: "Error loading terms", init: 1});
})
.then(function () {
console.log("requested terms-of-use-app.txt");
});
Inside the render():
{this.state.init == 0 ? <IndicatorMessage label={translate('loading_terms')} /> : <AgreeTerms>{this.state.agree_terms_text}</AgreeTerms>}
Should I use axios differently to request public objects from AWS S3? Am I missing something on how to use axios?
The problem had nothing to do with AWS specifically. The server was responding a UTF-8 encoded file, but the file was actually encoded in Latin1.
So I converted the file with iconv, and it worked.

INVALID_OPERATION error while creating a Session in Klarna

I am a beginner with Klarna and am trying to get started.
Using Postman, I am trying to create a Session by doing a POST to https://api-na.playground.klarna.com/payments/v1/sessions.
I am using HTTP Basic Auth.
Below is a Request & Response.
Can you help me figure out what I am doing wrong.
Request Headers:
Accept: */*
Klarna-Correlation-Id: 45021dd4-b216-417a-a8e7-85f2447a936d
User-Agent: PostmanRuntime/7.4.0
Host: api-na.playground.klarna.com
Accept-Encoding: gzip, deflate
Content-Length: 495
Content-Type: application/json
Request Body (with test data):
{
"purchase_country": "us",
"purchase_currency": "usd",
"locale": "en-US",
"order_amount": 1000,
"order_tax_amount": 0,
"order_lines": [
{
"type": "physical",
"reference": "19-402-USA",
"name": "Battery Power Pack",
"quantity": 1,
"unit_price": 1000,
"tax_rate": 0,
"total_amount": 1000,
"total_discount_amount": 0,
"total_tax_amount": 0
}
]
}
Response:
{
"error_code": "INVALID_OPERATION",
"error_messages": [
""
],
"correlation_id": "45021dd4-b216-417a-a8e7-85f2447a936d"
}

BigCommerce Create Shipment - no response

I am coding a API to create shipments on Big Commerce.
I am getting responses from the 'Get' URL's - I just can't seem to get the API to respond on the 'PUT'
I fired up a 'Web Responder' and it returns the following:
The tokens etc are moved for security.
Header:
{
"VERSION": "HTTP/1.1",
"CONNECTION": "close",
"ACCEPT-ENCODING": "gzip",
"CONTENT-TYPE": "application/json",
"AUTHORIZATION": "Bearer ---------------------",
"X-AUTH-CLIENT": "======================",
"X-AUTH-TOKEN": "=========================",
"ACCEPT": "application/json;",
"ACCEPT-CHARSET": "UTF-8;",
"USER-AGENT": "West Wind Internet Protocols 5.56",
"CACHE-CONTROL": "no-cache",
"COOKIE": "__cfduid=dfebfa0729eeaf50601b1fe187807c6fc1529278210; owner_token=cdc79c402c05c15d01ce0996dcc40654e3a0fe75a256eae3",
"CONTENT-LENGTH": "171"
}
The 'PUT' has:
PUT /b7ezoY2bqq2DKg0soyMy
{
"tracking_number": "PBT0000124",
"comments": "Shipped by PBT",
"order_address_id": 392,
"shipping_provider": "",
"items": [
{
"order_product_id": 1540,
"quantity": 1
}
]
}
As far as I can tell, all the details are correct. I just get no response. Please not this is a 'Desktop' application - not a Website.
Any clues?

Axios Request Does Not Return a Token

i'm trying to apply token for my request. So i tried to console.log the result of the request, and cannot find any token there inside the object array.
Object {
"config": Object {
"adapter": [Function xhrAdapter],
"data": "ktp=3578270708950002&member=199508070003",
"headers": Object {
"Accept": "application/json, text/plain, */*",
"Content-Type": "application/x-www-form-urlencoded",
},
"maxContentLength": -1,
"method": "post",
"timeout": 0,
"transformRequest": Object {
"0": [Function transformRequest],
},
"transformResponse": Object {
"0": [Function transformResponse],
},
"url": "http://103.53.10.122/mobile/LoginCheck.php",
"validateStatus": [Function validateStatus],
"xsrfCookieName": "XSRF-TOKEN",
"xsrfHeaderName": "X-XSRF-TOKEN",
},
"data": Array [
Object {
"status": "67457",
},
],
"headers": Object {
"connection": "keep-alive",
"content-type": "text/html; charset=UTF-8",
"date": "Fri, 22 Dec 2017 05:38:21 GMT",
"server": "nginx",
"transfer-encoding": "chunked",
"vary": "Accept-Encoding",
},
"request": XMLHttpRequest {
"DONE": 4,
"HEADERS_RECEIVED": 2,
"LOADING": 3,
"OPENED": 1,
"UNSENT": 0,
"_aborted": false,
"_cachedResponse": undefined,
"_hasError": false,
"_headers": Object {
"accept": "application/json, text/plain, */*",
"content-type": "application/x-www-form-urlencoded",
},
"_incrementalEvents": false,
"_lowerCaseResponseHeaders": Object {
"connection": "keep-alive",
"content-type": "text/html; charset=UTF-8",
"date": "Fri, 22 Dec 2017 05:38:21 GMT",
"server": "nginx",
"transfer-encoding": "chunked",
"vary": "Accept-Encoding",
},
"_method": "POST",
"_requestId": null,
"_response": "[{\"status\":\"67457\"}]",
"_responseType": "",
"_sent": true,
"_subscriptions": Array [],
"_timedOut": false,
"_trackingName": "unknown",
"_url": "http://103.53.10.122/mobile/LoginCheck.php",
"readyState": 4,
"responseHeaders": Object {
"Connection": "keep-alive",
"Content-Type": "text/html; charset=UTF-8",
"Date": "Fri, 22 Dec 2017 05:38:21 GMT",
"Server": "nginx",
"Transfer-Encoding": "chunked",
"Vary": "Accept-Encoding",
},
"responseURL": "http://103.53.10.122/mobile/LoginCheck.php",
"status": 200,
"timeout": 0,
"upload": XMLHttpRequestEventTarget {},
"withCredentials": true,
},
"status": 200,
"statusText": undefined,
}
Can someone point me how to add token to authenticate, because i'm still confuse about the concept even after reading it. So if i'm not mistaken, i should do the following in order:
Generate the token when user successfully login
Save the token in local storage
Use the token for each request (How does the backend check the validity of the token?)
Any help would be appreciated
Depending on the way the backend handles API requests you should either use axios.get and append the token to the URL or use axios.post and pass a object as body to the method with your token.
E.g.
axios.post('http://103.53.10.122/mobile/LoginCheck.php', {
username: "test",
password: "1234"
})
.then((res) => {
console.log(res);
/*
In this example I assume that res.data has the token returned from the backend
The res.data should look like this then:
{
token: "1234"
}
*/
let token = res.data.token;
AsyncStorage.setItem("token", token);
})
.catch((err) => {
console.log(err);
});
To use the token for each request save it in AsyncStorage for persistent storage or in the redux state if you are using redux.
On the server side you could generate a JSON web token which contains all data you need for authenticating the user and validating it with the data stored in a database. Due to the fact that you are using PHP I can recommend you this introduction to JSON web tokens in combination with PHP: https://www.sitepoint.com/php-authorization-jwt-json-web-tokens/