I'm getting data from an external API source.
Im using this to retrieve my orders
$data = Http::get(
$this->URL .'orders?language=nl_NL&limit=100&format=json&status_changed_start_date='
. $last_poll
. '&ordering=asc&partner_token='.$this->PARTNERKEY.'&token='.$this->MERCHANTTOKEN.''
)->json();
following the guide on the partner site I should use this format to update a specific record.
curl -X PATCH $this->URL ."orders/2?language=nl_NL&format=json&override_minimum=false&override_stock=false&mutate_stock=true&partner_token='.$this->PARTNERKEY.'&token='.$this->MERCHANTTOKEN.'" \
-H "accept: application/json" \
-H "Content-Type: application/json" \
-d "{\"status\":2,\"archived\":true,\"comments\":{\"internal\":\"Owner's commentary\"}}"
How would I implement this within a Laravel controller ?
Use the HTTP Client provide by Laravel:
use Illuminate\Support\Facades\Http;
use Illuminate\Http\Request;
class MyController
{
public function update (Request $request)
{
// Maybe use from $request?
$id = 2;
Http::patch($this->url . "/orders/" . $id, [
'version' => 1,
'order_number' => 2,
'language' => 'nl_NL',
'format' => 'json',
'override_minimum' => false,
// .. put here the other parameters
]);
}
}
Hi Here is my final code.
this seems to be working as I needed
$client = new Client([
// Base URI is used with relative requests
'base_uri' => $this->URL,
]);
$response = $client->request('PATCH', 'orders/' . $item['number'] .'?language=nl_NL&format=json&override_minimum=false&override_stock=false&mutate_stock=true&partner_token='.$this->PARTNERKEY.'&token='.$this->MERCHANTTOKEN, [
'json' => [
'status' => 2,
'archived' => true,
'comments' => ['internal' => $comment]],
]);
Related
I am attempting to do an API call to the following: https://learn.microsoft.com/en-us/partner-center/develop/get-a-price-sheet To get a price sheet for a given market and view. But i can not make it work.
I got a token using https://login.microsoftonline.com/x/oauth2/token
But when I try to call the following API: https://api.partner.microsoft.com/v1.0/sales/pricesheets(Market='be',PricesheetView='updatedlicensebased')/$value
I get a
401, "Unauthorized: Invalid Authorization header"
Can someone give me some advice to what could be the problem? Thanks.
in your POST request to https://login.microsoftonline.com/x/oauth2/token you should use a 'resource' => 'https://api.partner.microsoft.com'.
This PHP code works for me:
public static function getTokenFromCode($code){
$data = array(
'resource' => 'https://api.partner.microsoft.com',
'client_id' => $appId,
'code' => $code,
'redirect_uri' => $redirectURL,
'grant_type' => 'authorization_code',
'client_secret' => $appKey
);
$header = array(
'Accept: application/json',
'return-client-request-id: true',
'Expect: 100-continue'
);
$token = self::callApi("POST", 'https://login.microsoftonline.com/'.$accountId."/oauth2/token", $header, $data);
return $token;
}
public static function getNcePriceList($timeline = "current"){
$header = array(
'Authorization: Bearer '.$token['access_token'],
'Host: api.partner.microsoft.com',
);
return self::callApi("GET", "https://api.partner.microsoft.com/v1.0/sales/pricesheets(Market='DE',PricesheetView='updatedlicensebased')/\$value?timeline=".$timeline, $header);
}
I created a webform handler and it's creating the node and passing all the content appropriately EXCEPT the url in one of the webform fields (the field 'Apply').
Any idea what I am doing wrong? Below is the code for the handler.
class HRJobWebformHandler extends WebformHandlerBase {
public function submitForm(array &$form, FormStateInterface $form_state, WebformSubmissionInterface $webform_submission) {
$values = $webform_submission->getData();
$pos_org = $values['position'] . "-" . $values['organization'];
$node_args = [
'type' => 'job_posting',
'langcode' => 'en',
'created' => time(),
'changed' => time(),
'uid' => 1,
'title' => $pos_org,
'field_salary_information' => $values['salary_information'],
'field_apply' => [
'uri' =>$values['apply']
],
'field_more_information' => $values['more_information'],
'field_position' => $values['position'],
'field_organization' => $values['organization'],
'field_area' => $values['area'],
'field_job' => [
'value' => $values['job_description'],
'format' => 'full_html'
]
];
$node = Node::create($node_args);
$node->setPublished(false);
$node->save();
}
}
Problem solved: Webform was posting the Apply field data as an array (it's a URL field). Code change to UPDATE: Webform post was passing the Apply link as an array. Code changed to:
'uri' =>$values['apply']['url']
This is the curl that I want to execute:
curl -X GET \
-H "X-ABC-Application-Id: 12345asdfg" \
-H "X-ABC-REST-API-Key: 12345asdfg" \
-G \
--data-urlencode "where={ \"SKU\":\"A string\",\"QTY\":1 }" \
example.com/product/inventory
This is what I have tried:
$endpoint = "example.com";
$client = new Client();
$body = ['where' => ['SKU' => 'A string']];
$headers = [
'X-ABC-Application-Id' => '12345asdfg',
'X-ABC-REST-API-Key' => '12345asdfg'
];
$response = $client->get($endpoint, [
'query' => $body,
'headers' => $headers,
]);
$statusCode = $response->getStatusCode();
$content = $response->getBody();
dd($statusCode,$content,$response);
After executing it I got an error (exception) as follows:
400 Bad Request response:
{"code":102,"error":"Invalid parameter for query: 0"}
The misconception is that get() doesn't take headers. You have to pass them by calling withHeaders() before you fire the request and only pass $body directly as the second parameter to get() without wrapping it into an array.
$endpoint = "example.com";
$client = new Client();
$body = ['where' => ['SKU' => 'A string']];
$headers = [
'X-ABC-Application-Id' => '12345asdfg',
'X-ABC-REST-API-Key' => '12345asdfg'
];
$response = $client->withHeaders($headers)->get($endpoint, $body);
$statusCode = $response->getStatusCode();
$content = $response->getBody();
dd($statusCode,$content,$response);
I have a controller through which I send data to my local environment of the api platform (which is running fine)
/**
* Creates a new Location entity.
*
*/
public function createAction(Request $request)
{
$this->get("suvya_breadcrumbs.factory")->update('New Hub');
$form = $this->createForm(HubType::class);
$form->handleRequest($request);
$new_url = $this->generateUrl('new_hub');
$redirect_url = $this->generateUrl('home');
if ($form->isSubmitted() && $form->isValid()) {
$client = new Client([
'base_uri' => 'http://127.0.0.1:8000',
]);
$response = $client->request('POST', '/hubs', [
'form_params'=> $form->getData(),
'headers' => [
'Accept' => 'application/ld+json',
'Content-Type'=> 'application/json',
'Authorization'=> 'eyJhbGciOiJSUzI1NiJ9.eyJyb2xlcyI6WyJST0xFX1VTRVIiXSwidXNlcm5hbWUiOiJhZG1pbiIsImlhdCI6MTUxNzg3NjE1NCwiZXhwIjoxNTE3ODc5NzU0fQ.gIG9lueJJZxzkOl8qblhHWwiJvW97m4gz1-1mYeM9SgMzMW35Wh6XamOOYiISDN99yJ6Ovo-wKk6whpE5UGMDVw_wGek003Dd6r-Y7Ql3kVLHksn2JFzhAN3GwlXFcOI4MIjmq5qBhkzv21pHymO0yn1SlzWBwb0O7WygywefMu5p09zGuvAiP9I2ShyQLZhjj8bB_odf3dI-Ql0ZbRmn_JDkDoPcm5U11i-3S1oMikBmFq0WtTcWo7vezt3QdA3bY4_bgaISINAiYRR-_cvjpBSqFSE6n1ZYtHvKFn-98wXXsBGxEAoZw6iQL4iRgOI8F_uaiCo0eRHC7q0_xQ_V_W0-5XDIQXWDwoiVaUXnjO6xo2Fldp7PLO1ueJz1e4wiOy2-TunZdc8UCtw2BdFIQtWatPLi_v_rsNvF2H-6hwa9UOKEi9Z4tH4KkuATbXAxxfkCbSOyY1SAWP0riooPQi_AI2J7L2Ly86eAuKo1Hix3EuEogo19GSyBz_cCWczyERQWM9gikuUs8E22SIAdxTl8ZLFaXgiZIibDvb8pqcN8izFjywWbF2CkyWC58WxrVd6Bfmfnm7k9T6oZqwIZ-TQR-SbRnUHN1hpWUjFCk-tHhgvh7osHXmxe3grzA8M3LPBpQGQiTeqBZFMjF4Tx8zW2tuiEn6TwhV14Lj24Vc'
]
]);
die();
}
return $this->render('SuvyaFabricsCloudBundle:Common:basic.html.twig', array(
'form' => $form->createView(),
'page_title'=> 'Hub aanmaken',
'action_path' => $new_url,
'cancel_path'=> $redirect_url,
'submit_button_title' => 'Opslaan',
));
}
But unfortunately i'm getting an error in my dev.log of the api environment:
[2018-02-06 02:32:37] request.INFO: Matched route "api_hubs_post_collection". {"route":"api_hubs_post_collection","route_parameters":{"_controller":"api_platform.action.post_collection","_format":null,"_api_resource_class":"AppBundle\\Entity\\Hub","_api_collection_operation_name":"post","_route":"api_hubs_post_collection"},"request_uri":"http://127.0.0.1:8000/hubs","method":"POST"} []
[2018-02-06 02:32:37] request.CRITICAL: Uncaught PHP Exception Symfony\Component\Serializer\Exception\UnexpectedValueException: "Syntax error" at /Users/myname/Sites/suvyalogistics-api/vendor/symfony/symfony/src/Symfony/Component/Serializer/Encoder/JsonDecode.php line 78 {"exception":"[object] (Symfony\\Component\\Serializer\\Exception\\UnexpectedValueException(code: 0): Syntax error at /Users/myname/Sites/suvyalogistics-api/vendor/symfony/symfony/src/Symfony/Component/Serializer/Encoder/JsonDecode.php:78)"} []
The output of form->getData():
array (size=4)
'postalCode' => string 'sdfdsf' (length=6)
'streetName' => string 'sdfsdf' (length=6)
'doorNumber' => string 'sdfsfd' (length=6)
'city' => string 'sdfsfd' (length=6)
Running the endpoint at the api platform with the same values goes fine as well.
Does anyone of you has an idea why this goes wrong?
You're sending a payload encoded in application/x-www-form-urlencoded (HTML form like) to the API Platform API, while, according to the headers you've set, it excepts data encoded in JSON.
To encode the data of the form in JSON, you can use the following Guzzle snippet:
$client = new Client([
'base_uri' => 'http://127.0.0.1:8000',
]);
$response = $client->request('POST', '/hubs', [
'json' => $form->getData(),
'headers' => [
'Accept' => 'application/ld+json',
'Authorization'=> '...'
]
]);
Alternatively, you can configure API Platform to accept form data, but I would not recommend going this way (it's better to only deal with JSON API-side).
I am trying to make a http post request in laravel as below
$client = new Client(['debug'=>true,'exceptions'=>false]);
$res = $client->request('POST', 'http://www.myservice.com/find_provider.php', [
'form_params' => [
'street'=> 'test',
'apt'=> '',
'zip'=> 'test',
'phone'=> 'test',
]
]);
It return empty response. On debugging ,following exception is occurring
curl_setopt_array(): cannot represent a stream of type Output as a STDIO FILE*
I am using latest version of guzzle.
Any idea how to solve it?.
The request() method is returning a GuzzleHttp\Psr7\Response object.
To get the actual data that is returned by your service you should use:
$data = $res->getBody()->getContents();
Now check what you have in $data and if it corresponds to the expected output.
More information on using Guzzle Reponse object here
I had to do this
$data = $res->getBody()->getContents();<br>
but also change<br>
$client = new \GuzzleHttp\Client(['verify' => false, 'debug' => true]);<br>
to<br>
$client = new \GuzzleHttp\Client(['verify' => false]);
Here is what i did for my SMS api
use Illuminate\Support\Facades\Http; // Use this on top
// Sample Code
$response = Http::asForm()
->withToken(env('SMS_AUTH_TOKEN'))
->withOptions([
'debug' => fopen('php://stderr', 'w') // Update This Line
])
->withHeaders([
'Cache-Control' => 'no-cache',
'Content-Type' => 'application/x-www-form-urlencoded',
])
->post($apiUrl,$request->except('_token'));