碰到NEXMO的发布请求时,我的名字是{“ type”:“ UNAUTHORIZED”,“ error_title”:“未经授权”}

时间:2019-11-06 14:12:09

标签: api automation nexmo

在这种情况下,我要使用NEXMO API来获取报告

import io.restassured.RestAssured;
import io.restassured.http.ContentType;
import io.restassured.response.Response;
import io.restassured.specification.RequestSpecification;
import net.minidev.json.JSONObject;
import org.testng.Assert;
import org.testng.annotations.Test;

import java.io.*;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;

public class POSTRequest {
    @Test
    public void RegistrationSuccessful()
    {
        RestAssured.baseURI ="https://api.nexmo.com";
        RequestSpecification request = RestAssured.given();
// Sending Request Parameters
        JSONObject requestParams = new JSONObject();
        requestParams.put("api_key", "xxxx"); // Cast
        requestParams.put("api_secret", "xxxx");
        requestParams.put("sig", "xxxxxxxxxxxxxxxx");

//Sending Request Body
RequestSpecification APIBOdy =request.body("{\n" +
        "  \"product\": \"SMS\",\n" +
        "  \"start_date\": \"2019-10-26T00:00:00+0000\",\n" +
        "  \"end_date\": \"2019-10-27T00:00:00+0000\",\n" +
        "  \"sms_type\":\"MT\"\n" +
        "}")
.header("Content-Type","application/json");
        APIBOdy.contentType(ContentType.JSON);
        Response response = request.post("/v1/reports/");

//Printing Response on console
        System.out.println(response.getBody().asString());

//Checking Status Code
        int statusCode = response.getStatusCode();
        Assert.assertEquals(statusCode, "201");
        String successCode = response.jsonPath().get("SuccessCode");
        Assert.assertEquals( "Correct Success code was returned", successCode, "OPERATION_SUCCESS");
    }
}

我得到的回应:

{“ type”:“未经授权”,“ error_title”:“未经授权”}

java.lang.AssertionError:预期为[201],但发现为[401] 预期:201 实际:401

即使我在邮递员中以相同的身体和参数命中相同的请求,我也会获得准确的响应。

1 个答案:

答案 0 :(得分:1)

您将要使用v2规范来满足您的报告API需求,因为不支持v1。这将需要更改您的请求正文,并且您的授权方式请参见:https://developer.nexmo.com/api/reports有关详细信息

规范中的一些亮点是api密钥/ api秘密是要通过基本授权以标头形式作为冒号连接对传递给标头的,因此您的Authorization标头将如下所示:

Basic API_KEY:API_SECRET

您当然需要将API_KEY:API_SECRET字符串转换为以64为基数 可以通过从字符串中提取字节并使用Convert.ToBase64String

来完成
var authBytes = Encoding.UTF8.GetBytes(apiKey + ":" + apiSecret);
var authString = Convert.ToBase64String(authBytes)

在您的请求正文中,您还将需要产品,accountId和方向-对于创建报告发布请求,您将不需要任何查询参数。

在V1中,我看不到任何有关如何生成签名的迹象,但您不能同时使用sig或api机密。有关签名生成的更多信息,请参见:https://developer.nexmo.com/concepts/guides/signing-messages

但是实际上,您不应该使用V1,因为它不受支持。

希望这会有所帮助!