Authentication & Authorization REST API

Code:
The method setRequestProperty(String, String) in the type URLConnection is not applicable for the arguments (String, int)
Muss ich dann die Länge wieder in einen String wandeln?
 
Bekomme leider immer noch 411 zurück:


Java:
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
    private static String getKey() {
       try {
            URL url = new URL ("https://sandbox.billwerk.com/oauth/token/");
          
            String str = "5bedc7b26cb54e1f082a4961:586db11e80e0fdd29ec6b75a7645e807";
            // encode data using BASE64
            String encoding = DatatypeConverter.printBase64Binary(str.getBytes());
    
          
            HttpURLConnection connection = (HttpURLConnection) url.openConnection();
            connection.setRequestMethod("POST");
            connection.setDoOutput(true);
            connection.setRequestProperty  ("Authorization", "Basic " + encoding);
            connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
            connection.setRequestProperty("Content-Length", String.valueOf("grant_type=client_credentials".length()));

            InputStream content = (InputStream)connection.getInputStream();
            BufferedReader in   =
                new BufferedReader (new InputStreamReader (content));
            String line;
            while ((line = in.readLine()) != null) {
                System.out.println(line);
            }
          
            return line;
        } catch(Exception e) {
            e.printStackTrace();
        }
       return null;
      
   }
 
Sag mal, liest Du eigentlich, was ich schreibe?

Java:
try(OutputStream os = connection.getOutputStream()) {
    os.write("grant_type=client_credentials".getBytes());
}
vor InputStream content... einfügen.
 
Super, danke - hat nun geklappt
Führe ich jedoch nun dies aus, bekomme ich folgende Fehlermeldung:

Code:
myapp.billwerk.client.ApiException: Unprocessable Entity
 
genau - ich habe den API Key nun eingesetzt, den ich aus meiner getKey() Methode bekommen habe

Java:
    public static void main(String[] args) {
       
//        String key = getKey();
       
        ApiClient defaultClient = Configuration.getDefaultApiClient();
       
        // Configure API key authorization: BearerAuth

        ApiKeyAuth BearerAuth = (ApiKeyAuth) defaultClient.getAuthentication("BearerAuth");
//        BearerAuth.setApiKey("NWJlZGM3YjI2Y2I1NGUxZjA4MmE0OTYxOjU4NmRiMTFlODBlMGZkZDI5ZWM2Yjc1YTc2NDVlODA3");
        BearerAuth.setApiKey("FcayCjNHzZKeNcYEXPBnL1KXo7EKm15sKG0G8MrU7DmSxU0UGXDuTDmB7DnwuiKgVVBVswzWvGccY0LJSH6R3w");
        // Uncomment the following line to set a prefix for the API key, e.g. "Token" (defaults to null)
//        BearerAuth.setApiKeyPrefix("Basic");
        BearerAuth.setApiKeyPrefix("Bearer");

        ContractsApi apiInstance = new ContractsApi();
        String contractId = "1"; // String | Contract ID
       
      
        try {
            ComponentSubscriptionReadDTO result = apiInstance.componentSubscriptionsGetComponentSubscriptionsByContract(contractId);
            System.out.println(result);
        } catch (ApiException e) {
            System.err.println("Exception when calling ContractsApi#componentSubscriptionsGetComponentSubscriptionsByContract");
            e.printStackTrace();
        }
    }
 
Naja, ich denke halt mal, dass die contractId "1" ungültig ist (Sending invalid fields will result in a 422 Unprocessable Entity response.) - In der Referenz schaut das eher nach nach einer 96-Bit-Zahl als 24-Zeichen Hex-String aus.

Ruf doch erstmal die Verträge ab (contractGetList(null, null, null, null, null)).
 
Hast Recht - habe jetzt einfach mal einen Kunden ausgegeben. Hat prima funktioniert.
Vielen Dank für die ganze Hilfe.

Noch eine Frage habe ich:
Muss ich den Key bei jedem API-Request mir holen / erzeugen oder reicht das einmalig und ich speichere den mir als Konstante ab?
 
Unglaublich... du liest dir aber auch gar nichts selber durch oder?

Das Token das du zurück bekommst enthält eine Ablaufzeit.
 
Bist du dir sicher?

Code:
{"access_token":"xtlTVTB5yr4kCaPP16cs3p-UGbJIPOuk2LKpygjN1lhRHMBrS_22222bp2-KLlT7UChdvJAyUmr8NHt2hKUOkd_yDFg==","expires":0,"token_type":"bearer","permissions":{"Roles":["Admin"]}}
-> expires":0
 
ok, danke...

Eine weitere Verständnisfrage habe ich noch:
Ich würde mir gerne eine Liste von Customer ausgeben:
Also theorethisch:

Code:
List<CustomerReadDTO> list = new ArrayList<CustomerReadDTO>();
Das ist meine Methode um alle Customer zu bekommen:

Java:
    /**
     * Find all Customer
     * @throws ApiException
     */
    public ApiResponse<CustomerReadDTO> findAllCustomerLazyLoading(List<ObjectForSearchList> searchList, int startingAt, int maxPerPage,
            String sortField, SortOrder sortOrder, Map<String, Object> filters) throws ApiException {

        CustomersApi apiInstance = new CustomersApi();
        ApiResponse<CustomerReadDTO> result = apiInstance.customersGetListWithHttpInfo(null, null, String.valueOf(startingAt), String.valueOf(maxPerPage), null, null);
 
        return result;
    }
Die Methode kommt durch den REST Client:
Code:
ApiResponse<CustomerReadDTO> de.client.api.CustomersApi.customersGetListWithHttpInfo(String search, String statusFilter, String externalId, String from, Integer skip, Integer take) throws ApiException

Retrieve a list of all customers

Parameters:
search Search customers by External Id, First Name, Last Name, Company Name, Email Address and Debitor Account (optional)
statusFilter filter by status (optional)
externalId TODO (optional)
from cursor from where on the items are listed (optional)
skip If you are using pagination, you can skip n items (optional)
take limit returned items (optional)
Returns:
ApiResponse<CustomerReadDTO>
Throws:
ApiException - If fail to call the API, e.g. server error or cannot deserialize the response body
Unter:
result.getData() -> bekomme ich einen einzelnen Kunden...
Wie bekomme ich aber eine Liste von Kunden (List<CustomerReadDTO> list) ?
 
Das ist eine berechtigte Frage, die Du den Entwickler des Billwerk-Swagger-JSON-Files stellen solltest. Das Modell ist m. E. falsch.
 
Hm ok, dann werde ich hier mal nachfragen....
Nichtsdestotrotz habe ich nun versucht einen Kunden zu erstellen, auch das geht nicht.
Hier bekomme ich folgende Exception:

Code:
de.webserviceexternal.billwerk.client.ApiException: Unprocessable Entity
Java:
    public static void main(String[] args) {
               
        ApiClient defaultClient = Configuration.getDefaultApiClient();
       
        // Configure API key authorization: BearerAuth

        ApiKeyAuth BearerAuth = (ApiKeyAuth) defaultClient.getAuthentication("BearerAuth");
//        BearerAuth.setApiKey("NWJlZGM3YjI2Y2I1NGUxZjA4MmE0OTYxOjU333334NmRiMTFlODBlMGZkZDI5ZWM2Yjc1YTc2NDVlODA3");
        BearerAuth.setApiKey("FcayCjNHzZKeNcYEXPBnL1KXo7EKm15sKG0G8MrU7DmSxU0UGXDuTDmB7DnwuiKgVVBVswzWvGccY0LJSH6R3w");

        BearerAuth.setApiKeyPrefix("Bearer");

        CustomersApi apiInstance = new CustomersApi();
        String customerId = "5be18f9681b1f00a807bbe9d"; // String | Contract ID
       
        AddressDTO address = new AddressDTO();
        address.setAddressLine1("Test");
        address.setAddressLine2("Test");
        address.setCity("Pasadena");
        address.setCountry("CA");
        address.setHouseNumber("145");
        address.setPostalCode("91001");
        address.setState("Test");
        address.setStreet("Test");
       
        CustomerDTO customerDto = new CustomerDTO();
        customerDto.setEmailAddress("[email protected]");
        customerDto.setFirstName("Test");
        customerDto.setLastName("Test");
        customerDto.setCompanyName("Test");
        customerDto.setAddress(address);
        customerDto.setCustomerType(CustomerDTO.CustomerTypeEnum.BUSINESS);
        customerDto.setDebitorAccount("Test");
        customerDto.setDefaultBearerMedium(CustomerDTO.DefaultBearerMediumEnum.EMAIL);
        customerDto.setExternalCustomerId("Test");
        customerDto.setHidden(false);
        customerDto.setLocale("de-DE");
        customerDto.setNotes("Test");
        customerDto.setPhoneNumber("Test");
//        customerDto.setServiceCountry("Test");
        customerDto.setTag("Test");
//        customerDto.setTimeZoneKey("Test");
        customerDto.setVatId("Test");
        customerDto.customerType(CustomerDTO.CustomerTypeEnum.CONSUMER);
   
       
       
        try {
          
            CustomerReadDTO customerReadDTO = apiInstance.customersPostGeneric(customerDto);
           
            System.out.println(customerReadDTO);
        } catch (ApiException e) {
            System.err.println("Exception");
            e.printStackTrace();
        }
    }
 
Hier die Antwort von deren Support bzgl. "alle Kunden" zu bekommen:

rein von der Deklaration deiner Methode würde ich vermuten, dass du einen falschen Rückgabetyp verwendest. Für generierten Fremdcode können wir aber, wie schon gesagt, keinen Support leisten.
Der Endpunkt GET /api/v1/Customers läuft problemlos und liefert eine Liste aller Kunden.
Ist der Support einfach unfähig und die Swagger - Datei ist falsch oder liegt es nun wirklich an mir?
"generierten Fremdcode" -> der Code wurde doch von der Swagger - Datei erzeugt?
 
@beta20 Die Antwort ist m. E. völlig korrekt. Scheinbar hast Du Ihnen die Signatur der generierten Swagger-Methode gezeigt und damit haben sie nichts (bzw. nur am Rande) zu tun.

Allerdings: es geht nicht um den generierten Code, sondern der Fehler ist in ihrer Swagger-Datei.

Dort wird unter #/paths/api/v1/Customers/get/responses/schema als Rückgabe der GET-Operation das Schema "#/definitions/CustomerReadDTO" referenziert. Dieses Schema besteht aus einem einzigen Objekt und genau das ist IMO der Fehler.

Das referenzierte Schema müsste ein Array von CustomerReadDTO-Objekten sein, also etwas wie
Javascript:
{
    "type": "array",
    "items": {
        "$ref": "#/definitions/CustomerReadDTO"
    }
}
Das gilt im übrigen nicht nur für Customers, sondern für alle Objekte.
 
Passende Stellenanzeigen aus deiner Region:

Neue Themen

Oben